2、全局规划器参数详解:NavFn、Theta*、Smac Planner 2D 的算法选择与参数对比

全局规划器,说白了就是机器人脑子里那张「大地图」上的导航员。它负责在已知的静态地图上,找出一条从起点到终点的可行路径。ROS2 Nav2 里主流的全局规划器有三个:NavFn、Theta* 和 Smac Planner 2D。嗯,今天我们就来聊聊它们各自的门道。

核心观点:没有最好的规划器,只有最合适的规划器。选哪个,取决于你的场景对「路径质量」和「计算速度」的取舍。

全局规划器选型决策树 全局规划器 NavFn (A* 变体) Smac Planner 2D 特点: • 计算快,内存占用低 • 路径有锯齿,非最优 特点: • 路径平滑,支持混合A* • 计算开销较大 Theta* 特点: • 任意角度路径,无锯齿 • 计算量介于两者之间

2.1 NavFn:轻量级的老将

NavFn 本质上是 A* 算法的一个变体,但它做了很多针对机器人导航的优化。我个人习惯把它当作「兜底方案」——当你对计算资源比较敏感,或者地图特别大时,NavFn 往往是最稳妥的选择。

它的核心参数不多,但有几个值得你留意:

参数名 默认值 说明
allow_unknown true 是否允许路径穿过未知区域。我建议在探索阶段开启,但生产环境最好关掉。
use_final_approach_orientation false 终点是否需要指定朝向。如果你用差速底盘,这个可以忽略。
neighborhood_size 8 搜索邻域大小。8 是四邻域+对角,16 会考虑更多方向,但计算量也上去了。

我的经验:曾经在一个 2000x2000 像素的仓库地图上,NavFn 的规划时间稳定在 15ms 以内。换成 Smac Planner 2D 后,直接飙到 200ms+。所以如果你的机器人算力有限,NavFn 是首选。

2.2 Theta*:路径质量的「折中派」

Theta* 这个名字你可能不太熟悉,但它解决了一个很实际的问题:A* 走出来的路径全是锯齿状的折线,机器人走起来一卡一卡的。Theta* 允许路径以任意角度穿过网格,说白了就是能走「斜线」。

它的参数和 NavFn 很像,但多了一个关键参数:

  • line_of_sight_check_resolution:视线检查的分辨率。值越小,路径越精确,但计算越慢。我一般设成 0.1 米。
  • line_of_sight_check_cost:视线检查的计算代价权重。如果你发现路径太绕,可以适当调低这个值。

注意:Theta* 虽然路径更平滑,但它本质上还是基于网格的搜索。如果地图分辨率很粗(比如 0.5 米/像素),Theta* 的优势就不明显了。我曾经在一个 0.05 米分辨率的地图上测试,Theta* 的路径比 NavFn 短了 12%,但计算时间多了 3 倍。

2.3 Smac Planner 2D:现代导航的「全能选手」

Smac Planner 2D 是 Nav2 里比较新的规划器。它支持两种模式:一种是用 A* 做基础搜索,另一种是用混合 A* 考虑车辆的运动学约束。嗯,这里要注意,混合 A* 模式主要给阿克曼底盘的机器人用,差速底盘用普通 A* 模式就够了。

它的参数比较多,我挑几个关键的说说:

参数名 默认值 说明
smoother.max_iterations 1000 路径平滑的最大迭代次数。我一般设 500,效果已经不错了。
smoother.w_smooth 0.3 平滑权重。值越大,路径越平滑,但可能偏离原始路径。
smoother.w_curvature 0.2 曲率约束权重。如果你的机器人转弯半径大,这个值要调高。
cost_penalty 2.0 靠近障碍物的代价惩罚。调高可以让路径远离墙壁。

避坑指南:我曾经在一个狭窄的走廊场景里用 Smac Planner 2D,结果机器人老是贴着墙走。后来发现是 cost_penalty 设得太低了。调高到 3.5 之后,路径自动往走廊中间靠,问题就解决了。

2.4 三个规划器的对比总结

说了这么多,我们来个直观的对比。你想想看,如果你的场景是:

  • 大范围、低算力(比如 500 平米以上的仓库):选 NavFn,它最省资源。
  • 需要平滑路径、但不想太复杂(比如家庭服务机器人):选 Theta*,它比 NavFn 好,又比 Smac 轻量。
  • 追求极致路径质量、算力充足(比如自动驾驶小车):选 Smac Planner 2D,它的平滑后处理是独门绝技。

我个人在实际项目中的习惯是:先用 NavFn 快速验证整个系统是否跑通,等所有模块都稳定了,再换成 Smac Planner 2D 做最终调优。这样既不会在初期被复杂的参数搞晕,又能保证最终效果。

一个小技巧:你可以在运行时动态切换全局规划器。Nav2 的 planner_server 支持多规划器共存,通过 planner_plugins 参数配置。这样你可以在不同场景下用不同的规划器,比如开阔地带用 Smac,狭窄区域切回 NavFn。

好了,全局规划器的选择就聊到这里。记住,参数调优没有银弹,多试几次,找到最适合你机器人的那一组就好。