Tango-poses

2016-11-25  本文已影响58人  半闲书屋半闲人

什么是探戈体式?

当你的移动设备在3D空间,它计算它在哪里(位置),以及它如何旋转(方向)高达每秒100次。该组合计算的单个实例被称为设备的姿势。与运动跟踪,区学习,或深度知觉时姿势是一个重要的概念。

为了计算姿势,你必须选择的基础和目标的参考帧 ,这可能会使用不同的坐标系。可以查看姿势以从对象帧变换顶点到基架所需的平移和旋转。

下面是一个简化版本探戈构成结构 中的C:

struct PoseData {
    double orientation[4];
    double translation[3];
}

一个姿势的两个关键组成部分是:

定义相对于所述底座上的目标帧的转动四元数。
一个3D矢量定义目标框的翻译相对于该基架。
一个实际的姿态结构包含其它领域,如时间戳和框架对的复印件,你会看到下面。

注:此页面中的示例使用C API,但函数调用和数据结构是用于Java相似。在团结,有哪些处理很多这些细节为你预制件。
姿势数据

您可以通过两种方式来请求姿势数据:

请求方法#1

轮询使用姿势TangoService_getPoseAtTime()。这将返回最接近给定的时间戳从基座到目标帧的姿势。下面是C API在这个函数的代码:

TangoErrorType TangoService_getPoseAtTime(
    double timestamp,
     TangoCoordinateFramePair frame_pair,
     TangoPoseData* pose);

该TangoCoordinateFramePair 结构规定基准帧和目标帧。

注意:如果你正在增强现实应用程序,我们建议您使用TangoService_getPoseAtTime()或TangoSupport_getPoseAtTime() ,因为除了轮询姿势,它们允许你与视频帧对齐姿势时间戳。
以下代码获取相对于该启动OF-服务帧的装置框架的姿势:

TangoPoseData pose_start_service_T_device;
TangoCoordinateFramePair frame_pair;
frame_pair.base = TANGO_COORDINATE_FRAME_START_OF_SERVICE;
frame_pair.target = TANGO_COORDINATE_FRAME_DEVICE;
TangoService_getPoseAtTime(
    timestamp,
    frame_pair,
    &pose_start_service_T_device);

在本实施例,包括在姿势变量名的基础和目标帧的名称使名称更具描述:

TangoPoseData pose_start_service_T_device;

请求方法#2

接收姿势更新,因为他们成为可用。要做到这一点,附加一个onPoseAvailable()回调 TangoService_connectOnPoseAvailable()。该样本是从我们 hello_motion_tracking 示例项目,可以在找到 tango_handler.cc文件:

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::ConnectTango, connectOnPoseAvailable error.");
  std::exit(EXIT_SUCCESS);

在这两种情况下,您会收到一个TangoPoseData结构:

typedef struct TangoPoseData {
  int version;
  double timestamp;                // In milliseconds
  double orientation[4];           // As a quaternion
  double translation[3];           // In meters
  TangoPoseStatusType status_code;
  TangoCoordinateFramePair frame;
  int confidence;                  // Currently unused
  float accuracy;                  // Currently unused
} TangoPoseData;

姿势状态

TangoPoseData包含的状态下,由表示 TangoPoseStatusType 枚举,它提供了关于姿态估计系统的状态的信息。可用的TangoPoseStatusType成员有:

typedef enum {
  TANGO_POSE_INITIALIZING = 0,
  TANGO_POSE_VALID,
  TANGO_POSE_INVALID,
  TANGO_POSE_UNKNOWN
} TangoPoseStatusType;

INITIALIZING:运动跟踪系统或者启动或从无效状态中恢复,并且不应当被使用的姿态数据。

VALID:系统认为正在返回的姿势是有效的,并应使用。

INVALID:系统遇到某种困难,所以姿势估计都可能不正确。

UNKNOWN:系统处于未知状态。

姿势状态的生命周期

pose-lifecycle.png

图1:探戈姿势数据生命周期
该TANGO_POSE_INITIALIZING状态代码表示探戈框架初始化和姿态数据尚未公布。如果您在使用回调,您将收到只有一个姿势更新设置状态码 TANGO_POSE_INITIALIZING,而框架正在初始化。

初始化完成后,姿势都在TANGO_POSE_VALID状态。如果您在使用回调,你会那样频繁,因为他们都可以接收更新。

如果系统遇到的困难,并进入TANGO_POSE_INVALID状态,恢复初始化过程取决于您的配置。如果 config_enable_auto_recovery被设置为True,系统立即复位运动跟踪系统,并进入TANGO_POSE_INITIALIZING状态。如果 config_enable_auto_recovery设置为False,造成数据保持在 TANGO_POSE_INVALID一个国家,没有更新,直到收到你打电话 TangoService_resetMotionTracking()。

使用姿势状态

您的应用程序应该将状态正在作出反应的姿态数据中返回。例如,等到你有兴趣成为你的应用程序开始之前,互动的有效数据姿势。如果姿态变为无效,暂停交互,直至系统恢复后。根据您的应用程序,您系统后做什么恢复会有所不同。如果你只使用运动跟踪,你可以简单地恢复你的应用程序。如果您在使用区域学习还是ADF的,指导用户走动,直到设备可以本地化本身。

上一篇下一篇

猜你喜欢

热点阅读