运动服务

移动控制服务提供 API 调用控制设备移动相关的功能,作为移动控制服务访问代理的 LocomotionManager 对象,提供了移动控制服务的主要 API,可通过 RobotContext 对象获取到。

LocomotionManager locomotionManager = aRobotContext.getSystemService(LocomotionManager.SERVICE);

Cruzr 的移动控制服务只提供调用服务功能的 API 接口,由于不同设备的差异问题,接口中的参数本身没有具体单位,本指南中的示例代码及接口说明中所使用的速度单位和距离单位均以 Cruzr 作为参考。

获取设备列表

try {
    LocomotionDevice/* [1] */ locomotionDevice = locomotionManager.getDevice();
} catch (LocomotionDeviceNotFoundException e) {
    e.printStackTrace();
}

[1] LocomotionDevice 移动设备的详细配置参数,具体包括:

属性 getter 说明
LocomotionDevice.id 设备 id
LocomotionDevice.name 设备名称
LocomotionDevice.description 设备描述
LocomotionDevice.minTurningSpeed 最小的转速,1角度/秒
LocomotionDevice.maxTurningSpeed 最大的转速,115角度/秒
LocomotionDevice.defaultTurningSpeed 默认的转速,50角度/秒
LocomotionDevice.minMovingSpeed 最小移动速度,0.1米/秒
LocomotionDevice.maxMovingSpeed 最大移动速度,0.8米/秒
LocomotionDevice.defaultMovingSpeed 默认移动速度,0.4米/秒

控制设备移动

通过配置不同的参数以控制设备完成指定移动或旋转行为。运动控制可以是单一的任务,也可以是多个控制组成的串行任务,以下将逐项介绍。

控制设备朝指定方向移动,结束移动需要用户主动停止。通过以下代码实现:以默认速度向前一直移动

promise /* [1] */ = locomotionManager.moveStraight(0)
    .progress(new ProgressCallback<LocomotionProgress>() {
        @Override
        public void onProgress(LocomotionProgress/* [2] */ locomotionProgress) {
            // 移动过程会有多次回调
        }
    })
    .done(new DoneCallback<Void>() {
        @Override
        public void onDone(Void aVoid) {
            // 移动完成
        }
    })
    .fail(new FailCallback<LocomotionException>() {
        @Override
        public void onFail(LocomotionException e) {
            // 移动失败
        }
    });

[1] 返回执行移动操作的异步对象,通过该对象获取结果以及取消处理过程。具体用法参考 Promise

[2] 异步回调的 LocomotionProgress 对象描述了设备移动的进度信息,具体包括:

常量 说明
LocomotionProgress.PROGRESS_BEGAN 执行开始
LocomotionProgress.PROGRESS_ENDED 执行结束

控制设备以指定速度朝指定方向移动,结束移动需要用户主动停止。通过以下代码实现:以 0.5 米每秒速度向前一直移动

promise = locomotionManager.moveStraight(0, 0.5f);

控制设备朝指定方向移动指定距离。通过以下代码实现:以默认速度向前移动 5 米

promise = locomotionManager.moveStraightBy(0, 5);

控制设备以指定速度朝指定方向移动指定距离。通过以下代码实现:以 0.5 米每秒速度向前移动 5 米

promise = locomotionManager.moveStraightBy(0, 5, 0.5f);

控制设备朝指定方向移动指定距离。通过以下代码实现:在 3 秒内向前移动 5 米

 promise = locomotionManager.moveStraightBy(0, 5, 3000);

控制设备以指定速度旋转,结束旋转需要用户主动停止。通过以下代码实现:以 30 度每秒速度一直旋转

promise = locomotionManager.turn(30);

控制设备朝指定方向旋转,结束旋转需要用户主动停止。通过以下代码实现:以默认速度逆时针一直旋转

 promise = locomotionManager.turn(false);

控制设备旋转指定角度。通过以下代码实现:以默认速度旋转 15 度

promise = locomotionManager.turnBy(15);

控制设备以指定速度旋转指定角度。通过以下代码实现:以 30 度每秒速度旋转 15 度

promise = locomotionManager.turnBy(15, 30f);

控制设备在指定时间内旋转指定角度。通过以下代码实现:在 1 秒内旋转 15 度

promise = locomotionManager.turnBy(15, 1000);

通过配置运动参数,执行指定行为。通过以下代码实现:在 5 秒内向前移动 5 米并以默认速度旋转 15 度

LocomotionOption/* [1] */ option = new LocomotionOption.Builder()
    .setDuration(5000)
    .setMovingAngle(0)
    .setMovingDistance(5)
    .setTurningAngle(15)
    .build();

locomotionManager.locomote(option);

[1] LocomotionOption 对象通过 LocomotionOption.Builder 构建,构建参数说明如下:

方法 类型 说明 默认值
Builder.constructor() 无参构造
Builder.setMovingAngle(moveAngle) float 移动角度 0
Builder.setMovingSpeed(moveSpeed) float 移动速度 0
Builder.setMovingDistance(distance) float 移动距离 0
Builder.setTurningAngle(turnAngle) float 旋转角度 0
Builder.setTurningSpeed(turnSpeed) float 旋转速度 0
Builder.setTurningAxis(axis) int 旋转轴长 0
Builder.setDuration(duration) long 执行时间(单位:毫秒) 0
Builder.setEmergency(emergency) boolean 是否支持急停 true

执行一个串行运动控制任务。通过以下代码实现:以 0.5 米每秒速度朝 15 度方向移动 5 米,然后以 30 度每秒速度旋转 20 度

LocomotionOption option1 = new LocomotionOption.Builder()
    .setMovingSpeed(0.5f)
    .setMovingAngle(15)
    .setMovingDistance(5)
    .build();
LocomotionOption option2 = new LocomotionOption.Builder()
    .setTurningSpeed(30)
    .setTurningAngle(20)
    .build();

ArrayList<LocomotionOption> optionSeries = new ArrayList<>();
optionSeries.add(option1);
optionSeries.add(option2);

locomotionManager.locomoteSerially(optionSeries);

查询舵机移动状态,返回 true 表示设备处于运动状态。

locomotionManager.isLocomoting();

关于locomotionManager.moveStraightBy方法,angle的参数值,克鲁泽1S目前仅支持传入0或者180,分别代表的是前进和后退,请勿使用其他数值。

监听设备移动

监听设备运动状态变化

LocomotionListener locomotionListener = new LocomotionListener() {
    @Override
    public void onLocomotionChanged(LocomotionProgress/* [1] */ locomotionProgress) {
        // 设备运动状态发生变化时会运行至此
    }
};

locomotionManager.registerListener(locomotionListener);

[1] 设备运动进度信息,请参考 LocomotionProgress

取消监听设备运动状态变化

locomotionManager.unregisterListener(locomotionListener);