4、全局规划器进阶:NavFn与Smac Planner的原理对比
全局规划器,说白了就是机器人的“大脑导航仪”。它负责在已知地图上,找出一条从A到B的可行路径。Nav2里最常用的两个全局规划器,就是NavFn和Smac Planner。今天咱们就好好掰扯掰扯它们俩。
4.1 NavFn:经典但够用
NavFn是Nav1时代就有的老将。它基于势场法,把地图当成一个“高度图”。起点在谷底,终点在峰顶。机器人就像水一样,顺着梯度往下流。
我个人习惯把NavFn叫做“懒人规划器”。为什么?因为它快,而且参数少。你想想看,一个简单的室内场景,NavFn几乎瞬间就能出结果。
核心原理:NavFn通过计算每个栅格到终点的“势能值”,然后沿着势能下降最快的方向前进。它本质上是一种Dijkstra算法的变体,但做了大量优化。
但NavFn有个硬伤——它不考虑机器人的运动学约束。说白了,它规划出来的路径,可能是一堆锯齿状的折线。差速轮还好,如果是阿克曼底盘或者履带车,那根本没法直接跟踪。
避坑指南:我曾经在一个项目中,用NavFn给四轮差速小车规划路径。结果路径上全是90度急转弯,小车原地打转就是过不去。后来我换了Smac Planner,问题才解决。
4.2 Smac Planner:现代与灵活
Smac Planner是Nav2引入的新一代规划器。它支持多种算法后端,包括A*和Hybrid-A*。我个人觉得,Smac Planner最大的亮点就是“可插拔”。
你可以根据场景,随时切换算法。比如:
- A*:适合差速轮、全向轮,速度快,路径短。
- Hybrid-A*:适合阿克曼底盘、履带车,考虑转弯半径,路径平滑。
为什么会这样?因为Hybrid-A*在搜索时,不光看栅格位置,还看机器人的朝向和曲率。它生成的路径,天然就是可执行的。
我的经验:如果你用的是阿克曼底盘,别犹豫,直接上Hybrid-A*。虽然它比普通A*慢一点,但省去了后续的路径平滑步骤,整体效率反而更高。
4.3 A* vs Hybrid-A*:非完整约束下的对决
非完整约束,听起来很玄乎。说白了就是“机器人不能原地掉头”。比如汽车,你没法像差速轮那样原地转圈。
咱们用一张图来对比一下:
看到了吗?A*走的是折线,Hybrid-A*走的是平滑曲线。对于阿克曼底盘来说,Hybrid-A*的路径可以直接用,而A*的路径需要额外做平滑处理。
4.4 规划器参数调优实战
参数调优,是规划器落地的关键。我见过太多人,拿着默认参数就跑,结果路径各种奇葩。下面是我总结的调优经验。
4.4.1 NavFn关键参数
| 参数名 | 作用 | 我的建议值 |
|---|---|---|
allow_unknown |
是否允许通过未知区域 | false(保守点好) |
planner_window_x |
规划窗口宽度(米) | 0(表示全图规划) |
default_tolerance |
终点容差(米) | 0.25(别设太大) |
小技巧:如果你发现NavFn规划的路径总是贴着障碍物,可以适当增大costmap的膨胀半径。嗯,这个参数不在规划器里,但在代价地图里。
4.4.2 Smac Planner关键参数
Smac Planner的参数就多了。我挑几个最关键的说说。
| 参数名 | 作用 | 我的建议值 |
|---|---|---|
smoother.max_iterations |
路径平滑迭代次数 | 500(够了,再多就慢) |
cost_penalty |
代价惩罚系数 | 2.0(让路径远离障碍) |
analytic_expansion_ratio |
解析扩展比例(Hybrid-A*专用) | 3.5(加快搜索速度) |
minimum_turning_radius |
最小转弯半径(米) | 0.4(根据底盘实际值设) |
注意:minimum_turning_radius这个参数,一定要和你的底盘实际值一致。我曾经设小了,结果规划出来的路径,小车根本拐不过去,直接撞墙。
4.4.3 实战调优步骤
我一般按这个顺序调优:
- 先跑默认参数,看看路径大概什么样。
- 调整代价地图的膨胀半径,让路径远离障碍。
- 调整规划器参数,比如
cost_penalty和analytic_expansion_ratio。 - 检查路径平滑度,如果锯齿严重,增加
max_iterations。 - 实车测试,看看跟踪效果。
举个例子,假设你用的是阿克曼底盘:
planner_server:
ros__parameters:
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_smac_planner/SmacPlannerHybrid"
minimum_turning_radius: 0.4
cost_penalty: 2.0
analytic_expansion_ratio: 3.5
smoother:
max_iterations: 500
w_smooth: 0.3
w_cost: 0.2
这段配置,我用了很多次。基本上,只要底盘参数对,路径都能用。
4.5 总结
NavFn和Smac Planner,各有各的适用场景。简单场景用NavFn,复杂场景或者非完整约束底盘,果断上Smac Planner。调参的时候,别急,一步步来。记住,没有万能参数,只有最适合你场景的参数。