第二章:全局规划器参数详解
各位同学,今天我们来聊聊全局规划器。说白了,全局规划器就是机器人的「大脑地图」——它负责在已知的全局代价地图上,找出一条从起点到终点的最优路径。
我个人习惯把全局规划器比作「导航的灵魂」。你想想看,如果灵魂出了问题,机器人要么原地打转,要么撞墙,要么绕远路。所以这一章,咱们把它的核心参数掰开揉碎了讲清楚。
2.1 全局规划器插件的选择
Nav2 里常用的全局规划器主要有两个:NavFn 和 Smac Planner。嗯,这里要注意,它们不是替代关系,而是各有各的脾气。
2.1.1 NavFn:经典但够用
NavFn 是 ROS1 时代的老将了。它基于 Dijkstra 或 A* 算法,计算速度快,资源占用低。我在项目中遇到过一些低算力的工控机,用 NavFn 反而比 Smac 更稳。
它的核心参数不多,我列一下常用的:
| 参数名 | 默认值 | 说明 |
|---|---|---|
| use_dijkstra | true | 是否使用 Dijkstra 算法。false 则用 A* |
| use_quadratic | true | 是否使用二次近似计算代价 |
| allow_unknown | true | 是否允许路径经过未知区域 |
我曾经踩过一个坑:在动态障碍物多的场景下,把 allow_unknown 设成了 false。结果机器人一遇到未知区域就卡住,死活不走。后来改成 true,配合局部规划器实时避障,问题就解决了。
2.1.2 Smac Planner:新一代的王者
Smac Planner 是 Nav2 的亲儿子。它支持 Hybrid-A*、State Lattice 等多种算法,能生成更平滑、更符合运动学约束的路径。
我个人强烈推荐在差速或阿克曼底盘上使用 Smac。为什么呢?因为它考虑了车辆的最小转弯半径和加速度限制。说白了,它生成的路径,你的机器人真的能走。
核心参数如下:
| 参数名 | 默认值 | 说明 |
|---|---|---|
| smoother.max_iterations | 1000 | 路径平滑的最大迭代次数 |
| cost_penalty | 2.0 | 代价惩罚系数,越大越远离障碍物 |
| analytic_expansion_ratio | 3.5 | 解析扩展比例,影响搜索效率 |
| motion_model_for_search | “dubins” | 搜索用的运动模型:dubins、reeds_shepp、state_lattice |
这里有个小技巧:如果你的机器人是差速底盘,用 dubins 模型就够了。如果是阿克曼底盘,建议用 reeds_shepp。我曾经在阿克曼车上用了 dubins,结果路径经常出现原地掉头——嗯,那画面太美我不敢看。
避坑指南:Smac Planner 的 cost_penalty 参数不要调太大。我见过有人设到 10.0,结果路径绕了半个地图才到终点。一般 1.5~3.0 之间比较合适。
2.2 代价地图参数
代价地图是全局规划器的「眼睛」。它告诉规划器哪里能走、哪里不能走、哪里最好绕着走。
代价地图分为两种:全局代价地图和局部代价地图。全局的用于规划长距离路径,局部的用于实时避障。这里我们重点讲全局代价地图的参数。
2.2.1 核心参数
| 参数名 | 默认值 | 说明 |
|---|---|---|
| global_frame | “map” | 全局坐标系 |
| robot_base_frame | “base_link” | 机器人基坐标系 |
| resolution | 0.05 | 地图分辨率(米/像素) |
| width | 10.0 | 地图宽度(米) |
| height | 10.0 | 地图高度(米) |
| obstacle_range | 2.5 | 障碍物检测范围(米) |
| raytrace_range | 3.0 | 光线追踪范围(米) |
我个人习惯把 resolution 设为 0.05。为什么呢?因为 0.05 米的分辨率,对于大多数室内机器人来说,既能保证路径精度,又不会让计算量爆炸。如果你在室外大场景,可以放宽到 0.1 甚至 0.2。
2.2.2 膨胀层参数
膨胀层是代价地图的「安全区」。它把障碍物周围的一圈区域标记为高代价,让规划器主动避开。
| 参数名 | 默认值 | 说明 |
|---|---|---|
| inflation_radius | 0.55 | 膨胀半径(米) |
| cost_scaling_factor | 10.0 | 代价缩放因子,越大衰减越快 |
这里有个经典问题:inflation_radius 设多大合适?
我的经验是:至少大于机器人半径的一半。比如你的机器人半径是 0.3 米,那 inflation_radius 至少设 0.15 米。但如果你设得太小,比如 0.05 米,机器人可能会贴着墙走——嗯,刮花了漆别找我。
小提示:cost_scaling_factor 控制代价从障碍物边缘向外衰减的速度。值越大,衰减越快,路径越靠近障碍物。值越小,衰减越慢,路径越远离障碍物。我一般用 10.0,效果比较均衡。
2.3 知识体系总览
为了让你更直观地理解全局规划器的知识结构,我画了一张图:
2.4 实战建议
最后,我总结几条实战经验:
- 选插件看底盘:差速底盘用 NavFn 或 Smac 都行,阿克曼底盘建议用 Smac。
- 调参数要渐进:一次只改一个参数,观察效果。我见过有人一口气改了五个参数,结果机器人原地转圈,根本不知道是哪个参数的问题。
- 代价地图要匹配:全局代价地图的分辨率不要比局部代价地图低太多,否则路径会「跳来跳去」。
- 膨胀半径别太小:至少大于机器人半径的一半,否则容易刮蹭。
警告:千万不要在生产环境中直接使用默认参数!每个场景、每个底盘都有自己的脾气。一定要在仿真或测试环境中反复调参,确认没问题后再上线。
好了,这一章的内容就到这里。全局规划器的参数说多不多,说少不少,但每一个都关系到机器人的「生死存亡」。希望你能动手试试,把参数调出最适合你机器人的那一组。