第三章 全局规划器调参:选对算法,让机器人走对路
全局规划器,说白了就是机器人的「大脑地图」。它负责在已知地图上,找出一条从起点到终点的可行路径。很多朋友问我:「为什么我的机器人老是撞墙?明明全局路径看着挺好啊?」嗯,问题往往就出在全局规划器的参数上。
我个人习惯把全局规划器比作「导航仪」。你想想看,导航仪规划的路线好不好,直接决定了你开车顺不顺畅。机器人也一样。今天我们就来聊聊 NavFn、Theta*、A* 和 Dijkstra 这些算法,以及如何调参让路径既平滑又安全。
一、四大算法:选哪个?
Nav2 里常用的全局规划器主要有四种。我整理了一张表,方便你对比:
| 算法 | 核心思想 | 路径质量 | 计算速度 | 适用场景 |
|---|---|---|---|---|
| NavFn | 基于势场,从目标点扩散 | 中等,路径偏保守 | 快 | 静态环境,简单场景 |
| Theta* | 在网格上做视线检查 | 高,路径更直更短 | 中等 | 需要平滑路径的场景 |
| A* | 启发式搜索,有方向性 | 中等,锯齿较多 | 快 | 大多数通用场景 |
| Dijkstra | 无启发式,遍历所有节点 | 最优但路径僵硬 | 慢 | 小地图,或需要精确最优解 |
我在项目中遇到过最头疼的情况:用 A* 规划出来的路径,全是锯齿状的折线。机器人走起来一顿一顿的,像在跳机械舞。后来换成 Theta*,路径瞬间顺滑了。所以,选算法不能只看名气,得看实际效果。
二、NavFn 与 Theta*:一对好搭档
NavFn 是 Nav2 的默认全局规划器。它基于势场法,从目标点开始扩散「势能值」。机器人沿着势能下降的方向走,就能到达目标。优点是计算快,缺点是路径往往贴着障碍物走,不够安全。
Theta* 则是在 A* 的基础上做了改进。它每扩展一个节点,都会检查当前节点和父节点之间有没有障碍物。如果没有,就直接连过去,跳过中间节点。这样一来,路径就「拉直」了。
核心区别:NavFn 是「跟着感觉走」,Theta* 是「边走边看路」。Theta* 的路径更短、更平滑,但计算量稍大。
我曾经在一个仓库项目里,用 NavFn 规划路径,结果机器人老是贴着货架走,稍微有点定位误差就撞上去了。换成 Theta* 后,路径自动远离了货架,安全多了。
三、A* 与 Dijkstra:经典二选一
A* 和 Dijkstra 是图搜索算法的「老前辈」了。Dijkstra 保证找到最短路径,但它没有方向感,会向四面八方扩散。A* 则加了一个启发函数,告诉搜索「目标在右边,别往左边跑」,效率高很多。
但 A* 有个问题:启发函数如果设置不当,路径质量会下降。比如,启发函数权重太高,路径会变得「太贪心」,容易陷入局部最优。
我的调参建议:如果你用 A*,把启发函数权重设置在 1.0 到 1.5 之间。低于 1.0 就退化成 Dijkstra 了,高于 2.0 路径会变得不可靠。
说实话,我现在很少用纯 Dijkstra 了。除非地图特别小,或者我需要精确证明「这条路径是最短的」。大多数情况下,A* 加一个合理的启发函数,效果就足够了。
四、全局路径的平滑度与安全性权衡
这是全局规划里最核心的权衡。平滑度好,机器人走得顺,但可能离障碍物太近。安全性高,路径离障碍物远,但可能绕路、拐弯多。
怎么调?我一般看两个参数:
- inflation_radius(膨胀半径):这个值越大,路径离障碍物越远。我习惯设成机器人半径的 1.5 倍。
- cost_scaling_factor(代价缩放因子):控制障碍物代价的衰减速度。值越大,障碍物附近的代价下降越快,路径更容易「挤」过去。
注意:inflation_radius 设太大,机器人可能找不到路径,尤其是窄通道场景。我曾经在走廊场景里把半径设成 1.0 米,结果机器人死活过不去——因为走廊才 1.2 米宽。
下面这张图展示了平滑度与安全性的关系:
从图上能看出来,膨胀半径太小,安全性差;太大,平滑度差。最佳平衡区就在中间那一段。我个人习惯先设一个中间值,然后跑一次实际场景,看机器人反应再微调。
五、实战调参步骤
好了,理论说完了,咱们来点实际的。下面是我总结的调参步骤:
- 选算法:静态环境用 NavFn,动态环境用 Theta*。如果计算资源紧张,用 A*。
- 设膨胀半径:从机器人半径的 1.2 倍开始试。如果路径太贴障碍物,加到 1.5 倍。
- 调代价缩放因子:默认是 10.0。如果路径太绕,降到 5.0;如果太贴障碍物,升到 15.0。
- 检查路径:在 RViz 里看全局路径。如果路径有锯齿,考虑换 Theta* 或增大平滑参数。
- 实际跑一遍:仿真和真机不一样。真机有定位误差,路径要留更多余量。
一个小技巧:在 Nav2 的配置文件中,把 allow_unknown 设为 false。这样规划器就不会把未知区域当成可通行区域,避免机器人「迷路」。
我曾经在一个工厂项目里,按照这个步骤调了一下午。最后机器人走得又稳又安全,客户看了直点头。嗯,调参这事儿,急不得,得慢慢试。
六、避坑指南
最后,分享几个我踩过的坑:
- 坑一:全局路径看着很好,但局部规划器就是跟不上。原因往往是全局路径的曲率太大。解决办法:在 Theta* 里开启
smooth_path选项。 - 坑二:机器人老是走「回头路」。这通常是代价地图更新不及时导致的。检查一下
static_map的订阅频率。 - 坑三:路径穿过障碍物。这大概率是膨胀半径设太小,或者地图有空洞。用
nav2_map_server的map_saver工具检查一下地图完整性。
我曾经在调试一个医院配送机器人时,发现全局路径总是穿过一堵墙。查了半天,原来是地图里那堵墙的像素值不对,被当成了可通行区域。所以,地图质量是全局规划的基础,千万别忽视。
好了,全局规划器的调参就聊到这里。记住一句话:没有最好的算法,只有最合适的参数。多试、多调、多观察,你的机器人会越来越聪明的。