导航
介绍
导航指机器人的行走能力,机器人可以从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; } } }
调用方式:
- 默认导航速度
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)
适用平台:
豹小秘 | 豹小秘2 | mini | 招财豹 | 招财豹Pro | 豹小秘DP |
是 | 是 | 是 | 是 | 是 | 否 |
注意:调用该接口前需要确保已定位
停止导航到指定位置
方法名称:stopNavigation 调用方式:
RobotApi.getInstance().stopNavigation(reqId);
适用平台:
豹小秘 | 豹小秘2 | mini | 招财豹 | 招财豹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; } } }
调用方式:
- 默认速度
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
适用平台:
豹小秘 | 豹小秘2 | mini | 招财豹 | 招财豹Pro | 豹小秘DP |
是 | 是 | 是 | 是 | 是 | 否 |
注意:调用该接口前需要确保已定位
停止导航到指定坐标点
方法名称:stopGoPosition 调用方式:
RobotApi.getInstance().stopGoPosition(reqId);
适用平台:
豹小秘 | 豹小秘2 | mini | 招财豹 | 招财豹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 没有执行
适用平台:
豹小秘 | 豹小秘2 | mini | 招财豹 | 招财豹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); } });
豹小秘 | 豹小秘2 | mini | 招财豹 | 招财豹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); } }
豹小秘 | 豹小秘2 | mini | 招财豹 | 招财豹Pro | 豹小秘DP |
否 | 否 | 否 | 是 | 是 | 否 |