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%。

经验之谈:MPPI对计算资源要求高。如果你的机器人算力有限,优先降低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,起步和刹车都柔和很多。

特别提醒:MPPI里有个decel_lim_x参数,专门控制刹车加速度。这个值一定要比acc_lim_x大一点。比如加速设1.0,刹车就设1.5。这样机器人能及时刹住,不会“冲过头”。我吃过这个亏,有一次没设刹车限制,机器人差点撞墙。

3.4 DWB vs MPPI:怎么选?

很多学员问我:到底用DWB还是MPPI?我的回答是:看场景。

  • DWB适合:算力有限(树莓派、工控机)、环境简单、对实时性要求高
  • MPPI适合:算力充足(Jetson、高性能PC)、环境复杂、追求平滑轨迹

我个人的经验:如果机器人是差速底盘,在室内跑,DWB完全够用。如果是全向底盘,或者需要在狭窄空间里频繁转弯,MPPI的优势就体现出来了——它生成的轨迹更平滑,不会出现DWB那种“锯齿状”的路径。

一句话总结:DWB是“够用就好”,MPPI是“精益求精”。选哪个,取决于你的硬件和需求。

3.5 实战调优步骤

最后,我分享一下我的调优流程。这套方法我用了好几年,屡试不爽。

  1. 先设速度限制:把max_vel_x设到0.3,acc_lim_x设到0.8。安全第一。
  2. 跑一圈看看:让机器人沿着简单路径走。观察有没有抖动、急刹、原地转圈。
  3. 调采样参数:如果抖动,降低采样数;如果路径粗糙,增加采样数。
  4. 调代价权重:如果机器人离障碍物太近,增加occdist_scale;如果偏离路径,增加path_distance_bias。
  5. 逐步提速:每次增加0.1m/s的最大速度,跑一圈确认没问题再继续。
  6. 最后调加速度:如果起步太猛,降低acc_lim_x;如果刹车太慢,提高decel_lim_x。

嗯,这套流程的核心就是“循序渐进”。别想着一步到位,调参是个细活。

我的习惯:每次只改一个参数,改完就跑一圈。改多了,你根本不知道是哪个参数起了作用。我曾经一次性改了5个参数,结果机器人乱跑,排查了整整一下午。
局部规划器参数调优知识体系 局部规划器调优 DWB 控制器 MPPI 控制器 速度与加速度限制 采样参数 代价权重 速度限制 迭代与批次 时间步数 控制频率 最大/最小速度 加速度限制 刹车加速度 核心原则:安全第一 → 循序渐进 → 一次只改一个参数 DWB适合算力有限场景,MPPI适合追求平滑轨迹场景

这张图把本章的知识点串起来了。你可以看到,DWB和MPPI各有侧重,但最终都要落到速度和加速度限制上。调参时,别跳着来,按这个结构一步步走,稳得很。

好了,局部规划器的调优就聊到这儿。记住:参数是死的,场景是活的。多试、多跑、多观察,你很快就能找到最适合自己机器人的那组参数。