java 运动_在Java中的运动跟踪

这个页面描述了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();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值