2. 矿山场景ROS2导航参数体系总览
在矿山巷道中运行的巡检机器人,导航行为几乎完全由一组参数决定:机器人离巷帮多远算安全、在粉尘遮挡激光时如何保守地重规划、遇到矿车临时占道时先等待还是先绕行。ROS2 Navigation2(Nav2)把这些可调量按职责划分为四大类——代价地图参数、规划器参数、控制器参数、恢复行为参数。理解这套分类,比记住某个具体数值更重要,因为调参时的第一步永远是判断"这个现象该归哪一类参数管"。
四类参数各管什么
代价地图参数决定机器人"眼中的世界"。它包含各层地图的开关与尺寸(静态层、障碍层、膨胀层、体素层)、分辨率、更新频率,以及最关键的膨胀半径 inflation_radius 与代价衰减系数 cost_scaling_factor。矿山巷道宽度常只有 2.5~3.5 m,膨胀半径设大了会把整条巷道"堵死",设小了又贴着巷帮擦碰,这是矿山场景最典型的矛盾点。
规划器参数决定"走哪条路"。全局规划器(如 NavFn、Smac Planner)关注路径是否最短、是否满足机器人最小转弯半径。矿用巡检机器人多为差速或四轮转向底盘,若使用 Smac Planner 的 Hybrid-A 模式,就必须给出 minimum_turning_radius,否则规划出的路径机器人根本执行不了。
控制器参数决定"怎么沿着路走"。包括最大线速度/角速度、加速度限制、目标容差、控制频率,以及 DWB 等局部控制器的采样空间与评分权重。井下路面湿滑、坡度变化大,速度与加速度上限往往要比地面场景压低 30%~50%。
恢复行为参数决定"走不通时怎么办"。Nav2 提供清除代价地图、原地旋转、后退、等待等恢复插件,参数包括触发阈值、重试次数、超时时间。矿车占道属于短时障碍,配置"等待 + 清除障碍层"通常比"后退重规划"更合理。
参数服务器机制:从 YAML 到节点
ROS2 的参数不是全局变量,而是挂在每个节点名下的键值对。启动时,ros2 launch 通过 --params-file 把 YAML 交给各节点,节点在构造阶段声明参数(declare_parameter)并读取默认值,YAML 中的同名键会覆盖默认值。因此 YAML 的第一层键必须是节点名(如 controller_server),第二层固定为 ros__parameters,第三层才是参数键。写错节点名不会报错,只会静默地"参数没生效"——这是新手最常见的坑。
运行中可用 ros2 param get /controller_server max_vel_x 查看实际生效值,用 ros2 param set 临时修改(重启即失效)。诊断时先 get 再怀疑代码,能快速排除"配置没加载"这一类问题。
矿山场景的配置组织建议
建议按"公共 + 场景覆盖"组织 YAML:把巷道宽度、限速、膨胀半径等矿山通用值放在 nav2_params_mine.yaml,再为"主运输巷""采场联络道""斜坡道"分别写覆盖文件,启动时按任务加载。这样同一台机器人在不同区段切换参数集,而不必维护多份几乎相同的完整配置。
下表给出一组矿山巡检机器人的示例参数(巷道净宽约 3 m,差速底盘,激光雷达安装高度 0.4 m),仅作教学参考,实际值需按车体尺寸与现场标定:
| 类别 | 参数 | 示例值 | 矿山场景考量 |
|---|---|---|---|
| 代价地图 | inflation_radius | 0.45 m | 车宽 0.8 m,留半车宽余量,避免堵死 3 m 巷道 |
| 代价地图 | cost_scaling_factor | 3.0 | 粉尘导致障碍层噪声大,衰减稍快可减少"幽灵障碍" |
| 规划器 | minimum_turning_radius | 0.9 m | 按底盘实测最小转弯半径设定 |
| 控制器 | max_vel_x | 0.6 m/s | 湿滑、低照度,限速保守 |
| 控制器 | acc_lim_x | 0.3 m/s² | 抑制打滑与急停 |
| 恢复行为 | wait_duration | 8.0 s | 矿车短时占道,先等待再绕行 |