3、局部规划器参数调优:DWB与MPPI控制器参数详解、速度与加速度限制调整
局部规划器,说白了就是机器人的“脚”。全局规划告诉它往哪走,局部规划决定每一步怎么迈。我见过太多项目,全局路径规划得漂漂亮亮,结果机器人一跑起来就撞墙、抖动、原地转圈——问题全出在局部规划器上。
今天咱们就聊聊Nav2里两个主流的局部规划器:DWB和MPPI。我会结合自己踩过的坑,把参数调优的门道讲清楚。
3.1 DWB控制器:经典但需要耐心
DWB(Dynamic Window Approach)是ROS1时代就有的老将。它的核心思路很简单:在速度空间里采样,找一条能走、走得稳、离目标近的轨迹。
我个人习惯把DWB的参数分成三类:采样参数、代价权重、速度限制。咱们一个一个说。
3.1.1 采样参数
DWB会在每个控制周期里生成一堆候选轨迹。采样参数决定了这些轨迹的“密度”和“范围”。
| 参数名 | 默认值 | 我的推荐值 | 说明 |
|---|---|---|---|
| vx_samples | 20 | 10-15 | 线速度采样数。太多会卡,太少路径粗糙 |
| vy_samples | 5 | 3-5 | 横向速度采样。全向机器人用,差速设1就行 |
| vtheta_samples | 40 | 20-30 | 角速度采样。这个很关键,调大能改善转弯 |
| sim_time | 1.5 | 1.0-2.0 | 轨迹预测时长。太长容易“想太多” |
我记得有一次在仓库项目里,机器人总是在走廊里左右摇摆。查了半天,发现是vtheta_samples设得太低,只有10。采样点不够,转弯时找不到平滑的轨迹。提到30后,问题立刻解决了。
vx_samples和vtheta_samples。采样少了,计算快了,反而更稳。别盲目追求高采样。
3.1.2 代价权重
DWB用一组权重来评价每条轨迹的好坏。权重越大,对应的因素越重要。
# 典型的代价权重配置
DWBLocalPlanner:
path_distance_bias: 32.0 # 离全局路径的距离
goal_distance_bias: 24.0 # 离目标点的距离
occdist_scale: 0.02 # 障碍物代价
forward_point_distance: 0.325 # 前视距离
stop_on_failure: true
这里有个坑:occdist_scale千万别设太大。我曾经设到0.1,结果机器人离障碍物老远就开始急刹车,根本过不去窄门。0.02是个不错的起点,如果机器人太莽撞,可以慢慢提到0.03-0.04。
path_distance_bias和goal_distance_bias的比值决定了机器人是“贴线走”还是“抄近道”。比值接近1时,机器人会严格沿着全局路径走;比值差距大时,它会更倾向于直奔目标。我一般设32:24,稍微偏向路径。
3.2 MPPI控制器:新一代的“暴力美学”
MPPI(Model Predictive Path Integral)是Nav2里的新秀。它不采样速度,而是直接采样控制序列,然后用随机优化找最优解。说白了,它用计算量换平滑度。
我第一次用MPPI时,被它的参数数量吓了一跳——好几十个。但别慌,核心参数其实就几个。
3.2.1 核心参数
| 参数名 | 默认值 | 我的推荐值 | 说明 |
|---|---|---|---|
| iteration_count | 30 | 20-40 | 优化迭代次数。越高越平滑,但越慢 |
| batch_size | 1000 | 500-2000 | 每次迭代的轨迹数。越大越稳定 |
| time_steps | 56 | 40-60 | 预测的时间步数。影响前瞻距离 |
| model_predictive_controller_frequency | 20.0 | 10.0-20.0 | 控制频率。越高响应越快 |
嗯,这里要注意:batch_size和iteration_count是性能的“双刃剑”。我有个项目在工控机上跑,设了2000的batch和40次迭代,结果CPU直接飙到90%。后来降到500和20,效果差不太多,但CPU只有30%。
batch_size,而不是iteration_count。因为迭代次数少了,优化可能不收敛;但轨迹少了,只是“候选池”小一点,影响相对可控。
3.3 速度与加速度限制:安全底线
不管用DWB还是MPPI,速度和加速度限制都是必须设的。这不仅是性能问题,更是安全问题。
我见过最离谱的事:有人把最大速度设成2m/s,结果机器人在实验室里直接撞翻了一台显示器。你想想看,2m/s对于室内机器人来说,基本就是“狂奔”了。
3.3.1 速度限制
# DWB的速度限制
DWBLocalPlanner:
max_vel_x: 0.5 # 最大前进速度 (m/s)
min_vel_x: -0.1 # 最小前进速度 (负值表示后退)
max_vel_y: 0.0 # 最大横向速度 (差速机器人设0)
max_vel_theta: 1.0 # 最大角速度 (rad/s)
min_vel_theta: -1.0 # 最小角速度
min_in_place_vel_theta: 0.4 # 原地转弯的最小角速度
# MPPI的速度限制
MPPIController:
motion_model:
min_vel_x: 0.0
max_vel_x: 0.5
min_vel_theta: -1.0
max_vel_theta: 1.0
我个人习惯把max_vel_x设在0.3-0.5之间。室内环境0.3就够了,走廊可以到0.5。角速度1.0 rad/s大概相当于每秒转57度,转弯够用。
min_in_place_vel_theta设成0.2,结果机器人原地转弯时特别慢,像在“磨蹭”。后来提到0.4,转弯利索多了。这个值太小,机器人会“犹豫不决”。
3.3.2 加速度限制
加速度限制比速度限制更重要。为什么?因为加速度决定了机器人启动和刹车的“猛不猛”。
| 参数名 | DWB默认值 | MPPI默认值 | 我的推荐值 |
|---|---|---|---|
| acc_lim_x | 2.5 | 2.5 | 0.5-1.5 |
| acc_lim_y | 2.5 | 2.5 | 0.5-1.0 |
| acc_lim_theta | 3.2 | 3.2 | 1.0-2.0 |
| decel_lim_x | - | - | 1.0-2.0 |
你看默认值,2.5的加速度,意味着0.2秒就能从0加速到0.5m/s。这对大多数室内机器人来说太猛了。我一般降到0.8-1.2,起步和刹车都柔和很多。
decel_lim_x参数,专门控制刹车加速度。这个值一定要比acc_lim_x大一点。比如加速设1.0,刹车就设1.5。这样机器人能及时刹住,不会“冲过头”。我吃过这个亏,有一次没设刹车限制,机器人差点撞墙。
3.4 DWB vs MPPI:怎么选?
很多学员问我:到底用DWB还是MPPI?我的回答是:看场景。
- DWB适合:算力有限(树莓派、工控机)、环境简单、对实时性要求高
- MPPI适合:算力充足(Jetson、高性能PC)、环境复杂、追求平滑轨迹
我个人的经验:如果机器人是差速底盘,在室内跑,DWB完全够用。如果是全向底盘,或者需要在狭窄空间里频繁转弯,MPPI的优势就体现出来了——它生成的轨迹更平滑,不会出现DWB那种“锯齿状”的路径。
3.5 实战调优步骤
最后,我分享一下我的调优流程。这套方法我用了好几年,屡试不爽。
- 先设速度限制:把
max_vel_x设到0.3,acc_lim_x设到0.8。安全第一。 - 跑一圈看看:让机器人沿着简单路径走。观察有没有抖动、急刹、原地转圈。
- 调采样参数:如果抖动,降低采样数;如果路径粗糙,增加采样数。
- 调代价权重:如果机器人离障碍物太近,增加
occdist_scale;如果偏离路径,增加path_distance_bias。 - 逐步提速:每次增加0.1m/s的最大速度,跑一圈确认没问题再继续。
- 最后调加速度:如果起步太猛,降低
acc_lim_x;如果刹车太慢,提高decel_lim_x。
嗯,这套流程的核心就是“循序渐进”。别想着一步到位,调参是个细活。
这张图把本章的知识点串起来了。你可以看到,DWB和MPPI各有侧重,但最终都要落到速度和加速度限制上。调参时,别跳着来,按这个结构一步步走,稳得很。
好了,局部规划器的调优就聊到这儿。记住:参数是死的,场景是活的。多试、多跑、多观察,你很快就能找到最适合自己机器人的那组参数。