1. 矿山巡检机器人ROS2导航系统概述
矿山巡检机器人要在井下巷道、皮带机走廊、变电硐室、水泵房等区域自主完成仪表读数、红外测温、气体检测与异常上报任务。与室内服务机器人相比,矿山环境对导航系统提出了更苛刻的约束:巷道狭长且宽度常在1.5~3 m之间,存在弯道、岔口、斜坡与低矮顶板;光照条件差,粉尘与水雾会削弱激光雷达回波;井下无GPS信号,必须依赖激光雷达、IMU与轮式里程计进行多传感器融合定位;同时巷道内常有矿车、人员与临时堆料,地图会随采掘推进而动态变化。这些特点决定了导航系统不能只追求"能走",而要同时满足定位稳定、避障可靠、路径可复现与故障可诊断四项要求。
从任务需求看,巡检机器人通常按"定点—停留—检测—继续"的方式作业。以一条典型皮带机巡检路线为例,机器人需在12个检测点依次停留,每个点位停留8~15 s完成云台对准与测温,点位之间的行驶速度控制在0.5~0.8 m/s,定位误差需优于±0.15 m才能保证云台视场覆盖仪表盘。若定位漂移超过该阈值,测温点就会偏离目标,导致读数无效。因此导航系统的核心指标应围绕"到点精度、重复到点一致性、避障响应时间、失定位恢复时间"来定义,而不是单纯看最大速度或路径长度。
ROS2导航框架Nav2为上述需求提供了标准化组件体系。Nav2采用行为树(Behavior Tree)驱动整体决策,将导航任务拆解为可组合的行为节点,核心组件包括:BT Navigator负责行为树调度;Planner Server基于全局代价地图生成全局路径;Controller Server基于局部代价地图进行轨迹跟踪与实时避障;Behavior Server提供spin、backup、wait等恢复行为;Smoother Server对路径做平滑处理;Costmap 2D维护全局与局部两层代价地图;AMCL或SLAM Toolbox负责定位与建图;Map Server加载先验栅格地图。各组件以ROS2 Action与Topic方式通信,形成"感知—定位—规划—控制—执行"的闭环数据流。
理解数据流是后续调参与排障的基础。一次完整的导航请求由上层任务节点通过NavigateToPose Action发送给BT Navigator,行为树首先检查当前定位是否有效,再调用Planner Server在全局代价地图上搜索路径;规划结果经Smoother平滑后交给Controller Server,控制器以约20 Hz的频率结合局部代价地图与实时障碍物生成速度指令,最终由底盘执行。执行过程中,里程计与激光匹配结果持续回传,AMCL更新map→odom变换,代价地图随之刷新,形成闭环。任一环节异常都会在行为树中触发恢复行为,例如定位丢失时执行原地旋转重定位,路径被堵死时执行后退让行。
在矿山场景中,几个参数尤其需要提前明确。其一是坐标系约定:本文统一采用右手坐标系,map为全局固定系,odom为里程计连续系,base_link为机器人本体中心,x轴指向车头正前方,y轴指向左侧,逆时针为正航向角。其二是代价地图膨胀半径:巷道宽度2 m、机器人宽0.7 m时,若膨胀半径设为0.45 m,则两侧各留0.45 m安全余量,可通行宽度约1.1 m,能通过但会压缩避障空间;若巷道内有临时堆料,建议将膨胀半径降至0.35 m并配合局部代价地图的实时障碍层。其三是定位更新频率:AMCL的update_min_d建议设为0.15 m,update_min_a设为0.15 rad,与巡检停留点的到点精度要求相匹配。
下面给出一段可用于验证导航链路是否打通的示例命令,属于教学示例,实际话题名需按机器人配置调整:
# 终端1:加载地图并启动定位
ros2 launch nav2_bringup localization_launch.py \
map:=/maps/mine_level3.yaml use_sim_time:=false
# 终端2:启动导航(含规划、控制、行为树)
ros2 launch nav2_bringup navigation_launch.py use_sim_time:=false
# 终端3:发送单点导航目标(示例坐标,单位:米/弧度)
ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose \
"{pose: {header: {frame_id: 'map'}, pose: {position: {x: 12.5, y: -3.2, z: 0.0}, \
orientation: {x: 0.0, y: 0.0, z: 0.707, w: 0.707}}}}" --feedback
执行后应重点观察三类反馈:Action反馈中的distance_remaining是否单调下降、/cmd_vel是否持续输出且无剧烈抖动、/amcl_pose的协方差是否保持在合理范围。若distance_remaining长时间不下降而/cmd_vel有输出,通常说明底盘未响应或TF链断裂;若协方差持续增大,则说明激光匹配失败,需要检查环境特征或降低行驶速度。这些判断逻辑将在后续日志诊断章节中进一步展开,本节只需建立"组件—数据流—可观测话题"的对应关系。
ros2 topic echo /amcl_pose观察位姿是否稳定;再用ros2 run tf2_tools view_frames确认map→odom→base_link→laser链路完整。静态链路无误后再进行动态导航测试,可显著减少排障范围。