4. 全局路径规划:NavFn规划器、Smac Planner(A*、Hybrid-A*)、规划器插件配置、路径平滑与优化
全局路径规划,说白了就是给机器人画一条从A到B的「大方向」。
我刚开始接触Nav2时,以为规划器就是随便选一个就行。后来在真实产线上跑了一周,机器人天天卡在货架缝隙里……嗯,从那以后我才认真研究起这几个规划器的区别。
4.1 NavFn规划器:经典但够用
NavFn是Nav2里最基础的全局规划器。它本质上是Dijkstra算法的一个变种,用势场(potential field)的方式去搜索路径。
核心原理:
从起点开始,像水波一样向外扩散。每走一步,代价就加一点。最终找到一条累计代价最小的路径。
我个人习惯在简单场景下用NavFn。比如空旷的仓库、走廊,或者你只是想快速验证导航流程时。它的计算量小,响应快,但路径质量嘛……说实话,比较「直来直去」,转弯处经常是直角。
适用场景:
- 环境障碍物少,空间开阔
- 对路径平滑度要求不高
- 计算资源有限(比如树莓派)
4.2 Smac Planner:A* 与 Hybrid-A*
Smac Planner是Nav2里更现代的规划器。它支持两种算法:A* 和 Hybrid-A*。
A* 算法
A* 比 Dijkstra 聪明的地方在于,它有一个启发式函数(heuristic)。说白了就是「我大概知道终点在哪个方向,先往那边试试」。这样搜索效率高很多。
我在项目中遇到过一个问题:A* 在栅格地图上规划的路径,经常贴着障碍物走。机器人稍微有点定位误差,就撞上了。后来我加了膨胀层(inflation layer),才解决了这个问题。
Hybrid-A* 算法
Hybrid-A* 是 A* 的升级版。它不光考虑位置(x, y),还考虑朝向(theta)。
你想想看,普通 A* 规划的路径,机器人可能需要在原地转180度才能执行。但 Hybrid-A* 会生成一条连续曲率的路径,机器人可以直接开过去。
注意:Hybrid-A* 的计算量比 A* 大很多。我在一个50x50米的仓库里测试,Hybrid-A* 的规划时间大约是 A* 的3-5倍。如果你的机器人需要高频重规划,建议谨慎使用。
4.3 规划器插件配置
Nav2的规划器是以插件形式加载的。你可以在 nav2_params.yaml 里配置。
下面是我常用的一个配置模板:
planner_server:
ros__parameters:
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
tolerance: 0.5
use_astar: false
allow_unknown: true
如果你想用 Smac Planner,改成这样:
planner_server:
ros__parameters:
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_smac_planner/SmacPlanner"
tolerance: 0.25
smoother:
max_iterations: 1000
w_smooth: 0.3
w_curvature: 0.4
w_cost: 0.3
我的建议:刚开始调试时,把 tolerance 设大一点(比如0.5米)。这样规划器更容易找到路径,不会频繁报错。等系统稳定了,再慢慢调小。
4.4 路径平滑与优化
规划出来的路径,直接给机器人用?不行。原始路径通常又硬又直,机器人跑起来会一顿一顿的。
路径平滑,说白了就是让路径更「顺眼」。Nav2提供了几种平滑方式:
- 基于B样条的平滑:用控制点拟合一条光滑曲线。我比较推荐这个,效果稳定。
- 基于代价的平滑:在平滑的同时,尽量远离障碍物。适合狭窄通道。
- 基于时间的最优化:考虑机器人的运动学约束,生成时间最优路径。
我曾经在一个项目里,机器人走出来的路径像锯齿一样。后来加了平滑器,把 w_smooth 调到0.4,路径瞬间就顺滑了。嗯,这个参数值得你多试试。
4.5 知识体系总览
下面这张图,是我自己总结的全局路径规划知识结构。你可以把它当作一个「地图」,随时回来对照。
4.6 实战建议
最后,给你几个我踩过坑之后总结的建议:
- 先跑通,再优化。 别一上来就调平滑参数。先用默认配置让机器人动起来。
- 观察路径。 在RViz里打开规划路径的可视化,看看路径是不是合理。
- 记录日志。 我习惯把每次规划的耗时、路径长度都记下来。这样对比参数时心里有数。
一句话总结:NavFn适合简单场景,Smac Planner适合复杂场景,路径平滑器是「画龙点睛」的一步。三者配合好,你的机器人就能走出漂亮的路线。
可可精品资料库