跳到内容 跳到主导航 跳到页脚

导航

介绍

导航指机器人的行走能力,机器人可以从A点行动至B点,行走过程中可以自动规划路线,可以有效避开障碍物。

机器人导航所使用的传感器比较多,包括底部激光雷达,RGBD,头部IR传感器(部分机型)等,所以在导航中请不要遮挡这些传感器,以免出现机器人不走,路径规划失败等问题。

机器人能执行导航动作的前提是:机器人已新建地图,并且在该地图上已经定位成功,雷达处于开启状态,请一定要注意这一点!

导航到指定位置

方法名称:startNavigation 结果回调:

ActionListener navigationListener = new ActionListener() {    
        @Override
        public void onResult(int status, String response) throws RemoteException {
            switch (status) {
                case Definition.RESULT_OK:
                    if ("true".equals(response)) {
                        //导航成功
                    } else {
                        //导航失败
                    }
                    break;
               case Definition.ACTION_RESPONSE_STOP_SUCCESS://取消导航任务成功
                    break;
            }
        }    
        @Override public void onError(int errorCode, String errorString) throws RemoteException     {         
            switch (errorCode) {             
                case Definition.ERROR_NOT_ESTIMATE:              //当前未定位              
                    break;              
                case Definition.ERROR_IN_DESTINATION:              //当前机器人已经在目的地范围内              
                    break;              
                case Definition.ERROR_DESTINATION_NOT_EXIST:              //导航目的地不存在              
                    break;              
                case Definition.ERROR_DESTINATION_CAN_NOT_ARRAIVE://避障超时,目的地不能到达,超时时间通过参数设置              
                    break;              
                case Definition.ACTION_RESPONSE_ALREADY_RUN:           //当前接口已经调用,请先停止,才能再次调用                                                                          
                    break;              
                case Definition.ACTION_RESPONSE_REQUEST_RES_ERROR://已经有需要控制底盘的接口调用,请先停止,才能继续调用              
                    break;          
            }      
        }

        @Override      
        public void onStatusUpdate(int status, String data, String extraData) {                                 
            switch (status) {               
                case Definition.STATUS_NAVI_AVOID:               //当前路线已经被障碍物堵死               
                    break;                           
                case Definition.STATUS_NAVI_AVOID_END:               //障碍物已移除               
                    break;         
            }      
        }
}

调用方式:

  1. 默认导航速度
RobotApi.getInstance().startNavigation(reqId, destName, coordinateDeviation, time, navigationListener);

2.默认导航速度,指定避障距离(如果此值设置为 0,机器人默认会使用默认值 0.75)<***该调用方式在V10版本开始支持>***

RobotApi.getInstance().startNavigation(reqId, destName, coordinateDeviation, obsDistance, time, navigationListener);

3.指定导航速度 <***该调用方式在V4.12版本开始支持>***

RobotApi.getInstance().startNavigation(reqId, destName, coordinateDeviation, time, linearSpeed, angularSpeed, navigationListener);

4.指定导航速度 ,指定避障距离(如果此值设置为 0,机器人默认会使用默认值 0.75)<***该调用方式在V10版本开始支持>***

RobotApi.getInstance().startNavigation(reqId, destName, coordinateDeviation, obsDistance, time, linearSpeed, angularSpeed, navigationListener);

5.指定坐标点 <***该调用方式在V4.12版本开始支持>***

RobotApi.getInstance().startNavigation(reqId, pose, coordinateDeviation, time, navigationListener);

6.指定坐标点 ,指定避障距离(如果此值设置为 0,机器人默认会使用默认值 0.75)<***该调用方式在V10版本开始支持>***

RobotApi.getInstance().startNavigation(reqId, pose, coordinateDeviation, obsDistance, time, navigationListener);

7. 指定导航加速度 <***该调用方式在V4.12版本开始支持>***(此接口暂时仅支持招财豹)

RobotApi.getInstance().startNavigation(reqId, destName, coordinateDeviation, time, linearSpeed, angularSpeed, isAdjustAngle, destinationRange, wheelOverCurrentRetryCount, multipleWaitTime, priority, linearAcceleration, angularAcceleration, navigationListener);

参数:

  • destName:导航目的地名称(必须先通过setLocation设置)
  • pose:导航目的地坐标点
  • obsDistance:最大避障距离,距离目标的障碍物小于该值时,机器人停止,取值大于 0,默认 0.75,单位米。
  • coordinateDeviation:目的地范围,如果距离目的地在该范围内,则认为已到达,建议设置为0.2,单位为米。
  • time:避障超时时间,如果该时间内机器人的移动距离不超过0.1m,则导航失败,单位毫秒,建议30*1000
  • linearSpeed:导航线速度,范围:0.1 ~ 0.85 m/s 默认值:0.7 m/s
  • angularSpeed:导航角速度,范围:0.4 ~ 1.4 m/s 默认值:1.2 m/s 最终导航速度是结合线速度和角速度换算后得到,不同的线速度和角速度对导航运动方式有影响,建议线速度和角速度保持一定规律:angularSpeed = 0.4 + (linearSpeed – 0.1) / 3 * 4
  • isAdjustAngle:是否适应导航结束时朝向的角度。如传false,则归正到点位设置时的角度
  • destinationRange:目标点无法到达时,距离目标点多少距离即认为导航成功
  • wheelOverCurrentRetryCount:导航过程中轮子堵转尝试次数
  • multipleWaitTime:导航过程中如遇多机等待
  • priority:默认取 0 即可,取值范围0~30,值越大优先级越高;一般用于多个机器人在导航时候避让使用
  • linearAcceleration:导航线加速度,范围:0.4 ~ 0.8 m/s2 默认值:0.7 m/s2
  • angularAcceleration:导航角加速度,范围:0.4 ~ 0.9 m/s2 默认值:0.8 m/s2 最终导航角加速度速度是通过线速度
  • 换算后得到,不同的线加速度和角加速度对导航运动方式有影响,建议线加速度和角加速度保持一定规律:angularAcceleration= (linearSpeed / 0.8)

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:调用该接口前需要确保已定位

停止导航到指定位置

方法名称:stopNavigation 调用方式:

RobotApi.getInstance().stopNavigation(reqId);

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:该接口只能用于停止startNavigation启动的导航

导航到指定坐标点

注意:该方法已经废弃,建议使用startNavigation,goPosition接口不再做维护

方法名称:goPosition 结果回调:

CommandListener goPositionListener = new CommandListener() {
    @Override
    public void onResult(int status, String response) {
        switch (status) {
            case Definition.RESULT_OK:
                if ("true".equals(response)) {
                    //导航成功
                } else {
                    //导航失败
                }
                break;
        }
    }
    @Override
    public void onError(int errorCode, String errorString) throws RemoteException {
        switch (errorCode) {
            case Definition.ACTION_RESPONSE_ALREADY_RUN:
                //当前接口已经调用,请先停止,才能再次调用
                break;
            case Definition.ACTION_RESPONSE_REQUEST_RES_ERROR:
                //已经有需要控制底盘的接口调用,请先停止,才能继续调用
                break;
        }
    }
    @Override public void onStatusUpdate(int status, String data) {
        switch (status) {
            case Definition.STATUS_NAVI_AVOID:
            //当前路线已经被障碍物堵死
            break;
            case Definition.STATUS_NAVI_AVOID_END:
            //障碍物已移除
            break;
        }
    }
}

调用方式:

  1. 默认速度
try {
    JSONObject position = new JSONObject();
    //x坐标
    position.put(Definition.JSON_NAVI_POSITION_X, x);
    //y坐标
    position.put(Definition.JSON_NAVI_POSITION_Y, y);
    //z坐标
    position.put(Definition.JSON_NAVI_POSITION_THETA, theta);
    RobotApi.getInstance().goPosition(reqId, position.toString(), goPositionListener);
} catch (JSONException e) {
    e.printStackTrace();
}

2.指定速度*<***该调用方式在V4.12版本开始支持>****

try {
    JSONObject position = new JSONObject();
    //x坐标
    position.put(Definition.JSON_NAVI_POSITION_X, x);
    //y坐标
    position.put(Definition.JSON_NAVI_POSITION_Y, y);
    //z坐标
    position.put(Definition.JSON_NAVI_POSITION_THETA, theta);
    RobotApi.getInstance().goPosition(reqId, position.toString(),  linearSpeed, angularSpeed, goPositionListener);
} catch (JSONException e) {
    e.printStackTrace();
}

参数

  • position:参数为json格式的坐标点 { “x”: “x坐标”, “y”: “y坐标”, “theta: “z坐标”, }
  • linearSpeed:导航线速度,范围:0.1 ~ 0.85 m/s 默认值:0.7 m/s
  • angularSpeed:导航角速度,范围:0.4 ~ 1.4 m/s 默认值:1.2 m/s 最终导航速度是结合线速度和角速度换算后得到,不同的线速度和角速度对导航运动方式有影响,建议线速度和角速度保持一定规律:angularSpeed = 0.4 + (linearSpeed – 0.1) / 3 * 4

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:调用该接口前需要确保已定位

停止导航到指定坐标点

方法名称:stopGoPosition 调用方式:

RobotApi.getInstance().stopGoPosition(reqId);

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:goPosition 与 startNavigation 两个启动导航的接口,都有一个对应的停止接口,必须一一对应,不能混用

转向目标点方向

方法名称:resumeSpecialPlaceTheta

方法说明:该接口只会左右转动到目标点方位,不会实际运动到目标点。

调用方式:

RobotApi.getInstance().resumeSpecialPlaceTheta(reqId,
    placeName,
    new CommandListener() {
        @Override
        public void onResponse(int result, String message) {
        }
  });

参数

  • reqId: int类型 命令id
  • placeName: String类型 目标点名称
  • listener: CommandListener类型 消息回调

返回值

  • int result 0 命令执行 / -1 没有执行

适用平台:

豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

注意:调用该接口前需要确保已定位

计算巡线模式下,两点之间的距离

使用这个API可以获取到两点之间的距离(仅用于计算在巡线模式下,巡线路径上的两个点之间的距离)

方法名称:getNaviPathInfo

方法说明:用于计算在巡线模式下,巡线路径上的两个点之间的距离。传入的点位信息可以是巡线路径上的任意点,可通过获取点位的API来获取地图上标定的点位的信息。

调用方法:

//起点和终点都必须在巡线路经上,机器人开启巡线模式
Pose startPos = new Pose();
startPos.setX(-0.22329703f);
startPos.setY(1.1073834f);
startPos.setTheta(-1.2297891f);
Pose endPos = new Pose();
endPos.setX(0.09533833f);
endPos.setY(-0.7406802f);
endPos.setTheta(-2.886187f);
//使用这个API获取路径长度,单位米
RobotApi.getInstance().getNaviPathInfo(reqID,
    startPos,
    endPos,
    new CommandListener() {
        @Override
        public void onResult(int status, String response, String extraData) {
            try {
                JSONObject json = new JSONObject(response);
                double pathLength = json.getDouble("pathLength");
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onError(int errorCode, String errorString, String extraData) {
            Log.d('OnError',errorCode);
        }
    });
豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

状态和错误码定义

导航系列API中可能出现的状态和错误码对照表

//============================================================
导航状态定义
STATUS_START_NAVIGATION = 1014; //开始导航
STATUS_START_CRUISE = 1015; //开始巡航
STATUS_NAVI_AVOID = 1018; //开始避障
STATUS_NAVI_AVOID_END = 1019; //避障结束
STATUS_NAVI_OUT_MAP = 1020; //走出地图
STATUS_NAVI_MULTI_ROBOT_WAITING = 1034; //多机调度等待
STATUS_NAVI_MULTI_ROBOT_WAITING_END = 1035; //多机调度等待结束
STATUS_NAVI_GO_STRAIGHT = 1036; //开始直行
STATUS_NAVI_TURN_LEFT = 1037; //开始左转弯
STATUS_NAVI_TURN_RIGHT = 1038; //开始右转弯
STATUS_NAVI_GLOBAL_PATH_FAILED = 1025; //路径规划失败,导航失败,需要处理报错
//============================================================
导航错误码定义
ERROR_DESTINATION_NOT_EXIST = -108; //目的地不存在
ERROR_DESTINATION_CAN_NOT_ARRAIVE = -109; //避障超时,目的地不可达
ERROR_IN_DESTINATION = -113; //当前已在目的地周围
ERROR_NOT_ESTIMATE = -116; //当前未定位
ERROR_MULTI_ROBOT_WAITING_TIMEOUT = -125; //多机调度等待超时
ERROR_NAVIGATION_FAILED = -120; //导航因其它原因失败,兜底失败
ACTION_RESPONSE_ALREADY_RUN = -1; //当前接口已经调用,请先停止,才能再次调用
ACTION_RESPONSE_REQUEST_RES_ERROR = -6; //已经有需要控制底盘的接口调用,请先停止,才能继续调用
//============================================================

设置机器人加速减速模式

开发招财豹时,可对机器人加速和刹车加速度进行全局设置,以适应当前的业务需求。设置方法如下:

1、在APP中添加如下权限

<uses-permission android:name="com.ainirobot.coreservice.robotSettingProvider" />

2、在代码中使用这个方法来更改设置

public class NavigationSettings {
    //value "1" - "3"  1柔和 2正常 3急迫
    public static final String ROBOT_SETTING_NAVIGATION_BREAK_MODE_LEVEL = "robot_setting_navigation_break_mode_level";
    //value "1" - "3" 1柔和 2正常 3急迫
    public static final String ROBOT_SETTING_NAVIGATION_START_MODE_LEVEL = "robot_setting_navigation_start_mode_level";
    public NavigationSettings(){
    }
    public void setBreakModeLevel(int i){
        i = i > 3 ? 3 : Math.max(i, 1);
        putString(ROBOT_SETTING_NAVIGATION_BREAK_MODE_LEVEL,""+i);
    }
    public void setStartModeLevel(int i){
        i = i > 3 ? 3 : Math.max(i, 1);
        putString(ROBOT_SETTING_NAVIGATION_START_MODE_LEVEL,""+i);
    }
    private void  putString(String key ,String value) {
        if(value == ""){
            return;
        }
        try {
            sendSettingBroadcast(key, value);
            //Settings.Global.putString(mContext.getContentResolver(), key, value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void sendSettingBroadcast(String key,String value) {
        RobotSettingApi.getInstance().setRobotString(key,value);
    }
}
豹小秘豹小秘2mini招财豹招财豹Pro豹小秘DP

这篇文章是否有帮助?

1