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* vs Hybrid-A* 路径对比 A* 路径(不考虑约束) 起点 终点 锯齿状折线 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 实战调优步骤

我一般按这个顺序调优:

  1. 先跑默认参数,看看路径大概什么样。
  2. 调整代价地图的膨胀半径,让路径远离障碍。
  3. 调整规划器参数,比如cost_penalty和analytic_expansion_ratio。
  4. 检查路径平滑度,如果锯齿严重,增加max_iterations。
  5. 实车测试,看看跟踪效果。

举个例子,假设你用的是阿克曼底盘:

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。调参的时候,别急,一步步来。记住,没有万能参数,只有最适合你场景的参数。