Tango API 之四 --什么是Tango pose
2017-12-01 17:57
302 查看
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,请指导您的用户移动,直到设备可以本地化。相关文章推荐
- 希望Revit2014或更高版提供什么API?(调查于2012年6月1日截止)
- API 是什么文件
- slf4j-api、slf4j-log4j12以及log4j之间什么关系?
- 【API设计风格—RESTful】:什么是RESTful(一)
- 什么是程序的API?
- 什么是api
- 什么是好的API设计?
- 什么是Java集合API?
- 什么是 Tango 姿势?
- 什么是Api
- slf4j-api、slf4j-log4j12以及log4j之间什么关系
- api侵入是什么
- 什么是api
- 到底什么才是好的API设计?
- API 是什么
- 什么是程序的API?
- api 与html网址有什么不同
- Tango 开发指南 — 区域学习 API (Java 描述)
- 什么是WIN32 API
- 什么是Tango事件