4、局部规划器参数详解:DWB、TEB、MPPI算法原理与核心参数
聊完了全局规划,咱们得把目光放到「脚下」了。局部规划器,说白了就是机器人「走一步看一步」的控制器。它负责把全局路径切成小段,再结合实时的激光雷达或点云数据,算出一条安全又平滑的局部轨迹。
ROS2 Nav2里主流的局部规划器有三个:DWB、TEB 和 MPPI。我这些年做项目,这三个家伙都打过不少交道。今天我就把它们的脾气秉性和核心参数,给你掰开了揉碎了讲清楚。
核心观点:没有最好的规划器,只有最合适的场景。DWB 稳如老狗,TEB 灵活但娇气,MPPI 暴力但吃算力。
4.1 DWB(Dynamic Window Based)—— 老牌劲旅
DWB 是 DWA 的升级版。它的核心思想很简单:在速度空间里采样,然后模拟出未来一小段时间的轨迹,挑一条最好的走。
嗯,这里要注意。DWB 不是直接对路径做优化,而是对「速度对」做优化。它只关心 (v, ω) 这个组合,也就是线速度和角速度。
4.1.1 核心参数
| 参数名 | 默认值 | 说明 |
|---|---|---|
prune_plan_distance |
1.0 | 距离终点多远时,裁剪全局路径。设太小容易提前减速。 |
max_vel_x |
0.55 | 最大线速度。别设太大,刹车距离会变长。 |
min_vel_x |
0.0 | 最小线速度。设为负值可后退,但我不建议你这么做。 |
max_vel_theta |
1.0 | 最大角速度。单位是 rad/s。 |
vx_samples |
20 | 线速度采样数。越大轨迹越密,但计算量也大。 |
vtheta_samples |
40 | 角速度采样数。转弯多的地方,这个值可以调高。 |
sim_time |
1.7 | 轨迹模拟的时间长度。太长会看到远处的障碍物,但反应会变慢。 |
我的经验:在仓库场景里,我习惯把 sim_time 设到 2.0 秒,因为货架之间的通道比较长,需要提前预判。但在家庭服务机器人上,1.2 秒就够了,环境变化太快,看太远反而容易误判。
4.1.2 代价函数权重
DWB 用一组代价函数来评价每条采样轨迹。权重越大,这个因素就越重要。
# 典型的 DWB 代价权重配置
Critics: [
"RotateToGoal", # 朝向目标
"Oscillation", # 防震荡
"ObstacleFootprint", # 障碍物碰撞
"GoalAlign", # 目标对齐
"PathAlign", # 路径对齐
"PathDist", # 到路径的距离
"GoalDist" # 到目标的距离
]
我个人习惯把 ObstacleFootprint 的权重设得高一些,大概 5.0 左右。安全第一嘛。但有一次在密集的桌椅环境中,我发现机器人老是在原地打转——原来是 Oscillation 惩罚太狠了,稍微有点抖动就被判定为震荡。后来我把震荡检测的周期从 0.5 秒调到了 1.0 秒,问题就解决了。
4.2 TEB(Timed Elastic Band)—— 灵活但娇气
TEB 的思路和 DWB 完全不同。它把路径看成一条「弹性带」,通过优化带上的离散位姿点来生成轨迹。每个点都带有时间戳,所以叫「时间弹性带」。
你想想看,TEB 其实是在求解一个非线性优化问题。它要同时满足:避障、运动学约束、时间最优、轨迹平滑……这么多目标,参数自然就多了。
4.2.1 核心参数
| 参数名 | 默认值 | 说明 |
|---|---|---|
dyn_obstacle_inflation_radius |
0.6 | 动态障碍物的膨胀半径。设太小,机器人会贴着人走。 |
include_dynamic_obstacle |
true | 是否考虑动态障碍物。建议开启,除非你只在静态环境跑。 |
min_obstacle_dist |
0.5 | 到障碍物的最小距离。低于这个值,优化器会拼命远离。 |
weight_kinematics_forward_drive |
1.0 | 前向运动约束权重。阿克曼底盘建议设大一点。 |
weight_optimaltime |
1.0 | 时间最优权重。设太大,机器人会开得飞快。 |
max_global_plan_lookahead_dist |
3.0 | 向前看全局路径的距离。太长会忽略近处的障碍物。 |
我曾经踩过的坑:有一次在实验室里跑 TEB,机器人突然开始「蛇形走位」,左右摇摆个不停。查了半天,发现是 weight_kinematics_forward_drive 设成了 0.1,前向约束太弱了。差速底盘这个值至少得 100 以上,不然优化器会认为「横着走也没关系」。
4.2.2 TEB 的「脾气」
TEB 有个特点:它允许机器人后退。这在狭窄的走廊里特别有用——进不去就倒一把再进。但代价是,参数调不好就容易「抽风」。
我建议你从默认参数开始,先调 min_obstacle_dist 和 weight_optimaltime 这两个。前者决定安全距离,后者决定激进程度。其他参数,等跑起来发现问题再动。
4.3 MPPI(Model Predictive Path Integral)—— 暴力美学
MPPI 是 Nav2 里的新秀。它的做法很暴力:随机生成一大堆控制序列,然后用模型预测每条序列的未来轨迹,最后加权平均得到最优控制。
说白了,就是用「大力出奇迹」的方式做路径规划。采样数量够多,总能找到好路径。
4.3.1 核心参数
| 参数名 | 默认值 | 说明 |
|---|---|---|
num_samples |
1000 | 每次迭代的采样数。越多越好,但越慢。 |
num_iterations |
5 | 迭代次数。一般 3-5 次就够了。 |
sigma |
0.2 | 控制噪声的标准差。越大,探索范围越广。 |
temperature |
0.3 | 温度系数。控制采样的「随机性」。 |
model_dt |
0.1 | 模型预测的时间步长。越小越精确,但计算量也大。 |
costmap_weight |
1.0 | 代价地图的权重。避障强度。 |
性能提示:MPPI 的计算量跟 num_samples × num_iterations 成正比。1000 × 5 = 5000 次轨迹预测,CPU 版本大概需要 20-30ms。如果你有 GPU,可以轻松跑到 5000 × 10,效果会好很多。
4.3.2 什么时候用 MPPI?
我在做 AGV 项目时遇到过一种情况:仓库里堆满了各种形状的货物,DWB 老是卡在死角里,TEB 又震荡得厉害。换了 MPPI 之后,问题迎刃而解。因为它能「看到」更多可能性,不会一条道走到黑。
但代价是,你得有一块好显卡。如果用的是树莓派或者 Jetson Nano,我建议你还是老老实实用 DWB 吧。
4.4 三个规划器的对比总结
| 维度 | DWB | TEB | MPPI |
|---|---|---|---|
| 算法类型 | 速度空间采样 | 轨迹优化 | 随机采样 + 加权平均 |
| 计算开销 | 低 | 中 | 高(建议 GPU) |
| 参数数量 | 少(约 20 个) | 多(约 50 个) | 中(约 30 个) |
| 调参难度 | 简单 | 困难 | 中等 |
| 适用底盘 | 差速、全向 | 差速、阿克曼 | 通用 |
| 后退能力 | 不支持 | 支持 | 支持 |
| 动态避障 | 一般 | 好 | 优秀 |
我的选型建议:
- 做扫地机器人、送餐机器人 → 选 DWB,稳定可靠,调参快。
- 做自动驾驶小车、仓储 AGV → 选 TEB,轨迹平滑,能倒车。
- 做复杂环境巡检、特种机器人 → 选 MPPI,适应性强,但得配好硬件。
好了,局部规划器的核心内容就这些。记住一句话:参数是死的,场景是活的。别死记硬背参数值,多想想「这个参数在物理上代表什么」。理解了原理,调参就是水到渠成的事。