Tango API之六 参考系

Tango API之六 参考系

在描述某些东西(例如Tango设备)的位置和方向时,需要指明您正在使用的基本参考系。

为了帮助理解参考坐标系,请考虑以下几点:比如说“Mary站在三英尺之外”并不能确定她的位置。 如果你想知道Mary的位置,你还必须解决“距离三英尺的问题”。 如果你说“Mary站在自由女神像的入口前三英尺”,你现在可以确定玛丽的位置,因为你使用自由女神像作为你的参照系,你可以测量Mary相对于雕像的距离和方向。

但Mary不仅仅是一个在三维空间中的一个点位置,她也有一个方向,这是根据相对于参考系的某种类型的旋转来描述的。 换句话说,Mary像所有的3D物体一样,面向某个方向。 玛丽在三维空间中的位置和方向(我们称这个组合为姿势)的完整描述将是这样的:“Mary站在自由女神像的入口前三英尺,并面对着它。 现在你已经提供了她的方向信息。 如果玛丽转向右边,你可以说:“她现在远离雕像的方向旋转90度” 这是另一种方向的描述。

那么所有这些与Tango设备有什么关系呢? 为了执行运动跟踪,设备报告其相对于其选择的参考系(其在3D空间中固定)的姿态(位置和方向)。 例如,该设备可能会说:“从我开始进行运动跟踪的地方,我现在前三英尺,向上一英尺,我已经向右旋转了30度。 通过这样做,设备已经使用有意义的方向告诉您其位置:从原始起始位置向前3英尺,向上1英尺。 它还告诉你方向的变化:相对于其起始位置向右旋转30度。

为了使设备能够进行运动跟踪,你必须按一下来做:

  1. 选择一个基本坐标系,即你的测量起点。正如上面所说,它在三维空间中是固定的,像前面提到的自由女神像。比如: COORDINATE_FRAME_START_OF_SERVICE坐标系。
  2. 选择目标坐标系,即你将要测量的东西。 对于运动跟踪,通常为COORDINATE_FRAME_DEVICE,它表示在3D空间中移动时,在任何特定时刻的设备姿态。 目标框架的姿势随着您的设备移动而改变,并且相对于基本框架(从不改变)来测量,每秒最多100次。 这个不断的测量流创建你的运动轨迹。

在任何给定的瞬间,目标框架相对于基础框架的姿态的数值测量回答了这样的问题:“设备相对于其基准参考系的位置和方向是什么?”

在下一节中,我们讨论运动跟踪的start-of-service参考系,区域描述参考系和设备姿态参考系对的使用。 对于某些应用程序,您可能需要选择一个参考系对,使您能够从设备组件精确对齐数据源。 我们稍后在本主题中讨论这些类型的参考系对。

要详细了解用于参照系的坐标系,请参阅坐标系转换

运动跟踪坐标系统

Tango提供了多种运动跟踪时使用的参考坐标系对:

让我们思考一下使用案例:

目标:您的应用程序在完全虚拟的环境中控制相机。 您希望设备始终计算与Tango服务启动时的位置相关的姿势。

解决方案:对于目标坐标系,请选择COORDINATE_FRAME_DEVICE。 对于基准坐标系,请选择COORDINATE_FRAME_START_OF_SERVICE。

以下是我们的示例项目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);
   }

这个坐标系对提供了设备相对Tango服务首次初始化成功的姿势。 自服务开始以来,该模式累积设备的移动。 该服务还可以检测是否有运动跟踪失败。 此时,系统报告一个无效的姿势。 如果在服务中调用了TangoService_resetMotionTracking()或启用了自动重置,系统将尝试重新初始化跟踪。 在成功的重新初始化之后,它尽最大努力尝试恢复设备相对于开始服务坐标系的最后已知的良好姿态并回复到现在停留的位置。 有关更多信息,请参阅姿势状态的生命周期。 该坐标系不包括漂移校正或定位。 如果您的应用程序不使用漂移校正或本地化,则可以通过禁用区域学习模式而不加载ADF来降低处理要求。

该坐标系对提供相对于加载区域描述的原点的设备姿态,包括更正。 它要求打开区域学习模式或者加载先前创建的ADF。 如果在不加载ADF的情况下打开学习模式,则区域描述基准框架的原点最初与服务启动相同。 如果您使用或不使用学习模式加载ADF,则区域描述基准框架的原点是存储在ADF中的原点,只有在设备已经本地化后才会接收数据。 根据您的配置设置,这种模式并不总是可用的。 有关更多信息,请参阅使用学习模式和加载的区域描述文件。 如果您在COORDINATE_FRAME_DEVICE到COORDINATE_FRAME_AREA_DESCRIPTION坐标系对变为有效之前使用运动跟踪,则可以在此期间使用COORDINATE_FRAME_START_OF_SERVICE作为基本坐标系。

注意:漂移校正和本地化事件引起姿势跳跃。 为避免这些跳转,请使用COORDINATE_FRAME_START_OF_SERVICE基本框架驱动应用程序中的面向用户的元素,并使用COORDINATE_FRAME_START_OF_SERVICE将CODEINATE_FRAME_AREA_DESCRIPTION更新回调合并ADF驱动的更正中。

对于使用COORDINATE_FRAME_DEVICE作为目标坐标系时,可以以设备支持的姿态估计速率进行更新。

该坐标系对仅在发生本地化事件或漂移校正时才提供更新。 这要求打开区域学习模式或者加载先前创建的ADF。 如果加载了ADF,则区域描述基准框架的原点是存储在ADF中的原点。 这将设备的姿态调整与增量的坐标系到坐标系运动隔离,使您可以决定何时以及如何将姿态调整纳入应用程序,以最大限度地减少对用户体验的干扰。

组件对齐坐标系

某些应用程序需要对齐多个数据源,例如来自颜色和深度相机的数据。 您可以COORDINATE_FRAME_IMU为基本坐标系与这些场景中的其中一个目标组件坐标系配对:

  1. 您需要在不知道特定设备布局的情况下查询各个组件到IMU坐标系的相对偏移量。
  2. 您希望渲染相机的虚拟图像与显示屏的中心对齐

结合数据上的运动跟踪坐标系和时间戳,这些偏移量可以让您更全面地了解各种传感器输入在空间和时间信息。 这对于将多个数据源对齐和合并在一起是非常必要的。

由于设备设计为刚性连接,因此这些偏移不会改变,API不会更新这些值。 但是,不同设备设备组件间隔不同。 Tango API目前不支持更新外部参数。 这些值由一次性工厂校准或制造商的机械设计文件生成。 对外部参数要求非常严格的应用应该考虑终端用户自己来标定。

COORDINATE_FRAME_IMU基本坐标系为设备中的所有内部组件提供了一个公共参考点。这个基本参考系的起点不一定对应于任何一个特定的组件,并且可能在设备之间不同。与其他Android传感器一样,设备坐标系的轴与制造商定义的设备的自然(默认)方向一致。设备的制造商定义的自然方向可能与您的应用程序的预期方向不匹配。为了最大程度的兼容性,请不要假设Tango兼容设备的自然方向是横向或纵向。而是使用Android getRotation()方法确定屏幕旋转,然后使用Android remapCoordinateSystem()方法将传感器坐标映射到屏幕坐标。有关传感器的更多一般信息,请参阅传感器坐标系统上的Android文档。有关设备定位问题的更详细的讨论,请参阅此Android开发者博客帖子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值