3、局部路径规划参数:DWA算法参数详解、速度采样空间、预测轨迹时长

局部路径规划里,DWA(Dynamic Window Approach)是我用得最多的算法。说白了,它就是个“贪心”的决策器——每一帧都从当前状态出发,采样一堆可能的运动,然后挑一条最好的轨迹去执行。

但问题来了:采样怎么采?轨迹怎么评?时长设多长?这三个问题没搞清楚,机器人要么原地打转,要么一头撞墙。我刚开始调DWA的时候,就吃过不少亏。

3.1 DWA的核心思想:速度空间里的“窗口”

DWA不直接规划路径,它规划的是速度。每一帧,机器人根据当前速度、加速度限制、障碍物距离,算出一个“能安全到达的速度集合”——这就是动态窗口。

然后在这个窗口里采样多组(v, ω),模拟未来一段时间的轨迹,选代价最小的执行。

核心公式(简化版):

Vr = Vs ∩ Va ∩ Vd
  • Vs:机器人硬件能跑的速度范围(最大最小线速度、角速度)
  • Va:电机加减速能力决定的“下一帧能到达的速度”
  • Vd:能安全停下(不撞障碍物)的速度集合

三者的交集,就是动态窗口。

嗯,这里要注意:Vd 是DWA能避障的关键。如果窗口里所有速度都会撞,那机器人就只能急刹。我曾经在仓库项目里遇到过——货架通道太窄,Vd直接为空,机器人原地愣住。后来加了“减速绕行”的兜底逻辑才解决。

3.2 速度采样空间:到底要采多少组?

采样空间由三个参数控制:

参数 含义 典型值 我踩过的坑
max_vel_x / min_vel_x 线速度范围(m/s) 0.0 ~ 0.5 设太大,转弯时侧滑严重
max_vel_theta / min_vel_theta 角速度范围(rad/s) -1.0 ~ 1.0 设太小,原地掉头要转半天
vx_samples / vtheta_samples 线速度/角速度采样份数 6 ~ 10 / 10 ~ 20 采样太多,CPU扛不住

你想想看,如果vx_samples=10,vtheta_samples=20,那每帧就要算200条轨迹。在嵌入式平台上,这很容易把CPU吃满。我个人习惯:先设小(6×10=60条),跑通了再慢慢加。

小技巧: 如果机器人主要走直线,可以适当减少vtheta_samples;如果经常原地旋转,就多分几份角速度。我在AGV项目里就是这么干的——直线段用4×8,转弯区域动态切换到8×16。

3.3 预测轨迹时长:看多远,决定稳不稳

这个参数叫 sim_time,单位秒。它决定了DWA模拟轨迹的时候,往前看多久。

  • sim_time 太短(0.5s以下):机器人只看眼前,容易钻死角,或者频繁急转弯。
  • sim_time 太长(3s以上):计算量大,而且预测不准——环境一变,轨迹就废了。
  • 我常用的范围:1.0s ~ 2.0s,室内移动机器人1.5s是个不错的起点。

为什么会这样?因为DWA假设未来一段时间内障碍物不动。sim_time越长,这个假设越容易失效。我记得在动态人多的场景里,sim_time设到2.5s,机器人经常对着人预测一条“完美绕行轨迹”,结果人一动,轨迹直接撞上。

避坑指南: 我曾经在走廊场景里把sim_time设到3.0s,结果机器人每次到拐角都提前减速,后面的人以为它坏了。后来改成1.2s,配合更频繁的规划周期,反而更流畅。

3.4 轨迹评价函数:谁是好轨迹?

采样完轨迹,DWA用加权打分来选最优。ROS里默认的评价项有:

cost = α * 朝向代价 + β * 障碍物代价 + γ * 速度代价 + δ * 路径跟随代价

每个权重的意义:

权重 含义 调大效果 调小效果
α(朝向) 轨迹终点朝向与目标方向的偏差 机器人更早转向目标 容易走“之”字形
β(障碍物) 轨迹离障碍物的最近距离 避障更激进 容易贴边蹭墙
γ(速度) 鼓励走快还是走慢 跑得快,但转弯急 慢吞吞,但安全
δ(路径跟随) 轨迹与全局路径的贴合度 严格走全局路径 绕路但灵活

我个人习惯:先调β和γ。障碍物权重太低,机器人会撞;速度权重太高,转弯会甩尾。我一般把β设为γ的2~3倍,保证安全优先。

3.5 DWA参数调优流程(我自己的套路)

  1. 固定sim_time=1.5s,采样数先用6×10。
  2. 调速度范围:让机器人能正常走直线、转直角弯。
  3. 调β(障碍物权重):在障碍物前1米左右开始减速,不撞就行。
  4. 调γ(速度权重):让机器人尽量走快,但不出现急刹。
  5. 最后调α和δ:如果机器人总跑偏,就加大α;如果总抄近道,就加大δ。

记住: 每次只改一个参数,改完跑一圈看看效果。我见过太多人一次改三个参数,然后不知道问题出在哪。

3.6 DWA参数与速度采样空间关系图

下面这张图展示了DWA的核心流程:从速度空间到动态窗口,再到轨迹采样和评价。

DWA参数与速度采样空间关系图 速度空间 Vs 硬件极限范围 加速度约束 Va 电机加减速能力 安全约束 Vd 能刹停的速度集合 动态窗口 Vr Vs ∩ Va ∩ Vd 轨迹采样 vx_samples × vtheta_samples 轨迹评价 α·朝向 + β·障碍物 + γ·速度 执行最优轨迹 关键参数速查 • sim_time:预测时长,推荐1.0~2.0s • vx_samples / vtheta_samples:采样密度,推荐6~10 / 10~20 • 权重优先级:β(障碍物)> γ(速度)> α(朝向)> δ(路径跟随)

3.7 实战调参建议

如果你用的是ROS Navigation Stack,DWA参数通常在 dwa_local_planner_params.yaml 里。我建议你这样开始:

DWAPlannerROS:
  # 速度范围
  max_vel_x: 0.5
  min_vel_x: 0.0
  max_vel_theta: 1.0
  min_vel_theta: -1.0
  
  # 加速度限制
  acc_lim_x: 0.5
  acc_lim_theta: 0.8
  
  # 采样参数
  vx_samples: 8
  vtheta_samples: 16
  
  # 预测时长
  sim_time: 1.5
  
  # 权重
  path_distance_bias: 32.0    # δ
  goal_distance_bias: 24.0    # α
  occdist_scale: 0.5          # β(注意:这里值越小,避障越激进)
  forward_point_distance: 0.3 # 前视距离

一个小秘密: occdist_scale 这个参数,ROS里默认是0.01,但实际用起来太小了。我一般从0.5开始调,如果机器人离障碍物太近才转向,就加大到1.0;如果离老远就开始绕,就减小到0.2。

好了,DWA的参数就这些。你调的时候别急,一个一个来。先把sim_time和采样数固定,再调权重,最后微调速度范围。这样走一遍,机器人的表现基本就稳了。