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.2米):路径贴着障碍物走,距离短但风险高。机器人稍微偏一点就可能撞上。
- 大膨胀半径(0.5米):路径绕开障碍物,距离长但安全。机器人有充足的空间调整姿态。
我建议这样调:
- 如果你的机器人是圆形,膨胀半径设为机器人半径的1.2倍。
- 如果是矩形,取长边的一半再乘以1.5。
- 在狭窄通道里,可以适当减小膨胀半径(但别小于机器人半径)。
注意:膨胀半径不是越大越好。设太大,机器人可能找不到路径(比如门太窄,膨胀后门被堵死了)。设太小,机器人容易撞墙。
2.5 实战调参建议
说了这么多,咱们来点实际的。我总结了一个调参流程:
- 先调膨胀半径:设一个安全值(比如0.3米),确保机器人不会撞墙。
- 再选规划器:简单环境用NavFn,复杂环境用Smac Planner。
- 调核心参数:NavFn调tolerance和use_astar,Smac Planner调motion_model和w_heuristic_cost。
- 仿真验证:在Gazebo里跑几个典型场景,看路径是否合理。
- 微调:根据仿真结果,微调参数。
记住,没有一劳永逸的参数。同一个参数,在不同地图、不同机器人上,效果可能天差地别。多试、多调、多总结,才是王道。
我的小技巧:每次调参前,先拍一张当前路径的截图。调完后对比,能直观看到变化。别光靠感觉,数据说话。
好了,这一章就到这里。下一章我们聊局部规划器,那才是真正考验调参功夫的地方。到时候见!