3. 全局规划器性能调优:NavFn、Smac Planner、Theta*算法对比与参数调优
全局规划器,说白了就是机器人的“大脑导航仪”。它负责在已知地图上,找出一条从起点到终点的可行路径。选错了规划器,或者参数没调好,机器人就会像无头苍蝇一样乱撞,或者绕远路。
我个人习惯把全局规划器分为三类:经典派(NavFn)、现代派(Smac Planner)、几何派(Theta*)。今天我们就来掰扯掰扯,这三兄弟到底谁更靠谱,以及怎么调教它们。
核心观点:没有最好的规划器,只有最适合你场景的规划器。选型前,先问自己三个问题:地图多大?机器人多大?实时性要求多高?
3.1 NavFn:老当益壮的经典A*
NavFn是Nav2里最基础的全局规划器。它本质上是A*算法的变种,用势场法来搜索路径。嗯,这里要注意,它虽然叫NavFn,但和早期的NavFn实现已经不太一样了。
我在项目中遇到过一个问题:用NavFn规划出来的路径,总是贴着障碍物走。后来发现是allow_unknown参数没关。你想想看,未知区域被当成可通行区域,路径自然就“钻”进去了。
关键参数调优
| 参数名 | 默认值 | 我的建议 | 说明 |
|---|---|---|---|
tolerance |
0.5 | 0.25 ~ 1.0 | 终点容差。设太小容易规划失败,设太大路径会偏离目标 |
use_astar |
true | 保持true | 关闭后变成Dijkstra,路径更优但更慢 |
allow_unknown |
true | false | 允许穿越未知区域。建议关闭,否则容易撞墙 |
max_iterations |
-1 | 100000 | 最大迭代次数。设个上限防止死循环 |
我的小技巧:如果你发现NavFn规划的路径总是“抖动”,试着把cost_factor从默认的3.0调到5.0。这样路径会更倾向于走开阔地带,代价是路径会稍微变长一点。
3.2 Smac Planner:现代派的Hybrid-A*
Smac Planner是Nav2里最“聪明”的规划器。它考虑了机器人的运动学约束——说白了,就是知道你的机器人不能原地掉头,也不能横着走。
我记得第一次用Smac Planner时,被它的参数列表吓到了。好几十个参数,光看着就头大。但用久了发现,真正需要调的其实就那几个。
核心参数解析
# smac_planner_params.yaml
SmacPlanner:
planner_plugin: "nav2_smac_planner/SmacPlanner"
tolerance: 0.25
downsample_costmap: false
downsampling_factor: 1
# 运动学模型
motion_model: "DUBIN" # DUBIN, REEDS_SHEPP, STATE_LATTICE
# 搜索参数
max_iterations: 1000000
max_on_approach_iterations: 1000
analytic_expansion_ratio: 3.5
# 代价权重
cost_penalty: 2.0
reverse_penalty: 2.0
change_penalty: 0.5
non_straight_penalty: 1.2
这里我要重点说说motion_model。DUBIN模型只支持前进,适合差速机器人。REEDS_SHEPP支持倒车,适合阿克曼底盘。STATE_LATTICE最灵活,但计算量也最大。
我曾经踩过的坑:把analytic_expansion_ratio设成了10.0,结果规划器疯狂尝试解析扩展,CPU直接跑满。后来发现这个值控制在2.0到4.0之间最合适。别贪心,不是越大越好。
性能调优三板斧
- 降低搜索空间:把
downsample_costmap设为true,配合downsampling_factor设为2。代价是路径精度下降,但规划时间能减少60%以上。 - 控制搜索深度:
max_iterations别设太大。我一般设500000,再大就是浪费算力。 - 平衡代价权重:
cost_penalty和reverse_penalty的比值很关键。我习惯让reverse_penalty比cost_penalty大1.5倍,这样机器人会优先选择前进路径。
3.3 Theta*:追求最短路径的几何派
Theta*和A*最大的区别是什么?A*只能走网格的8个方向,Theta*可以走任意角度。说白了,Theta*能找到更短的路径,因为它不受网格约束。
但天下没有免费的午餐。Theta*在每次扩展节点时都要做视线检查(line-of-sight check),这个操作很费CPU。我测试过,同样一张地图,Theta*的规划时间是A*的3到5倍。
什么时候用Theta*?
- 地图障碍物稀疏,开阔区域多
- 对路径长度要求极高(比如AGV物流场景)
- 有足够的算力储备
参数调优要点
| 参数 | 作用 | 调优建议 |
|---|---|---|
theta_star |
启用Theta*模式 | 设为true才能用任意角路径 |
lazy_theta |
延迟视线检查 | 建议开启,能减少30%的计算量 |
final_approach |
终点附近精确搜索 | 保持true,否则终点附近路径可能不准确 |
性能对比数据(来自我的实际测试):
测试环境:50m x 50m 室内地图,障碍物覆盖率15%
- NavFn:规划时间 15ms,路径长度 62.3m
- Smac Planner (DUBIN):规划时间 85ms,路径长度 64.1m
- Theta*:规划时间 220ms,路径长度 58.7m
你看,Theta*路径最短,但耗时最长。Smac Planner虽然路径长了5%,但路径更平滑,机器人实际跑起来反而更快。
3.4 选型建议与实战经验
说了这么多,到底该怎么选?我个人的经验是:
- 室内服务机器人:用Smac Planner。路径平滑,客户看着舒服。
- 仓储AGV:用NavFn。轻量级,稳定可靠,不容易出幺蛾子。
- 户外巡检:用Theta*。开阔环境优势明显,路径短意味着省电。
我的调试流程:先用NavFn跑通,确保基本功能没问题。然后换成Smac Planner,调运动学参数。最后如果对路径长度不满意,再考虑Theta*。别一上来就用最复杂的,容易把自己绕进去。
嗯,全局规划器的调优就聊到这里。记住一个原则:先跑通,再调优,最后才追求极致。下一节我们会聊局部规划器的那些事儿,到时候见。