第四章 局部规划器DWA详解

大家好,我是你们的导航实战讲师。今天我们来聊聊DWA——这个在Nav2里最常用的局部规划器。说实话,我刚开始接触ROS导航时,总觉得DWA像个黑盒子,调参全靠蒙。后来踩了不少坑,才慢慢摸清它的脾气。

DWA全称是Dynamic Window Approach,动态窗口法。名字听着玄乎,说白了就是:在每一时刻,只考虑机器人当前速度能到达的那些轨迹,然后从中挑一条最好的。嗯,就这么简单。

DWA 局部规划器核心流程 ① 速度采样空间 (v, ω) 组合生成 ② 轨迹预测 模拟未来一段路径 ③ 轨迹评价 打分排序 输出 轨迹评价函数 G(v, ω) = α·heading(v, ω) + β·dist(v, ω) + γ·vel(v, ω) heading:朝向目标 dist:障碍物距离 vel:前进速度 α, β, γ 为权重系数,三者之和通常归一化为1

4.1 DWA的核心原理

DWA为什么叫「动态窗口」?我打个比方你就明白了。你开车时,不可能瞬间从静止加速到100码,也不可能原地掉头——你的速度变化受限于加速度和转向能力。DWA做的,就是把这个「可行速度范围」算出来,形成一个窗口。

这个窗口每时每刻都在变化,所以叫「动态」。窗口内的每个速度组合 (v, ω) 都对应一条未来轨迹。DWA会模拟这些轨迹,然后打分,选最好的那个发出去。

核心思想: 与其在全局速度空间里瞎找,不如只盯着当前能到达的速度范围。这样计算量小,反应还快。

4.2 速度采样空间

速度采样空间,就是DWA「考虑」的所有可能速度组合。它受三个约束限制:

  1. 自身速度极限:机器人能跑多快?能转多急?比如最大线速度0.5 m/s,最大角速度1.0 rad/s。
  2. 电机加减速能力:这是动态窗口的关键。就算你最大速度是0.5,但当前只有0.2,下一时刻你最多能加速到多少?这取决于加速度上限。
  3. 安全制动约束:在碰到障碍物前,必须能刹住车。如果某个速度组合会导致撞上,直接剔除。

我记得有一次调试AGV小车,发现机器人老是急刹车。查了半天,原来是acc_lim_x设得太小,DWA以为它刹不住,所以不敢加速。调大之后,运动就平滑多了。

调参小技巧: 如果你发现机器人运动很「犹豫」,走走停停,多半是加速度限制太保守。可以适当增大 acc_lim_x 和 acc_lim_theta。

4.3 轨迹评价函数

采样完了,怎么选?DWA用三个指标给每条轨迹打分:

评价项 符号 含义 权重
朝向偏差 heading 轨迹末端朝向与目标方向的夹角,越小越好 α (默认5.0)
障碍物距离 dist 轨迹与最近障碍物的距离,越远越好 β (默认0.2)
前进速度 vel 轨迹对应的线速度,越快越好 γ (默认0.2)

最终得分是加权和:G = α * heading + β * dist + γ * vel。得分最高的轨迹胜出。

4.3.1 heading——朝向目标

这个指标说白了就是:你走的这条轨迹,最终方向是不是冲着目标点去的?如果轨迹末端朝向和目标方向偏差小,得分就高。

我遇到过一个问题:机器人到了目标点附近,却一直在原地转圈。后来发现是heading权重太高,机器人太在意「面向目标」,反而忽略了「靠近目标」。调低α值后,问题解决了。

4.3.2 dist——障碍物距离

这个指标评价轨迹的安全性。DWA会检查轨迹上每个点与障碍物的距离,取最小值作为得分依据。距离越远,得分越高。

但这里有个坑:如果dist权重太大,机器人会变得「过度谨慎」,离障碍物老远就停下来。我曾经在仓库项目里遇到这种情况,机器人死活不肯进窄通道。后来把β从0.3降到0.15,它才敢走。

注意: 如果轨迹上某个点与障碍物的距离小于机器人半径,这条轨迹会被直接丢弃(视为碰撞)。这是硬约束,不参与打分。

4.3.3 vel——前进速度

这个指标鼓励机器人跑快一点。说白了,同样的条件下,速度快的轨迹得分更高。但权重不能太大,否则机器人会为了速度牺牲安全性和方向准确性。

我个人习惯把γ设在0.1~0.3之间。如果任务要求效率优先(比如巡检机器人),可以适当调高;如果要求精准(比如对接工位),就调低。

4.4 三个权重的平衡艺术

调参说白了就是找平衡。α、β、γ三个权重加起来通常等于1(或者归一化处理)。我总结了一个经验公式:

  • α (heading) 最大:一般占0.5~0.7。因为局部规划的首要任务是朝着目标走。
  • β (dist) 次之:占0.15~0.3。安全很重要,但别让它成为绊脚石。
  • γ (vel) 最小:占0.1~0.2。速度是锦上添花,不是核心。

当然,这只是起点。实际项目中要根据场景微调。比如在密集货架区,我会把β调高到0.4;在开阔走廊,我会把γ调高到0.3。

避坑指南: 我曾经在调试时把三个权重设成1:1:1,结果机器人像个无头苍蝇——既想冲目标,又想躲障碍,还想跑快,最后哪个都没做好。记住,权重是「优先级」,不是「重要性」。

4.5 代码层面的关键参数

在Nav2的DWA配置中,你会在YAML文件里看到这些参数:

# DWA 局部规划器配置示例
DWAPlannerROS:
  # 速度限制
  max_vel_x: 0.5
  min_vel_x: 0.0
  max_vel_theta: 1.0
  min_vel_theta: -1.0
  
  # 加速度限制(动态窗口的关键)
  acc_lim_x: 2.5
  acc_lim_theta: 3.2
  
  # 轨迹评价权重
  path_distance_bias: 5.0      # 对应 α (heading)
  goal_distance_bias: 0.2      # 对应 β (dist) 
  occdist_scale: 0.2           # 对应 γ (vel)
  
  # 采样参数
  sim_time: 1.5                # 轨迹模拟时间
  vx_samples: 20               # 线速度采样数
  vtheta_samples: 40           # 角速度采样数

注意看,Nav2里这三个权重的命名和理论不太一样:path_distance_bias 对应 heading,goal_distance_bias 对应 dist,occdist_scale 对应 vel。我第一次看到时也懵了,后来翻源码才确认。

调试建议: 先用默认参数跑一遍,观察机器人的行为。如果它「太冲」,就降低γ或提高β;如果它「太怂」,就降低β或提高α。每次只改一个参数,改完跑一圈看看效果。

好了,DWA的核心原理就讲到这里。说白了就是三步:采样、模拟、打分。你只要理解了速度窗口怎么算、三个权重怎么调,大部分避障问题都能搞定。下一节我们会聊DWA的进阶调参技巧,包括如何应对动态障碍物和窄通道场景。