5.5.3 导航(选装)
导航模块提供路径规划与自主导航接口,支持机器人在已知地图中执行点到点导航任务,并支持暂停、恢复、停止等任务控制操作。
重要
本处为选装组件, 如需使用本页面所述功能接口, 请联系售后技术支持
导航任务话题
话题名称 |
数据类型 |
描述 |
QoS |
频率 |
|---|---|---|---|---|
|
|
发布导航任务请求(开始/暂停/恢复/停止) |
|
用户发送(按需) |
|
|
导航任务执行结果反馈 |
|
事件驱动(任务状态变化时) |
|
|
任务引擎状态(主状态、子状态、SLAM 状态、导览/领航任务状态) |
|
1Hz |
前置条件
使用导航功能前,需确保以下条件就绪:
已完成重定位:机器人已在地图中完成定位(通过
start_relocalization:<map_id>指令触发,详见 SLAM)已设置当前工作地图:导航请求中的
map_id需与重定位所用的地图 ID 一致(重定位流程会自动加载目标地图并建立定位;若导航时指定其他map_id,PNC 会加载该地图数据但定位坐标系仍停留在重定位地图上,导致导航异常)。map_id必须为有效已建图的地图 ID运动控制模式为稳定站立(
STAND_DEFAULT)或走跑(LOCOMOTION_DEFAULT):机器人需处于可接收走跑指令的模式,否则导航任务将被阻断。稳定站立与走跑模式为一体化设计,导航下发的速度指令会驱动二者内部自动切换(详见 运动模式切换)
PncTaskRequestros2-msg @ task_engine/msg/PncTaskRequest.msg# 导航任务请求 # 话题名称: /aima/te/pnc_task_request MessageHeader header uint8 task_type # 任务类型,见枚举定义 TASK_TYPE uint8 task_request # 任务请求,见枚举定义 TASK_REQUEST uint8 pnc_mode # PNC 模式(0: NORMAL,开启避障;1: NO_PERCEPTION,关闭避障) uint64 task_id # 任务 ID,暂停/恢复/停止时需与开始时保持一致 uint64 map_id # 地图 ID geometry_msgs/PoseStamped target_pose # 目标位姿 geometry_msgs/Pose2D[] reference_line # 指引线(仅考虑 x, y),target_pose 设置为目标姿态(yaw) float64 target_pose_radius # 目标范围半径(单位:m),最小有效值 0.25 float32 max_forward_speed # 最大运行速度(单位:m/s,默认 0.8) geometry_msgs/Pose2D[] trajectory_pos # (预留)群控参数 geometry_msgs/Twist[] trajectory_vel # (预留)群控参数 uint64 play_timestamp # (预留)群控参数 uint64 time_duration # (预留)群控参数 # 64 byte 保留字段 char[64] reserve_info
task_type可用值(TASK_TYPE枚举定义):枚举名
数值
说明
TASK_TYPE_PLANNING_NAVI_TO_POSE_2D2
规划导航至二维位姿
其他枚举值仅供内部使用。
task_request可用值(TASK_REQUEST枚举定义):枚举名
数值
说明
TASK_REQUEST_NONE0
无请求
TASK_REQUEST_START1
开始导航任务
TASK_REQUEST_STOP2
停止导航,任务状态清除
TASK_REQUEST_PAUSE3
暂停导航,机器人原地停止,状态保留
TASK_REQUEST_RESUME4
恢复已暂停的导航任务
TASK_REQUEST_STATUS_INQUIRY5
查询当前任务状态
接口说明
开始导航
设置目标位姿、地图 ID、避障模式和速度,发起导航任务。
PncTaskRequest.task_type = TASK_TYPE_PLANNING_NAVI_TO_POSE_2D
PncTaskRequest.task_request = TASK_REQUEST_START
PncTaskRequest.task_id = xxx // 任务 ID(毫秒时间戳)
PncTaskRequest.map_id = xxxx // 实际所用地图 ID
PncTaskRequest.pnc_mode = 0 // 0: NORMAL(开启避障),1: NO_PERCEPTION(关闭避障)
PncTaskRequest.max_forward_speed = 0.5 // 最大前进速度(m/s)
PncTaskRequest.target_pose = ... // 目标点位姿
PncTaskRequest.target_pose_radius = 0.5 // 到点精度控制(m)
暂停导航
暂停当前导航任务,机器人原地停止,任务状态保留。
PncTaskRequest.task_type = TASK_TYPE_PLANNING_NAVI_TO_POSE_2D
PncTaskRequest.task_request = TASK_REQUEST_PAUSE
PncTaskRequest.task_id = xxx // 与开始导航时一致的任务 ID
恢复导航
恢复已暂停的导航任务,机器人继续执行之前的导航目标。
PncTaskRequest.task_type = TASK_TYPE_PLANNING_NAVI_TO_POSE_2D
PncTaskRequest.task_request = TASK_REQUEST_RESUME
PncTaskRequest.task_id = xxx // 与开始导航时一致的任务 ID
停止导航
停止当前导航任务,任务状态清除。
PncTaskRequest.task_type = TASK_TYPE_PLANNING_NAVI_TO_POSE_2D
PncTaskRequest.task_request = TASK_REQUEST_STOP
PncTaskRequest.task_id = xxx // 与开始导航时一致的任务 ID
提醒:
map_id是用户必填字段(获取方式见 地图标识与坐标的获取),暂停/恢复/停止时task_id需与开始导航时保持一致。
获取导航任务执行结果
订阅 /aima/pnc/pnc_task_response 话题,获取导航任务的执行结果。该话题仅在任务状态变化时发布一次(如 RUNNING/FAILED/FINISHED/PAUSED)。
PncTaskResponseros2-msg @ task_engine/msg/PncTaskResponse.msg# 导航任务执行结果 # 话题名称: /aima/pnc/pnc_task_response MessageHeader header uint8 task_type # 任务类型,见枚举定义 TASK_TYPE uint64 task_id # 任务 ID(同请求时的 task_id) uint64 map_id # 地图 ID uint8 task_status # 任务状态,见枚举定义 TASK_STATUS # 64 byte 保留字段 char[64] reserve_info
task_status可用值(TASK_STATUS枚举定义):枚举名
数值
说明
TASK_STATUS_UNKONW0
未知状态
TASK_STATUS_RUNNING1
任务执行中
TASK_STATUS_FAILED2
任务失败
TASK_STATUS_PAUSED3
任务已暂停
TASK_STATUS_FINISHED4
任务已完成
TASK_STATUS_RECOVERY_TIMEOUT22
恢复超时
其他状态
10-31
详见
PncTaskResponse.msg定义
警告
导航任务可能被自动中断
当机器人检测到严重系统故障时(如摔倒、系统故障等),导航任务可能被自动中断。机器人会播放 TTS 语音提示:“抱歉,检测到系统存在故障,不能进行自主导航任务了。请前往客户端查看故障原因。”
如需程序化获知导航任务是否被中断,可通过以下方式:
订阅
/aima/pnc/pnc_task_response话题,观察task_status是否变为FAILED订阅
/task_master/state话题,观察main_state是否从PILOT变为IDLE
获取任务引擎状态
订阅 /task_master/state 话题,获取任务引擎的整体状态。该话题为周期发布,持续更新任务引擎的状态机状态。
TaskMasterStateros2-msg @ task_engine/msg/TaskMasterState.msg# 任务引擎状态 # 话题名称: /task_master/state uint8 main_state # 主状态,见枚举定义 TM_MAIN_STATE uint8 sub_state # 子状态,见枚举定义 TM_SUB_STATE uint8 slam_state # SLAM 状态,见枚举定义 SLAM_STATE uint64 loc_map_id # 当前定位地图 ID(仅 slam_state=LOCALIZATION 时有效) string loc_map_name # 当前定位地图名称(仅 slam_state=LOCALIZATION 时有效) FixLineIntroState fix_line_intro_state # 导览任务状态(仅 main_state=FIX_LINE_INTRO 时有效) PilotState pilot_state # 领航任务状态(仅 main_state=PILOT 时有效) # 保留信息 string reserve_info
main_state可用值(TM_MAIN_STATE枚举定义):枚举名
数值
说明
TM_MAIN_STATE_IDLE0
空闲状态
TM_MAIN_STATE_RELOCALIZATION1
重定位中
TM_MAIN_STATE_MAPPING2
建图中
TM_MAIN_STATE_FIX_LINE_INTRO3
导览任务执行中
TM_MAIN_STATE_RECORDING_PATH4
录制路径中
TM_MAIN_STATE_PILOT5
领航任务执行中
sub_state可用值(TM_SUB_STATE枚举定义):枚举名
数值
说明
TM_SUB_STATE_NONE0
无子状态
TM_SUB_STATE_RESUME1
长程任务运行中
TM_SUB_STATE_PAUSE2
长程任务暂停中
slam_state可用值(SLAM_STATE枚举定义):枚举名
数值
说明
SLAM_STATE_IDLE0
SLAM 空闲
SLAM_STATE_RELOCALIZATION1
SLAM 重定位中
SLAM_STATE_MAPPING2
SLAM 建图中
SLAM_STATE_LOCALIZATION3
SLAM 定位中
FixLineIntroStateros2-msg @ task_engine/msg/FixLineIntroState.msg# 导览任务状态 uint8 fix_line_intro_state # 导览任务状态,见枚举定义 TM_FIX_LINE_INTRO_STATE uint64 set_task_id # 用户预设置任务的 ID(若未设置过则为 0) string set_task_name # 用户预设置任务的别名(若未设置过则为空) string task_name # 任务别名 uint64 task_id # 任务 ID(创建任务时生成) string map_name # 地图别名(仅任务依赖地图时有效) uint64 map_id # 地图 ID(创建地图时生成) uint32 rest_site_number # 剩余讲解点数量(不包含当前讲解点) uint64 cur_target_id # 当前目标点位 ID
fix_line_intro_state可用值(TM_FIX_LINE_INTRO_STATE枚举定义):枚举名
数值
说明
TM_FIX_LINE_INTRO_STATE_NAVI_TO_NEXT_SITE0
导航到下一个讲解点
TM_FIX_LINE_INTRO_STATE_SITE_ACTIONS1
执行当前讲解点动作
TM_FIX_LINE_INTRO_STATE_NAVI_RETURN2
导航返回待机点
TM_FIX_LINE_INTRO_STATE_NAVI_TO_TARGET_POI3
导航到目标 POI
TM_FIX_LINE_INTRO_STATE_POI_ACTIONS4
执行 POI 动作
TM_FIX_LINE_INTRO_STATE_STANDBY_ACTIONS5
待机动作
PilotStateros2-msg @ task_engine/msg/PilotState.msg# 领航任务状态 uint8 pilot_state # 领航任务状态,见枚举定义 TM_PILOT_STATE string target_name # 目标点别名(导航至 POI 时为 POI 别名,导航至讲解点时为讲解点别名) uint64 target_id # 目标点 ID string intro_task_name # 讲解任务别名(仅导航至讲解任务创建的讲解点时有效) uint64 intro_task_id # 讲解任务 ID string map_name # 地图别名(仅任务依赖地图时有效) uint64 map_id # 地图 ID(创建地图时生成)
pilot_state可用值(TM_PILOT_STATE枚举定义):枚举名
数值
说明
TM_PILOT_STATE_NAVI_TO_TARGET0
导航到目标点
TM_PILOT_STATE_TARGET_ACTIONS1
执行目标点动作
TM_PILOT_STATE_NAVI_RETURN2
导航返回
TM_PILOT_STATE_STANDBY_ACTIONS3
待机动作
编程示例
详细的编程示例和代码说明请参考:
小心
ROS的服务(service)机制在跨板通信时存在一些待优化问题, 二次开发时请参考例程添加异常处理、快速重试等保护机制
机器人处于稳定站立 / 走跑模式时, 请勿批量快速启动 ROS 节点(建议不超过 2 个/秒), 短时间内大量节点参与 DDS 发现会造成通信拥塞、影响运控实时性, 存在机器人失稳摔倒风险