Tango 开发指南(9) — 区域学习 API (Java 描述)

配置
加载区域描述
学习模式
二者结合使用
同时使用运动追踪和区域学习
使用 ADF
使用元数据

配置

与区域学习相关的配置有两个:加载区域描述和学习模式。

加载区域描述

要加载 ADF 文件,你必须将 TangoConfig.KEY_STRING_AREADESCRIPTION 设置为要加载的 ADF 文件的 UUID,这样当 TangoService 启动时就会加载对应的 ADF。

try {
    mConfig.putString(TangoConfig.KEY_STRING_AREADESCRIPTION, uuid);
} catch (TangoErrorException e) {
    // handle exception
}

下面的例子演示了如何加载最新保存的 ADF 文件。具体来说是先获取一个 ADF 文件列表,最后一个就是最新的 ADF:

ArrayList<String> fullUUIDList = new ArrayList<String>();
// Returns a list of ADFs with their UUIDs
fullUUIDList = mTango.listAreaDescriptions();

// Load the latest ADF if ADFs are found.
if (fullUUIDList.size() > 0) {
     mConfig.putString(TangoConfig.KEY_STRING_AREADESCRIPTION,
                       fullUUIDList.get(fullUUIDList.size() - 1));
}

学习模式

要使用区域学习功能,TangoConfig.KEY_BOOLEAN_LEARNINGMODE 必须为 true,该项默认为 false:

try {
    TangoConfig mConfig = mTango.getConfig(TangoConfig.CONFIG_TYPE_CURRENT);
    mConfig.putBoolean(TangoConfig.KEY_BOOLEAN_LEARNINGMODE, true);
} catch (TangoErrorException e) {
    // handle exception
}

调用 Tango.saveAreaDescription() 去保存 ADF 文件,注意该操作耗时较长,切勿在 UI 线程中调用。

二者结合使用

上述两种配置项同时使用时,当前会话会创建一个新的 ADF。如果自定位是借助已加载 ADF 实现的,而且此时调用了 Tango.saveAreaDescription() 方法,将会有一个新的 ADF 文件生成,该文件的内容包含当前会话的 ADF 和已被加载的 ADF。

注意:只有借助已加载 ADF 实现的自定位才能完成保存区域描述的操作。更多信息参见 Area Learning Mode 和 Loaded Area Description Files。

同时使用运动追踪和区域学习

通常情况下,同时使用者两项技术和单独使用基本的运动追踪技术很类似。首先需要指定合适的坐标帧对,然后使用回调或时间戳方式去获取 pose 数据。

区域学习有两种坐标帧对。第一种,
(baseFrame,targetFrame)=(TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION, TangoPoseData.COORDINATE_FRAME_DEVICE);通过这种方式获取的是设备相对于区域学习原点的 pose 数据,包括漂移修正。如果加载了 ADF,只有借助 ADF 文件完成自定位之后才能获得 pose 数据,以 ADF 中的原点作为原点。如果开启了学习模式但未加载 ADF 文件,服务初始化完成后就立即能获得 pose 数据,以服务开始的位置为起始点。

第二种,
(baseFrame,targetFrame)=(TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION, TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE);这种方式提供的是在给定时刻区域描述和服务开始位置的偏移。这种方式提供的数据只有当自定位发生时才会有更新。

应用中,应当使用第一种作为运动追踪的帧对,第二种作为发生自定位的标志。

@Override
public void onPoseAvailable(TangoPoseData pose) {

if (pose.baseFrame == TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION
        && pose.targetFrame == TangoPoseData.COORDINATE_FRAME_DEVICE) {
    // Process new ADF to device pose data.
}
else if (pose.baseFrame == TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION
        && pose.targetFrame == TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE) {
    // Process new localization.
}

**

使用 ADF

**

使用元数据

ADF 中有元数据可以使用。元数据包含若干键值对,具体的键名称对参见 TangoAreaDescriptionMetaData。

获取某 uuid 对应的 ADF 中的键名称:

public String getName(String uuid) {

    TangoAreaDescriptionMetaData metadata = new TangoAreaDescriptionMetaData();
    metadata = mTango.loadAreaDescriptionMetaData(uuid);
    byte[] nameBytes = metadata.get(TangoAreaDescriptionMetaData.KEY_NAME);
    if (nameBytes != null) {
        String name = new String(nameBytes);
        return name;
    } // Do something if null
}

为某个 ADF 设置键名称:

public void setName(String name, String uuid) {

    TangoAreaDescriptionMetaData metadata = new TangoAreaDescriptionMetaData();
    metadata = mTango.loadAreaDescriptionMetaData(uuid);
    metadata.set(TangoAreaDescriptionMetaData.KEY_NAME, name.getBytes());
    mTango.saveAreaDescriptionMetadata(uuid, metadata);
}

获取当前所有可用 ADF 的 UUID:

ArrayList<String> mFullUUIDList;
try {
    mFullUUIDList = mTango.listAreaDescriptions();
} catch(TangoErrorException e) {
    // handle the errors
}
if (mFullUUIDList.size() == 0) {
    // handle the fact that there's no ADFs stored
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值