这个页面描述了Java API如何处理移动跟踪。
生命周期
正常的运动跟踪系统生命周期由三个状态组成:
TangoPoseData.POSE_INITIALIZING, TangoPoseData.POSE_VALID, TangoPoseData.POSE_INVALID。在POSE_INITIALIZING 状态,系统还未准备好,无法提供pose数据。在 POSE_VALID 状态,系统正常运作。在 POSE_INVALID 状态,系统认为它的估算是无效的,需要重新初始化。第四种状态,POSE_UNKNOWN,适用于其他所有情况。
如果pose数据变成 POSE_INVALID,运动追踪系统可以通过两种方式重新初始化。如果 config_enable_auto_recovery 设置为 true,系统会立即进入 POSE_INITIALIZING 状态。恢复后,使用最后一个有效的pose作为起始点。如果 TangoConfig.KEY_BOOLEAN_AUTORECOVERY 设置为false,系统会暂停并且一直返回 POSE_INVALID Tango.resetMotionTracking() 方法被调用。与自动恢复不同,会在恢复到原点后重新设置起始点。
生命周期状态被记录在TangoPoseData对象的状态代码中。
要了解更多信息,尽管页面是基于C API的,请参阅我们的Device Pose概念页面。
配置
为了使用移动追踪,您的 TangoConfig 必须将 KEY_BOOLEAN_MOTIONTRACKING 设置为true。如果您使用默认的TangoConfig作为起点,那么它已经被设置为true。
你还可以选择设置 KEY_BOOLEAN_AUTORECOVERY。在TangoConfig中,默认设为true。查看这个参数的行为的生命周期部分。
获取 pose 数据
基本运动跟踪有两种坐标框架:一种是设备相对服务开始,一种是设备相对前一个pose。服务开始,是设备的pose相对于移动追踪系统初始化时的位置。在回调和轮询表单中都可以接收到pose数据。前一个pose,这个设备的pose相对于上一个位置。pose数据只能通过回调获取。
基于回调
如果您使用的是基于回调的方法,那么您必须定义您感兴趣的坐标框架对,并构造您的 onPoseAvailable() 回调。
您还需要实现 onXyzIjAvailable 和 onTangoEvent方法,因为 Tango.OnTangoUpdateListener 接口需要实现这三个方法。
private void setTangoListeners() {
final ArrayList framePairs = new ArrayList();
framePairs.add(new TangoCoordinateFramePair(
TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE,
TangoPoseData.COORDINATE_FRAME_DEVICE));
// Listen for new Tango data
mTango.connectListener(framePairs, new OnTangoUpdateListener() {
@Override
public void onPoseAvailable(final TangoPoseData pose) {
// Process pose data from device with respect to start of service
}
@Override
public void onXyzIjAvailable(TangoXyzIjData arg0) {
// We need this callback even if we don't use it
}
@Override
public void onTangoEvent(final TangoEvent event) {
// This callback also has to be here
}
});
}
基于轮询
在基于轮询的方法中,您必须首先指定您感兴趣的坐标框架对。对于简单的运动跟踪来说,一直都是TangoPoseData.COORDINATE_FRAME_DEVICE 关于 TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE。
// Define what motion is requested.
TangoCoordinateFramePair frames_of_reference;
frames_of_reference.baseFrame = TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE;
frames_of_reference.targetFrame = TangoPoseData.COORDINATE_FRAME_DEVICE;
然后根据需要调用 Tango.getPoseAtTime()方法。在下面的例子中,时间戳被设置为0.0来获得最新的pose。如果指定一个特定的时间戳,系统将在那个时间返回一个插值的pose。时间戳是相对于设备引导的。
new Thread(new Runnable() {
final int pollingUpdatePeriodMilliseconds = 66;
@Override
public void run() {
while (true) {
try {
Thread.sleep(pollingUpdatePeriodMilliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
final TangoPoseData queryPoseStartDevice =
mTango.getPoseAtTime(0.0, frames_of_reference);
} catch (TangoErrorException e) {
e.printStackTrace();
}
}
}
}).start();