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参数调优流程(我自己的套路)
- 固定sim_time=1.5s,采样数先用6×10。
- 调速度范围:让机器人能正常走直线、转直角弯。
- 调β(障碍物权重):在障碍物前1米左右开始减速,不撞就行。
- 调γ(速度权重):让机器人尽量走快,但不出现急刹。
- 最后调α和δ:如果机器人总跑偏,就加大α;如果总抄近道,就加大δ。
记住: 每次只改一个参数,改完跑一圈看看效果。我见过太多人一次改三个参数,然后不知道问题出在哪。
3.6 DWA参数与速度采样空间关系图
下面这张图展示了DWA的核心流程:从速度空间到动态窗口,再到轨迹采样和评价。
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和采样数固定,再调权重,最后微调速度范围。这样走一遍,机器人的表现基本就稳了。