全局规划器调参(NavFn):让路径平滑不震荡
各位同学,欢迎来到第二章。上一章我们聊了Nav2的整体架构,今天咱们深入一个具体的东西——NavFn全局规划器。
说实话,我刚开始接触Nav2时,最头疼的就是全局路径规划。明明地图建好了,机器人却总走出一条锯齿状的路径,看着就难受。后来我才明白,问题出在参数上。今天我就把这些年调NavFn的经验,一次性讲清楚。
1. 代价地图权重(cost_factor)—— 安全第一
这个参数,说白了就是告诉规划器:你有多怕撞到障碍物。
代价地图权重控制的是路径对障碍物代价的敏感程度。值越大,路径越倾向于远离障碍物;值越小,路径就越敢贴着墙走。
核心逻辑:
- cost_factor 偏大(如 3.0~5.0):路径会绕大弯,安全冗余高,但可能绕远路
- cost_factor 偏小(如 0.5~1.0):路径更短更直接,但容易贴着障碍物走
- 默认值通常是 1.0~2.0,具体看你的场景
我在项目中遇到过这样一个坑:有一次在仓库里跑AGV,cost_factor设成了0.8,结果机器人总喜欢贴着货架走。一次转弯时,货架上的箱子稍微凸出来一点,机器人直接撞上了。后来我把cost_factor调到2.5,路径明显往外扩了一圈,虽然多走了半米,但再也没出过碰撞事故。
我的调参建议:
先设一个偏大的值(比如3.0),观察路径是否过于保守。如果绕路太多,再逐步降低。每次调整0.5,跑一遍看看效果。别一次调太多,容易矫枉过正。
2. 启发式因子(heuristic_factor)—— 路径的「直觉」
启发式因子控制的是A*算法中启发函数的权重。嗯,这里稍微有点理论,我尽量讲得通俗点。
A*算法在搜索路径时,会同时考虑两件事:已经走了多远(实际代价)和离目标还有多远(启发式估计)。启发式因子就是给「离目标还有多远」这个估计值加一个权重。
| 参数值 | 行为表现 | 适用场景 |
|---|---|---|
| heuristic_factor = 1.0 | 标准A*,路径最优化 | 大多数室内场景 |
| heuristic_factor > 1.0(如1.5~2.0) | 更倾向于直奔目标,搜索更快 | 开阔环境、长距离导航 |
| heuristic_factor < 1.0(如0.5~0.8) | 更注重局部避障,路径更保守 | 狭窄通道、密集障碍物环境 |
你想想看,如果启发式因子太大,路径就会像「一根筋」一样直冲目标,遇到障碍物才急转弯,路径自然就震荡了。反之,如果太小,算法会花太多时间在局部区域绕来绕去,路径虽然平滑,但计算时间会变长。
注意:启发式因子不要超过2.0。我曾经试过设成3.0,结果路径直接穿墙了——因为算法太相信「直觉」,忽略了实际障碍物代价。嗯,那次调试花了我一整个下午。
3. 网格分辨率(tolerance / resolution)—— 细节决定成败
网格分辨率决定了规划器在多大粒度上考虑环境。分辨率越高(格子越小),路径越精细,但计算量也越大。
NavFn中主要通过两个参数控制:
- tolerance:路径点到障碍物的最小容忍距离。默认0.5米,意思是路径点至少离障碍物0.5米远
- resolution:代价地图的分辨率,通常与地图分辨率一致(如0.05米/像素)
我个人习惯这样调:
- 先看你的地图分辨率是多少。如果是0.05米/像素,那tolerance至少设成0.3米以上
- 如果路径出现锯齿状,试着增大tolerance到0.6~0.8米
- 如果路径太绕,适当减小tolerance
一个实用的经验公式:
tolerance ≈ 机器人半径 × 1.2 ~ 1.5
比如机器人半径0.3米,tolerance设0.4~0.5米比较合适。这样既保证安全,又不会太保守。
4. 其他关键参数
除了上面三个核心参数,还有几个参数也值得关注:
- max_iterations:最大迭代次数。默认10000,如果环境复杂可以适当增大。但别超过50000,否则计算时间太长
- smooth_path:是否对路径做平滑处理。建议开启,能有效减少路径震荡
- allow_unknown:是否允许路径经过未知区域。默认false,建议保持关闭,除非你明确知道未知区域是安全的
避坑指南:
我曾经在调参时忽略了max_iterations,结果在复杂环境中规划器直接超时,机器人原地打转。后来把max_iterations从10000改到30000,问题就解决了。所以,如果你的环境比较复杂,记得检查这个参数。
5. 实战调参流程
说了这么多理论,咱们来点实际的。我一般按这个步骤调NavFn的参数:
- 先调cost_factor:从2.0开始,观察路径是否安全。如果贴着障碍物走,增加到3.0;如果绕路太多,降到1.5
- 再调heuristic_factor:保持1.0,看路径是否震荡。如果震荡明显,降到0.8;如果路径太直不灵活,升到1.3
- 最后调tolerance:根据机器人尺寸,用上面的经验公式算一个初始值,然后微调
- 跑一遍完整路径:从起点到终点,观察路径是否平滑、是否安全
- 反复迭代:一般需要3~5轮调整才能找到最佳组合
一个典型的调参结果(供参考):
# 适用于0.3米半径的室内机器人
NavFn:
cost_factor: 2.5
heuristic_factor: 1.2
tolerance: 0.45
max_iterations: 20000
smooth_path: true
allow_unknown: false
记住,没有一套参数能通吃所有场景。每次换环境,都要重新调一遍。我刚开始也觉得麻烦,但后来发现,调参本身就是理解算法最好的方式。
好了,这一章的内容就到这里。下一章我们会聊局部规划器的调参,到时候再跟大家分享更多实战经验。