当我们描述某样东西(比如 Tango 设备)的位置和方向时,说清楚你使用的参考帧是很重要的。
下面举个例子来帮助理解参考帧:比如“玛丽站在三米远的地方”并不能真正说明她的位置。如果你想确定她的位置,你首先得解决这个问题“离谁三英尺远?”。如果你说“玛丽站在离自由女神像入口前面三英尺的地方”,那就能够确定了,因为你在用自由女神像入作为参考帧,然后给出了相对于参考帧的距离和方向。
但是,玛丽并不是 3D 空间中一个简单的点,即她还有方向,相对于参考帧的方向。换句话,和其他 3D 物体一样,玛丽面朝某个方向。确定玛丽的位置和方向(这两种数据的集合叫 pose)的完整表述是“玛丽站在离自由女神像入口前面三英尺的地方,面朝自由女神像”。现在完整的表述里面有了关于方向的信息,如果玛丽向右转了,你可以说“玛丽现在旋转了90度”。这是描述方向的另一种表述。
现实生活如此,Tango 设备是什么样呢?运动追踪功能运行时,设备会报告它相对于参考帧的 pose(位置和方向)数据,参考帧固定于 3D 空间。例如,设备会说“相对于我开始运动追踪功能的地方,我往前进了三英尺,升高了一英尺,向右 30 度”。这样,设备就告诉你了足够的确定它位置的信息:相对于起始位置,向前三英尺,向上一英尺。除此之外还告诉你了方向信息:相对于起始位置,向右旋转了 30 度。
要使用运动追踪功能,你必须做到如下几点:
选择基础帧,这是你测量的参考点。如上所述,这是一个固定于 3D 空间的位置,比如自由女神像。举例:COORDINATE_FRAME_START_OF_SERVICE。
选择目标帧,这是你测量的目标点。对于运动追踪,目标值通常是 COORDINATE_FRAME_DEVICE,表示设备在 3D 空间移动时某个时刻的 pose。当设备移动时,目标帧的 pose 跟着改变,最大频率是 100 次/秒,但是基础帧是不变的。pose 数据流就构成了运动追踪的轨迹。
相对于基础帧的目标帧的 pose 这一量化指标回答了这个问题“相对于参考帧,设备的位置和分析怎么描述?”。
下面的章节,我们会讨论在运动追踪中使用的服务开始帧(start-of-service frame),区域描述帧(area description frame)和设备 pose 帧。对于某些应用,可能需要选择合适的帧对,才能做到精确对齐来自设备某部件的数据源。稍后我们会讨论这些帧对的类型。
关于用于参考帧的坐标系的展示,请参考坐标系转换。
坐标帧对
Tango 提供了若干帧对用于运动追踪:
目标帧
COORDINATE_FRAME_DEVICE
COORDINATE_FRAME_DEVICE
COORDINATE_FRAME_START_OF_SERVICE
基础帧
COORDINATE_FRAME_START_OF_SERVICE
COORDINATE_FRAME_AREA_DESCRIPTION
COORDINATE_FRAME_AREA_DESCRIPTION
我们来看一个常见的应用案例:
问题:你的应用在一个完全虚拟的环境中控制照相机。你需要的是设备相对于服务开启时的原始位置的 pose 数据。
方案:目标帧选 COORDINATE_FRAME_DEVICE,基础帧选 COORDINATE_FRAME_START_OF_SERVICE。
下面是我们在 demo 工程 cpp_hello_motion_tracking_example 例子中使用的帧对:
TangoCoordinateFramePair pair;
pair.base = TANGO_COORDINATE_FRAME_START_OF_SERVICE;
pair.target = TANGO_COORDINATE_FRAME_DEVICE;
if (TangoService_connectOnPoseAvailable(1, &pair, onPoseAvailable) !=
TANGO_SUCCESS) {
LOGE("TangoHandler::OnResume, connectOnPoseAvailable error.");
std::exit(EXIT_SUCCESS);
}
我们来详细的看下每一个帧对。
目标帧 COORDINATE_FRAME_DEVICE
基础帧 COORDINATE_FRAME_START_OF_SERVICE
这个帧对提供的是设备相对于运动追踪服务首次初始化成功时的 pose 数据。这种模式将从服务开启时持续记录设备的运动轨迹。运动追踪服务还能检测自身是否出现故障。在发生故障的时间段,系统会上报 INVALID 类型的 pose 数据。此时如果调用了 TangoService_resetMotionTracking() 方法或 服务配置中开启了 auto-reset 选项,系统将尝试重新初始化该服务。重新初始化成功后,系统将努力恢复最近一次可用的 pose 数据,and pick up where it left off。关于该问题的更多信息,请查看 pose 状态的生命周期。该帧对不包括漂移修正和定位。如果你的应用不使用漂移修正或定位,你可以关闭区域学习模式以及不装载 ADF,以此 lower processing requirements。
目标帧 COORDINATE_FRAME_DEVICE
基础帧 COORDINATE_FRAME_AREA_DESCRIPTION
该针对提供相对于装载的区域描述的 pose,且包括漂移修正。该模式需要开启区域学习模式或装载预先创建好的 ADF 文件。如果你开启了区域学习模式但是未装载 ADF,区域描述基础帧将会被初始化为服务开启帧。如果你装载了 ADF,不管你有没有开启区域学习模式,区域描述基础帧都将是存在 ADF 中起始地点,而且只有当设备定位(localize)后才会拿到 pose 数据。根据配置的不同,这种模式并不总是可用的。更多信息,请查看使用区域学习模式和装载 ADF。如果你想在 COORDINATE_FRAME_DEVICE & COORDINATE_FRAME_AREA_DESCRIPTION帧对变成VALID状态之前使用,可以临时使用 COORDINATE_FRAME_START_OF_SERVICE 作为基础帧。