使用设备跟踪器创建驱动程序

本指南为正在使用Vuforia Driver API在自定义硬件上启用Vuforia引擎的OEM(原始设备制造商)提供信息。

本文档重点介绍硬件,其中包括位置设备跟踪器以及图像(最好是RGB)相机。集成设备跟踪器并提供带自定义驱动程序的帧内摄像头,将允许Engine准确显示与被跟踪对象相关的AR内容。此外,设备跟踪器的设备姿态对于区域目标的运行是必要的,如果没有设备姿态,则模型目标跟踪稳定性会显著降低。请参阅创建摄影机驱动程序如果您正在寻找仅限摄像头的驱动程序API。

前提条件

为了与Vuforia Engine集成,我们要求设备能够提供以下数据并满足以下要求:

  1. 为计算机视觉处理提供支持格式之一(YUYV、NV12、NV21)的图像相机的帧。
  2. 摄像机校准(内部)通过驱动程序逐帧提供给Vuforia Engine。如果相机的焦距变化较大(如显微镜),则需要进行每帧校准。请参见摄像机校准了解详细信息。
  3. 使用6自由度(6自由度)设备跟踪器,并在捕获帧时为每个帧提供相机的6自由度位置。
  4. 测试设备跟踪器;如果没有Vuforia Engine,该设备应该能够在环境中的某个位置增加对象,并在用户移动设备时使其保持静止。

眼镜

作为眼镜合作的第一步,制造商应填写我们的合作关系从这里开始这将与PTC Vuforia就新耳机的支持展开讨论。

此外,对于眼镜:

  1. 为了在增强功能和现实世界之间获得良好的配准,我们建议该设备具有每个用户的校准和眼动仪。
    注意:没有6DOF跟踪器的透视眼镜可能难以保持放大镜的精确对准。

开发驱动程序入门

查看我们关于驱动程序框架开始吧。驱动程序框架文档解释了应用程序如何配置Vuforia Engine以加载定制的驱动程序,并将其用于Engine CV功能。

集成概述

Vuforia驱动程序是一个库(.所以.dll文件)Vuforia引擎库用于访问非标准数据源。应用程序包中必须同时包含Vuforia Driver和VuforiaEngine库。下图对此进行了说明:

Vuforia Engine分析摄像机帧以检测Vuforia-supported目标,并从外部位置设备跟踪器中获取位置信息,从而将其准确放置在跟踪器的世界坐标系中。

除了相机帧和6DOF位置信息外,还需要支持创建跟踪锚,以允许Vuforia Engine将要精确跟踪的重要位置通知6DOF定位设备跟踪器,以便在跟踪器地图更新时进行适当调整。

眼镜集成细节

下一个图表说明了我们推荐的将Vuforia与带有透视显示的眼镜设备集成的方法。该设备已经有一个6DOF位置设备跟踪器和一个针对低延迟优化的显示系统,包括某种形式的头部姿势预测。

蓝色内环表示设备提供的低延迟跟踪和渲染路径。绿色外环代表Vuforia集成。Vuforia驱动程序向VuforiaEngine提供姿势和图像,然后VuforianEngine在设备的世界坐标系中报告对象姿势。由于设备已经以低延迟从其世界坐标系渲染,因此相对于Vuforia检测到的对象渲染的增强将显示与设备提供的视觉稳定性相同的视觉稳定性。

集成详细信息

从Vuforia驱动程序发送数据

要将姿势和相机帧传递到Vuforia Driver,我们要求先传递姿势,然后立即传递相机帧,两者的时间戳值完全相同(以纳秒为单位)。

注意:如果没有设备姿态,引擎中的区域目标将无法工作,模型目标跟踪稳定性将显著降低。

Vuforia Driver摄像头API旨在简单映射到大多数底层摄像头API。Vuforia Engine可以支持多种图像格式的帧;然而,我们强烈建议Driver实现获得YUV格式的相机帧,以传递给Vuforia Engine。除了图像数据外,驾驶员还应为每个帧提供校准的摄像机内部信息。如果相机支持自动对焦或光学图像稳定功能,则必须根据每个帧调整内部结构,以最大程度地提高对准精度。

6DOF设备跟踪器必须提供设备相对于(真实)世界中固定位置的当前位置。我们假设6DOF设备跟踪器提供了一个姿势,将设备跟踪仪世界坐标系中的3D点转换为捕获帧的相机坐标系。每个摄影机帧提供的姿势表示捕捉摄影机帧时的位置。

因此,请确保您提供的姿势将点从世界映射到摄影机坐标,而不是映射到其他设备坐标系。例如,默认情况下,某些设备跟踪器提供从世界到IMU设备坐标的姿势。在这种情况下,在将IMU到摄影机的变换传递给Driver API之前,应将其应用于每个姿势。

在计算从Vuforia Driver传递的姿势时,应确保:

  1. 姿势表示摄影机在世界上的位置和旋转。
  2. 姿势定义为旋转和平移,在旋转后应用平移。
  3. 世界坐标系和相机坐标系是右手坐标系(RH)。

摄像机坐标系以计算机视觉(CV)约定(x-right,y-down,z-away)表示,如下所示。

注意:一些Vuforia引擎观测者,如区域目标,预计y轴是重力对齐的。区域目标期望重力矢量与设备跟踪器世界坐标系的负y轴对齐。

例子

我们提供了一个从设备跟踪器转换姿势以满足Vuforia Engine要求的步骤示例。

设备跟踪器在其坐标系中提供相机的6自由度姿势。需要按照以下步骤变换姿势。我们使用以下符号:Tracker world to camera=Tc_w(_w)和Tracker摄影机到世界=两(_c)

如果6DOF跟踪器提供的姿势为两(_c)在典型的x向右、y向上、z向坐标系约定中,您需要将其反转为两(_c)并将相机坐标系旋转到CV约定,如下所示:

  1. 取跟踪器姿态矩阵的逆矩阵两(_c)转换为相机坐标系Tc_w(_w).
  2. 创建一个围绕x轴旋转180度的旋转矩阵r。
  3. 按以下顺序乘以矩阵:r*Tc_w(_w).
  4. 将生成的矩阵发送给Vuforia Driver。

重要注释

如果在驱动程序中声明了姿势功能,但没有发送姿势,Vuforia引擎会将相机帧保留在内存中,几秒钟后设备将耗尽内存。如果您的内存使用和增长很快,请检查您的驱动程序代码,并确保每个相机帧前面都有一个具有相同时间戳的设备姿势。

实现锚API

每当外部位置设备跟踪器提供锚支持时,我们建议Vuforia Engine使用此功能。Vuforia Driver Anchor API是External Positional Device Tracker API的一部分,允许VuforiaEngine使用Anchor,前提是是否支持锚定API已实现并返回true。当支持锚点时,驱动程序应实现创建和删除锚点的方法,并在添加、删除或更新由外部位置设备跟踪器管理的锚点时使用回调API将其回调到引擎。每个锚点由唯一的Id和锚点在世界坐标系中的姿势组成。

Vuforia发动机的输出

Vuforia Engine报告结果VuState(虚拟状态)对象。当驱动程序通过外部位置设备跟踪器API提供姿势时,对象和设备位置报告为设备跟踪仪坐标系的变换。如果未提供姿势,对象和设备位置将报告为Vuforia世界坐标系的变换。

注意:Vuforia设备跟踪器观测器报告的姿势与传递给驾驶员的输入不同。输出使用相同的右手空间模型,但相机坐标系为x-right、y-up和z-toose。观察者世界坐标系与驾驶员输入相同。如下所示:

对于渲染,我们假设设备渲染到位置设备跟踪器坐标系中,以基于当前设备位置定位场景摄影机。

单位特定信息

将Vuforia Engine Unity Package与外部设备跟踪器一起使用时,您需要考虑主摄像头将定位。在手机或平板电脑的Vuforia应用程序中主摄像头通常由Vuforia定位。这可以是:

  1. 相对于检测到的对象,或,
  2. 相对于设备跟踪器的原点。

在带有自己的6DOF位置设备跟踪器的定制硬件上,我们希望主摄像头将由OEM提供的机制定位。在这种情况下,Vuforia不应尝试定位主摄像头.使用第三方透视眼镜允许您禁用Vuforia更新:

公共类预初始化器:MonoBehaviour{虚空觉醒(){Vuforia配置。实例。设备跟踪器。UseThirdPartySeethroughEyewear=true;VuforiaRuntime。实例。InitVuforia();}}

使用此配置时,请启用延迟初始化。还应确保在Vuforia配置如下:

ARCamera游戏对象设置世界中心模式在中Vuforia行为组件到设备:

当与Unity集成时,我们建议第一步是使用设备的6DOF设备跟踪姿势获得Unity应用程序,以在空间中定位静态立方体对象。您应该注意到,当设备在环境中移动时,立方体保持在同一位置。

工作完成后,继续添加Vuforia行为 行为组件添加到摄影机装备,并尝试在场景中放置Vuforia图像目标,并将简单的增强作为图像目标游戏对象。当检测到图像目标并且内容仍然锁定到目标时,您应该会看到增强。