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 知识体系总览

下面这张图,是我自己总结的全局路径规划知识结构。你可以把它当作一个「地图」,随时回来对照。

全局路径规划知识体系 NavFn规划器 Smac Planner 路径平滑器 Dijkstra变种 势场法搜索 计算量小 A* / Hybrid-A* 启发式搜索 考虑朝向约束 B样条平滑 代价优化 运动学约束 配置要点:插件加载 → 参数调优 → 平滑器串联 常见坑点 膨胀层设置不当 → 路径贴墙 tolerance太小 → 频繁规划失败

4.6 实战建议

最后,给你几个我踩过坑之后总结的建议:

  1. 先跑通,再优化。 别一上来就调平滑参数。先用默认配置让机器人动起来。
  2. 观察路径。 在RViz里打开规划路径的可视化,看看路径是不是合理。
  3. 记录日志。 我习惯把每次规划的耗时、路径长度都记下来。这样对比参数时心里有数。

一句话总结:NavFn适合简单场景,Smac Planner适合复杂场景,路径平滑器是「画龙点睛」的一步。三者配合好,你的机器人就能走出漂亮的路线。

可可精品资料库