2. 全局规划器参数调优:NavFn与Smac Planner核心参数解析、代价地图膨胀半径影响

各位同学,欢迎来到第二章。上一章我们搭好了仿真环境,这一章咱们来点真格的——调全局规划器。

全局规划器是什么?说白了,就是机器人脑子里那张“地图”。它负责在出发前,算出一条从A到B的路径。路径好不好走,直接决定了机器人会不会撞墙、会不会卡住、会不会像个无头苍蝇一样原地打转。

我个人习惯,调参之前先搞清楚两个问题:用什么算法?和地图怎么看?前者对应规划器选型,后者对应代价地图膨胀半径。咱们一个一个来。

2.1 NavFn vs Smac Planner:选哪个?

Nav2里最常用的全局规划器就两个:NavFn和Smac Planner。我刚开始接触Nav2时,也纠结过选哪个。后来踩了不少坑,总结出一点经验。

特性 NavFn Smac Planner
算法核心 Dijkstra / A* Hybrid-A* / State Lattice
路径平滑度 一般(折线多) 好(曲线平滑)
计算速度 快 较慢(尤其Hybrid-A*)
适用场景 简单环境、差速轮 复杂环境、阿克曼/全向轮
参数数量 少(约10个) 多(约30个)

你看,没有的好坏。如果你用的是差速轮,在走廊、仓库这种规整环境里跑,NavFn完全够用。但如果你做的是园区物流车,或者机器人需要原地掉头、倒车入库,那Smac Planner的Hybrid-A*才是正解。

我的建议:新手先用NavFn上手,跑通了再换Smac Planner。别一上来就调30个参数,容易劝退。

2.2 NavFn核心参数调优

NavFn的参数不多,但每个都很关键。我挑三个最常调的说。

2.2.1 tolerance(容差)

这个参数控制“路径终点允许的误差”。默认是0.25米。什么意思?就是机器人走到离目标点0.25米范围内,就算到达了。

我在项目中遇到过一个问题:机器人每次停的位置都离目标点有偏差,大概0.3米左右。一开始我以为是定位不准,后来发现是tolerance设得太大了。调到0.1米后,问题解决。

调参技巧:如果你的机器人需要精确停靠(比如充电桩对接),tolerance设0.05米。如果只是粗略导航,0.5米也行。

2.2.2 use_astar(是否使用A*)

默认是false,用的是Dijkstra。Dijkstra保证最优路径,但慢。A*快,但路径不一定最优。

嗯,这里要注意:在Gazebo仿真中,如果你的地图很大(比如100x100米),Dijkstra可能要算好几秒。这时候我建议开启A*,能快不少。

# 在nav2_params.yaml中设置
planner_server:
  ros__parameters:
    use_astar: true  # 开启A*加速

2.2.3 allow_unknown(是否允许未知区域)

这个参数我吃过亏。默认是true,允许路径穿过未知区域。听起来没问题对吧?但你想,未知区域可能是墙,也可能是悬崖。机器人一旦走过去,可能就撞上了。

我曾经在仿真中遇到机器人“穿墙”现象,就是因为allow_unknown设成了true。代价地图里有一块未知区域,规划器直接画了一条直线穿过去。结果机器人一头撞在墙上。

避坑指南:在室内环境,建议把allow_unknown设为false。室外空旷环境可以保留true,但要做好避障准备。

2.3 Smac Planner核心参数解析

Smac Planner的参数多,但核心就几个。我挑最常用的说。

2.3.1 motion_model(运动模型)

这个参数决定了机器人怎么运动。可选值有:

  • DifferentialDrive:差速轮,可以原地旋转
  • Omnidirectional:全向轮,可以平移
  • Ackermann:阿克曼转向,不能原地掉头

我建议根据你的机器人底盘类型选。选错了,规划出来的路径根本走不了。

2.3.2 w_heuristic_cost(启发式代价权重)

这个参数控制“路径长度”和“路径平滑度”的权衡。值越大,路径越短但可能不平滑;值越小,路径越平滑但可能绕路。

我个人习惯,在狭窄走廊里把权重调高(比如2.0),让规划器尽量走直线。在开阔区域调低(比如0.5),让路径更平滑。

2.3.3 analytic_expansion_ratio(解析扩展比例)

这个参数控制Hybrid-A*中“解析扩展”的比例。解析扩展就是直接计算从当前点到终点的直线路径,能加速规划。

默认是3.0。如果你发现规划时间太长,可以调高到5.0。但注意,调太高可能导致路径质量下降。

# Smac Planner参数示例
planner_server:
  ros__parameters:
    planner_plugins: ["GridBased"]
    GridBased:
      plugin: "nav2_smac_planner/SmacPlannerHybrid"
      motion_model: "DifferentialDrive"
      w_heuristic_cost: 1.5
      analytic_expansion_ratio: 3.5

2.4 代价地图膨胀半径的影响

膨胀半径,说白了就是给障碍物“加一圈安全距离”。这个参数直接影响全局路径的走向。

我画了一张图,帮你理解膨胀半径的作用:

障碍物 小膨胀半径 (0.2m) 大膨胀半径 (0.5m) 路径(小半径):靠近障碍物 路径(大半径):远离障碍物 起点 终点

从图上你能看到:

  • 小膨胀半径(0.2米):路径贴着障碍物走,距离短但风险高。机器人稍微偏一点就可能撞上。
  • 大膨胀半径(0.5米):路径绕开障碍物,距离长但安全。机器人有充足的空间调整姿态。

我建议这样调:

  • 如果你的机器人是圆形,膨胀半径设为机器人半径的1.2倍。
  • 如果是矩形,取长边的一半再乘以1.5。
  • 在狭窄通道里,可以适当减小膨胀半径(但别小于机器人半径)。

注意:膨胀半径不是越大越好。设太大,机器人可能找不到路径(比如门太窄,膨胀后门被堵死了)。设太小,机器人容易撞墙。

2.5 实战调参建议

说了这么多,咱们来点实际的。我总结了一个调参流程:

  1. 先调膨胀半径:设一个安全值(比如0.3米),确保机器人不会撞墙。
  2. 再选规划器:简单环境用NavFn,复杂环境用Smac Planner。
  3. 调核心参数:NavFn调tolerance和use_astar,Smac Planner调motion_model和w_heuristic_cost。
  4. 仿真验证:在Gazebo里跑几个典型场景,看路径是否合理。
  5. 微调:根据仿真结果,微调参数。

记住,没有一劳永逸的参数。同一个参数,在不同地图、不同机器人上,效果可能天差地别。多试、多调、多总结,才是王道。

我的小技巧:每次调参前,先拍一张当前路径的截图。调完后对比,能直观看到变化。别光靠感觉,数据说话。

好了,这一章就到这里。下一章我们聊局部规划器,那才是真正考验调参功夫的地方。到时候见!

可可精品资料库