Tango API 之四 --什么是Tango pose

来源:互联网 发布:重庆知秋凤凰怎么样 编辑:程序博客网 时间:2024/05/06 07:21

Tango API 之四 –什么是Tango pose

当您的设备在3D空间中移动时,它将以每秒100次的速度计算出它的位置(位置)以及旋转角(方位)。 这种位置及旋转角的组合称为设备的姿态。 姿态是运动跟踪,面积学习或深度感知的基础。

为了计算姿态,必须选择基准参考系和目标参考系,它们可以使不同的坐标系统。你可以视姿态为将要转换的点经过平移、旋转从目标坐标系转换到基础坐标系中。

以下是一个C语言表示的的Tango姿态结构体:

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

一个姿态的两个关键组成是:

  • 目标坐标系相对于基础坐标系的旋转向量4个元素
  • 目标坐标系相对于基础坐标系的平移向量

实际的姿态结构包含一些其他字段,例如时间戳和帧对的副本,如下所示。

Pose数据

你可以通过一下方式请求数据:

请求方式1:

使用TangoService_getPoseAtTime()方法获取。返回的pose数据为最接近给定时间戳的、从基本坐标系到目标坐标系的pose数据。以下是C API版的代码:

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

TangoCoordinateFramePair结构体封装了基本坐标系与目标坐标系。

Note:如果你创建了一个增强现实的app,推荐使用 TangoService_getPoseAtTime() 或 TangoSupport_getPoseAtTime(),除了对姿势进行轮询之外,还允许您将姿势时间戳与视频帧对齐。

下面的代码用于获取与服务开始帧相关连的设备帧的姿态:

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:

当pose更新处于可用状态时,接收pose更新。为此,请将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 seconds  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;

Pose状态

TangoPoseData包含一个状态信息,是一个TangoPoseStatusType枚举类型,这个枚举提供了关于pose估计系统的状态。TangoPoseStatusType可利用的成员有:

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

INITIALIZING:运动跟踪系统正在启动,不应使用Pose数据。

VALID:系统认为返回的姿态是有效的,可以使用。

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

UNKNOWN:系统处于未知状态。

pose状态的生命周期

TANGO_POSE_INITIALIZING状态代码表示Tango框架正在初始化,姿态数据尚不可用。 如果您正在使用回调,则在框架初始化时,您将只收到一个姿态更新,状态码设置为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() 时才会接收更新。

pose状态的使用

您的应用程序应该对在姿势数据中返回的状态做出反应。 例如,等到您感兴趣的姿势数据在您的应用程序中开始交互之前变为有效。 如果姿势变得无效,则暂停交互直到系统恢复。 取决于您的应用程序,系统恢复后所做的操作将有所不同。 如果您单独使用运动追踪,则可以简单地恢复您的应用程序。 如果您正在使用区域学习或ADF,请指导您的用户移动,直到设备可以本地化。

原创粉丝点击