配置
加载区域描述
学习模式
二者结合使用
同时使用运动追踪和区域学习
使用 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
}