什么是探戈体式?
当你的移动设备在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:系统处于未知状态。
姿势状态的生命周期
图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的,指导用户走动,直到设备可以本地化本身。