3. 全局规划器调参(Smac Planner):A* 与 Hybrid-A* 的实战艺术

全局规划,说白了就是给机器人画一条从起点到终点的「大路」。在 Nav2 里,Smac Planner 是干这活的主力。它提供了两种核心算法:A* 和 Hybrid-A*。很多人觉得选一个就行,其实没那么简单。我这些年调过的车,从室内差速轮到室外阿克曼底盘,这两套参数的脾气秉性完全不同。

今天咱们就掰开揉碎,把 A* 和 Hybrid-A* 的参数讲透。嗯,尤其是那些让你头疼的搜索超时、启发式权重,还有运动学约束。

Smac Planner 全局规划参数体系 A* 算法(2D 状态空间) 搜索超时 启发式权重 2D 网格代价 路径平滑度 Hybrid-A*(SE2 状态空间) 最小转弯半径 运动学步长 SE2 状态离散 Reeds-Shepp 曲线 核心目标:在搜索效率与路径可行性之间找到平衡

3.1 A* 算法:2D 状态空间的快与慢

A* 在 Nav2 里默认跑在 2D 栅格地图上。它不考虑机器人的朝向,只关心 (x, y) 坐标。说白了,它把机器人当成一个点。好处是快,坏处是规划出来的路径经常是锯齿状的,机器人走起来一顿一顿的。

3.1.1 搜索超时(timeout)

这个参数我吃过亏。默认值是 5.0 秒,但在大场景里,比如 100m x 100m 的仓库,5 秒根本搜不完。我曾经遇到过机器人走到一半突然停下来,就是因为搜索超时了,规划器返回了一条空路径。

⚠️ 注意: 搜索超时不是越大越好。设成 30 秒,地图一复杂,CPU 直接拉满,影响其他模块。我个人建议:室内场景 3-5 秒,室外大场景 8-10 秒。

3.1.2 启发式权重(heuristic_weight)

这个参数控制 A* 的「贪心程度」。权重越大,算法越倾向于直接往目标点冲,搜索速度变快,但路径可能不是最优的。权重越小,搜索越保守,路径更短,但耗时更长。

我习惯的做法是:在动态障碍物多的场景,把权重设到 1.2-1.5,让路径稍微绕一点,但更安全。在空旷场景,设 1.0 就行,追求最短路径。

💡 小技巧: 如果你发现机器人经常贴着障碍物走,试着把启发式权重调低到 0.8-0.9。这样算法会更「谨慎」,路径会往中间靠。

3.1.3 2D 网格代价与路径平滑

A* 的路径是由一个个网格中心点连起来的。如果不做平滑,路径就是折线。Smac Planner 内部有一个 smooth_path 参数,默认开启。但注意,平滑会改变路径点,可能导致路径穿过障碍物。

# 典型 A* 参数配置
planner_server:
  ros__parameters:
    SmacPlanner:
      planner_plugin_types: ["nav2_smac_planner/SmacPlanner2D"]
      tolerance: 0.25
      max_iterations: 1000000
      max_planning_time: 5.0  # 搜索超时
      heuristic_weight: 1.2   # 启发式权重
      smooth_path: true       # 是否平滑路径
      smooth_path_alpha: 0.1  # 平滑强度

3.2 Hybrid-A* 算法:SE2 状态空间的真实感

Hybrid-A* 才是真正为机器人设计的规划器。它考虑了 (x, y, theta) 三个维度,也就是位置加朝向。规划出来的路径自带转弯半径约束,机器人能直接跟着走,不用再二次平滑。

我记得第一次用 Hybrid-A* 时,觉得它太慢了。后来才发现,不是算法慢,是我参数没调对。

3.2.1 最小转弯半径(minimum_turning_radius)

这是 Hybrid-A* 的灵魂参数。它告诉规划器:我的机器人最小能转多急的弯。单位是米。差速轮机器人可以设 0.0,因为它能原地转圈。阿克曼底盘比如车,一般设 0.5-2.0 米,具体看轴距。

🔑 关键点: 设得太小,规划器会尝试走急弯,实际机器人走不了。设得太大,路径会绕远路。我一般先查底盘手册,然后设成手册值的 1.2 倍,留点余量。

3.2.2 运动学步长(motion_model_step_size)

这个参数控制 Hybrid-A* 在搜索时,每一步向前探索多远。默认是 0.2 米。步长越小,路径越精细,但搜索空间爆炸。步长越大,路径越粗糙,可能漏掉可行通道。

我踩过坑:在窄走廊场景,步长设 0.4 米,结果规划器直接穿墙了。因为步长太大,跳过了墙中间的缝隙。后来我改成 0.15 米,问题解决。

3.2.3 SE2 状态离散(se2_state_discretization)

Hybrid-A* 把连续空间离散成网格。这个参数控制每个网格里采样多少个朝向。默认是 72,也就是每 5 度一个朝向。朝向越多,路径越顺滑,但内存和计算量翻倍。

我个人经验:室内场景 36 个朝向(10 度间隔)就够用。室外高速场景,用 72 甚至 144,保证路径平滑,减少急转弯。

3.2.4 Reeds-Shepp 曲线与路径优化

Hybrid-A* 在搜索到目标附近时,会用 Reeds-Shepp 曲线生成一段连接路径。这段曲线考虑了前进、后退、转弯,能保证路径运动学可行。但注意,Reeds-Shepp 曲线默认只支持前进和后退,不支持原地转向。

⚠️ 避坑指南: 我曾经在狭窄空间里,Hybrid-A* 规划出来的路径最后一段是倒车入库。原因是 Reeds-Shepp 曲线认为倒车更短。如果你不希望机器人倒车,可以把 allow_reversing 设成 false。
# Hybrid-A* 参数示例
planner_server:
  ros__parameters:
    SmacPlannerHybrid:
      planner_plugin_types: ["nav2_smac_planner/SmacPlannerHybrid"]
      minimum_turning_radius: 0.6   # 最小转弯半径
      motion_model_step_size: 0.2   # 运动学步长
      se2_state_discretization: 72  # 朝向离散数
      allow_reversing: false        # 是否允许倒车
      max_planning_time: 10.0       # 搜索超时
      heuristic_weight: 1.1         # 启发式权重

3.3 2D 与 SE2 状态空间的选择策略

很多新手会问:到底用 A* 还是 Hybrid-A*?我的回答是:看底盘。

底盘类型 推荐规划器 原因
差速轮(两轮/四轮独立驱动) A*(2D) 能原地转向,不需要转弯半径约束
阿克曼底盘(汽车式) Hybrid-A*(SE2) 必须考虑转弯半径,否则路径不可执行
全向轮(麦克纳姆轮) A*(2D) 全向移动,不受朝向约束
履带式底盘 Hybrid-A*(SE2) 虽然能原地转向,但转弯时滑移大,建议用 SE2 规划更平滑路径

嗯,这里要注意:即使你用的是差速轮,在某些场景下用 Hybrid-A* 也有好处。比如在狭窄通道里,Hybrid-A* 规划出来的路径更平滑,机器人走起来更稳,不会左右摇摆。

💡 我的习惯: 开发阶段先用 A* 快速验证地图和定位。等基本功能跑通了,再切到 Hybrid-A* 做精细调优。这样能节省大量调试时间。

3.4 实战调参流程

说了这么多理论,咱们来点实际的。我一般按这个步骤调全局规划参数:

  1. 先确定底盘类型:差速轮用 A*,阿克曼用 Hybrid-A*。
  2. 设置最小转弯半径:阿克曼底盘查手册,差速轮设 0.0。
  3. 调整搜索超时:从 5 秒开始,如果规划失败,逐步增加到 10 秒。
  4. 微调启发式权重:默认 1.0,如果路径太绕,增加到 1.2-1.5。
  5. 测试窄通道场景:如果规划器穿墙,减小运动学步长或增加朝向离散数。
  6. 观察实际执行效果:让机器人跑一遍,看路径是否平滑,有没有急转弯。

我曾经在一个项目里,Hybrid-A* 规划出来的路径总是贴着墙走。调了半天参数都没用。后来发现是代价地图的膨胀半径设得太小了。嗯,有时候问题不在规划器本身,而在上游的代价地图配置。

全局规划调参,说白了就是平衡的艺术。你要在搜索速度、路径长度、运动学可行性之间找到那个黄金点。没有万能参数,只有不断试错和积累经验。希望今天的内容能帮你少走一些弯路。