美文网首页
Tango-poses

Tango-poses

作者: 半闲书屋半闲人 | 来源:发表于2016-11-25 11:44 被阅读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的,指导用户走动,直到设备可以本地化本身。

    相关文章

      网友评论

          本文标题:Tango-poses

          本文链接:https://www.haomeiwen.com/subject/lygipttx.html