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

来源:互联网 发布:linux新手基础知识总结 编辑:程序博客网 时间:2024/06/16 23:33

配置
加载区域描述
学习模式
二者结合使用
同时使用运动追踪和区域学习
使用 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 UUIDsfullUUIDList = 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);这种方式提供的是在给定时刻区域描述和服务开始位置的偏移。这种方式提供的数据只有当自定位发生时才会有更新。

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

@Overridepublic 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 0
原创粉丝点击