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

原文链接:https://developers.google.com/tango/apis/java/java-area-learning

配置

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

加载区域描述

要加载 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 ModeLoaded Area Description Files

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

In general, using motion tracking with area learning is very similar to basic motion tracking. You need to define the coordinate pairs you are interested in, then use either callbacks or polling to get data.

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

以下是原文

Configuration

There are two configuration options that are relevant to area learning.

Loading area descriptions

To load an area description file, your TangoConfig must have KEY_STRING_AREADESCRIPTION set to the UUID of the ADF you wish to load. When the TangoService starts, it loads this area description.

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

Here is an example of how you could load the latest saved area description file. It retrieves a list of all area description files and takes the last one in the list, which would be the most recent:

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));
}

Learning mode

In order to use area learning, your TangoConfig must have KEY_BOOLEAN_LEARNINGMODE set to true. In the default TangoConfig, KEY_BOOLEAN_LEARNINGMODE is set to false.

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

You can save an ADF by calling Tango.saveAreaDescription(). This call can be long-running, so don’t call it on the UI thread.

Learning mode with a loaded area description

If both options are used, an area description of the current session will be built. If localization occurs against the loaded ADF and Tango.saveAreaDescription() is called, a new ADF will be saved containing the combination of both.

Note: You cannot save an area description in this way until you have localized against the loaded ADF. See Area Learning Mode and Loaded Area Description Files for more information.

Motion tracking with area learning

In general, using motion tracking with area learning is very similar to basic motion tracking. You need to define the coordinate pairs you are interested in, then use either callbacks or polling to get data.

There are two coordinate frame pairs for area learning. The TangoCoordinateFramePair with baseFrame == TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION and targetFrame == TangoPoseData.COORDINATE_FRAME_DEVICE gets you the pose of the device from the area description’s origin, including drift corrections. If an ADF was loaded, pose data is only available after you have localized to the ADF and the origin will be the same as the ADF. If learning mode enabled without loading an ADF, pose data will be available immediately after initialization and the origin will be the same as the start of service.

The frame pair with baseFrame == TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION and targetFrame == TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE provides the offset between the area description and start of service at the requested time. This pair updates only when a localization occurs.

Applications should use TangoPoseData.COORDINATE_FRAME_DEVICE with respect to TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION for tracking a device’s motion, and use TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE with respect to TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION only as a localization signal.

@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.
}

Working with ADFs

Using metadata

ADFs have metadata you can use, so you don’t have to work with UUID alone. The metadata consists of key-value pairs; for a list of supported keys see the constant values for TangoAreaDescriptionMetaData.

Get the name field for the ADF identified by uuid:

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
}

Set the name field to name, for the ADF identified by uuid:

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);
}

Listing all the UUIDs of currently accessible ADFs:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值