局部路径规划器:DWA、TEB与Regulated Pure Pursuit
局部路径规划,说白了就是机器人眼前这几米路怎么走。全局规划告诉你「绕过那堵墙」,局部规划则要回答「现在该左转5度还是右转3度」。我这些年调过的机器人,十有八九的问题都出在这一层——不是撞了墙,就是原地转圈。
今天咱们把三个主流局部规划器掰开揉碎讲清楚:DWA、TEB、Regulated Pure Pursuit。每个算法我都会结合项目里的坑来聊。
核心观点:没有最好的局部规划器,只有最适合你场景的。差速轮、全向轮、阿克曼转向,选型完全不同。
DWA算法:速度空间里的暴力美学
DWA(Dynamic Window Approach)的思路很直白:在当前时刻,机器人能加速到哪些速度?把这些速度组合全部采样,每条速度预测一段轨迹,然后打分,选最好的执行。
说白了就是三步走:
- 采样:在(v, ω)速度空间里,考虑电机加减速限制,生成一组可达速度对
- 预测:对每个速度对,用运动模型前向模拟一段轨迹(通常1-2秒)
- 评价:用评价函数给每条轨迹打分,选最优
评价函数长这样:
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倍。
轨迹评价函数权重调优
不管用哪个规划器,最后都绕不开权重调优。我总结了一套「三步调参法」:
- 单变量测试:只调一个权重,其他固定。看机器人行为变化
- 边界测试:把权重调到极端值(0和最大值),理解每个分量的极限行为
- 场景测试:在典型场景里反复跑,记录失败模式
以DWA为例,调参顺序我建议这样:
- 先把β(障碍物距离权重)调到最大,确保机器人不撞墙
- 然后调α(朝向权重),让机器人能顺利转向目标
- 最后调γ(速度权重),在安全和效率之间找平衡
嗯,这里要注意:权重不是越大越好。β太大,机器人离墙八丈远就开始绕路,明明能过去的地方它偏不走。我见过一个案例,工程师把β调到200,结果机器人走S形,因为每条轨迹都离障碍物远远的。
常见误区:很多人一上来就调所有参数。我的建议是——先调一个,跑到极限,再调下一个。一次只动一个参数,记录每次变化的效果。调参不是玄学,是实验科学。
最后说一句:没有万能参数。换一个场景、换一台机器人,参数就得重新调。但理解了每个参数背后的物理意义,你就能快速找到合适的值。这就是我为什么花这么多篇幅讲原理——原理懂了,调参就是水到渠成的事。