Tango API 之四 --什么是Tango pose

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,请指导您的用户移动,直到设备可以本地化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值