4、局部规划器参数详解:DWB、TEB、MPPI算法原理与核心参数

聊完了全局规划,咱们得把目光放到「脚下」了。局部规划器,说白了就是机器人「走一步看一步」的控制器。它负责把全局路径切成小段,再结合实时的激光雷达或点云数据,算出一条安全又平滑的局部轨迹。

ROS2 Nav2里主流的局部规划器有三个:DWB、TEB 和 MPPI。我这些年做项目,这三个家伙都打过不少交道。今天我就把它们的脾气秉性和核心参数,给你掰开了揉碎了讲清楚。

核心观点:没有最好的规划器,只有最合适的场景。DWB 稳如老狗,TEB 灵活但娇气,MPPI 暴力但吃算力。

局部规划器选型决策树 全局路径 + 传感器数据 DWB 动态窗口法 · 采样速度空间 TEB 时间弹性带 · 优化轨迹 MPPI 模型预测路径积分 · 随机采样 ✅ 计算量小,实时性高 ✅ 适合差速/全向底盘 ⚠️ 狭窄通道容易卡住 ✅ 轨迹平滑,支持后退 ✅ 适合阿克曼/汽车底盘 ⚠️ 参数敏感,容易震荡 ✅ 复杂环境适应性强 ✅ 支持自定义代价函数 ⚠️ GPU加速才够用

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,适应性强,但得配好硬件。

好了,局部规划器的核心内容就这些。记住一句话:参数是死的,场景是活的。别死记硬背参数值,多想想「这个参数在物理上代表什么」。理解了原理,调参就是水到渠成的事。