局部路径规划器:DWA、TEB与Regulated Pure Pursuit

局部路径规划,说白了就是机器人眼前这几米路怎么走。全局规划告诉你「绕过那堵墙」,局部规划则要回答「现在该左转5度还是右转3度」。我这些年调过的机器人,十有八九的问题都出在这一层——不是撞了墙,就是原地转圈。

今天咱们把三个主流局部规划器掰开揉碎讲清楚:DWA、TEB、Regulated Pure Pursuit。每个算法我都会结合项目里的坑来聊。

核心观点:没有最好的局部规划器,只有最适合你场景的。差速轮、全向轮、阿克曼转向,选型完全不同。

局部路径规划器知识体系 局部路径规划器 DWA 动态窗口法 TEB 时间弹性带 Regulated Pure Pursuit 核心思想 速度空间采样 + 轨迹预测 + 评价 核心思想 图优化 + 时间约束 路径+速度联合优化 核心思想 自适应前视距离 曲率约束 + 碰撞检测 适用场景 差速轮、全向轮 室内结构化环境 适用场景 阿克曼转向 狭窄通道、停车场 适用场景 阿克曼转向 高速、平滑路径需求

DWA算法:速度空间里的暴力美学

DWA(Dynamic Window Approach)的思路很直白:在当前时刻,机器人能加速到哪些速度?把这些速度组合全部采样,每条速度预测一段轨迹,然后打分,选最好的执行。

说白了就是三步走:

  1. 采样:在(v, ω)速度空间里,考虑电机加减速限制,生成一组可达速度对
  2. 预测:对每个速度对,用运动模型前向模拟一段轨迹(通常1-2秒)
  3. 评价:用评价函数给每条轨迹打分,选最优

评价函数长这样:

G(v, ω) = α · heading(v, ω) + β · dist(v, ω) + γ · velocity(v, ω)

三个分量的含义:

分量 含义 权重 我的经验
heading 轨迹终点朝向与目标方向的偏差 α 调大能让机器人更早转向目标
dist 轨迹与最近障碍物的距离 β 狭窄通道里必须加大
velocity 轨迹的平均速度 γ 调大机器人跑得快但容易急刹

调参技巧:我习惯先固定α和γ,单独调β。β太小会撞墙,β太大机器人会绕远路。找到一个临界值——刚好不撞墙,再微调α让路径更平滑。

DWA的优点是计算快、实现简单。缺点也很明显:它只考虑当前窗口内的轨迹,没有全局视野。我在一个仓库项目里遇到过——机器人被三个货架包围,DWA反复横跳就是出不来,因为每条轨迹都撞障碍物。

注意:DWA的采样分辨率很关键。vx_samples设太小,速度选择粗糙,路径抖动;设太大,计算量暴涨。我一般设6-8个,ω_samples设10-12个。

TEB算法:时间维度上的弹性带

TEB(Timed Elastic Band)的思路更优雅。它把路径看成一条「弹性带」,带子上每个点都关联一个时间戳。优化目标是在满足运动学约束的前提下,让这条带子既短又平滑,同时避开障碍物。

你想想看,DWA是「我看看现在能怎么走」,TEB是「我看看整条路怎么调整」。TEB的优化目标包含多个约束:

  • 路径长度:越短越好
  • 时间最优:总时间最小化
  • 障碍物距离:离障碍物越远越好
  • 运动学约束:速度、加速度、转弯半径不能超限
  • 动力学约束:加减速要平滑

TEB的核心参数我整理了一张表:

参数名 默认值 作用 调参建议
dt_ref 0.3 相邻位姿的时间间隔 减小让轨迹更精细,但计算量增大
max_vel_x 0.4 最大线速度 根据机器人硬件设定
max_vel_theta 0.5 最大角速度 阿克曼转向要设小一些
acc_lim_x 0.5 最大线加速度 调小让启停更平滑
weight_obstacle 50 障碍物约束权重 狭窄环境加大到80-100
weight_dynamic_obstacle 10 动态障碍物权重 人多的场景加大
weight_time 1.0 时间最优权重 调大让机器人走更快

我曾经在一个停车场项目里用TEB。阿克曼转向的AGV,要在狭窄车位里倒车入库。DWA死活倒不进去,换了TEB,把weight_obstacle调到80,dt_ref降到0.2,一次成功。为什么?因为TEB能看到整条倒车路径,提前规划转向时机。

关键区别:DWA是「采样+评价」,TEB是「优化+约束」。TEB更适合阿克曼转向和狭窄通道,但计算量更大,实时性不如DWA。

Regulated Pure Pursuit:纯追踪的进化版

Pure Pursuit(纯追踪)是个老算法了。它找一个前视点,然后算圆弧曲率,让机器人沿着圆弧追过去。Regulated Pure Pursuit在它基础上加了三个「调节器」:

  • 曲率约束:转弯太急时自动减速
  • 碰撞检测:前视点附近有障碍物时重新选点
  • 自适应前视距离:速度越快,前视越远

核心参数就这几个:

参数 说明 我的推荐值
lookahead_dist 基础前视距离 0.5-1.0m(室内)
min_lookahead_dist 最小前视距离 0.3m
max_lookahead_dist 最大前视距离 1.5m
lookahead_time 前视时间(用于自适应计算) 1.5-2.0s
rotate_to_heading 是否原地旋转对准目标 true(差速轮)
use_velocity_scaled_lookahead 是否根据速度缩放前视距离 true

这个算法最适合阿克曼转向的机器人。为什么?因为Pure Pursuit天然输出圆弧轨迹,阿克曼转向正好走圆弧。我调过一台割草机器人,用的就是Regulated Pure Pursuit。草坪上障碍物少,路径平滑,跑起来很稳。

避坑指南:我曾经把lookahead_dist设得太大(2.5m),结果机器人过弯时直接切内线,撞上路沿。前视距离不是越大越好,要根据机器人尺寸和转弯半径来。一般取车长的1.5-2倍。

轨迹评价函数权重调优

不管用哪个规划器,最后都绕不开权重调优。我总结了一套「三步调参法」:

  1. 单变量测试:只调一个权重,其他固定。看机器人行为变化
  2. 边界测试:把权重调到极端值(0和最大值),理解每个分量的极限行为
  3. 场景测试:在典型场景里反复跑,记录失败模式

以DWA为例,调参顺序我建议这样:

  • 先把β(障碍物距离权重)调到最大,确保机器人不撞墙
  • 然后调α(朝向权重),让机器人能顺利转向目标
  • 最后调γ(速度权重),在安全和效率之间找平衡

嗯,这里要注意:权重不是越大越好。β太大,机器人离墙八丈远就开始绕路,明明能过去的地方它偏不走。我见过一个案例,工程师把β调到200,结果机器人走S形,因为每条轨迹都离障碍物远远的。

常见误区:很多人一上来就调所有参数。我的建议是——先调一个,跑到极限,再调下一个。一次只动一个参数,记录每次变化的效果。调参不是玄学,是实验科学。

最后说一句:没有万能参数。换一个场景、换一台机器人,参数就得重新调。但理解了每个参数背后的物理意义,你就能快速找到合适的值。这就是我为什么花这么多篇幅讲原理——原理懂了,调参就是水到渠成的事。