一、路径规划概述:自动驾驶中的规划层级
说实话,刚入行那会儿,我对「路径规划」的理解特别简单——不就是找条路走吗?后来真正上手做项目才发现,这里面的门道深着呢。
自动驾驶的规划系统,我习惯把它拆成三个层级来看:
- 任务规划:决定去哪。比如从北京开到上海,走哪条高速。
- 行为决策:决定怎么开。比如前面有车挡着,是超车还是跟着?
- 运动规划:决定具体怎么动。比如超车时方向盘打多少度,油门踩多深。
这三个层级,说白了就是「想什么→做什么→怎么做」的关系。你想想看,如果任务规划说去上海,但行为决策在高速上非要跟车不超车,那运动规划再精细也没用。
核心要点:规划层级不是割裂的,而是层层递进、相互约束的。上层给下层定目标,下层反馈执行结果给上层调整。
1.1 全局规划 vs 局部规划
这两个概念,我经常被新人问混。其实区分起来很简单:
| 对比维度 | 全局规划 | 局部规划 |
|---|---|---|
| 时间尺度 | 分钟~小时级 | 毫秒~秒级 |
| 空间范围 | 公里级(整条路线) | 米级(当前车道+周边) |
| 更新频率 | 低(几秒~几分钟一次) | 高(10~50Hz) |
| 典型算法 | A*、Dijkstra、RRT | DWA、TEB、MPC |
| 输入数据 | 高精地图、路网 | 传感器实时数据 |
我在项目中遇到过最典型的坑:全局规划给了一条「最优路径」,但局部规划发现这条路被临时施工堵死了。嗯,这时候就需要行为决策来协调了。
我的习惯:全局规划我一般用A*做粗搜索,再用Hybrid A*做平滑。局部规划则偏好MPC,因为它能显式处理车辆动力学约束。
1.2 行为决策的角色定位
行为决策这个模块,说白了就是「自动驾驶的脑子」。它不负责具体怎么打方向盘,而是决定「现在该干什么」。
举个例子:你开着车在高速上,前面有辆慢车。行为决策要回答这几个问题:
- 要不要超车?(决策意图)
- 现在超车安全吗?(风险评估)
- 如果超车,走左边还是右边?(行为选择)
- 超车过程中如果后车加速怎么办?(应急策略)
我曾经在一个项目中,行为决策模块写得太死板——只要前车速度低于设定值就超车。结果有一次在隧道里,前车确实慢,但隧道禁止变道。嗯,那次差点出事。从那以后,我坚持行为决策必须融合地图信息。
避坑指南:行为决策不能只看当前帧数据。我建议至少维护一个3~5秒的「决策历史窗口」,用来判断意图的稳定性。比如前车减速了1秒,可能是正常波动;但连续减速3秒,那大概率是要停车了。
1.3 三个层级的协作关系
你想想看,这三个层级是怎么配合的?我画个简单的流程:
任务规划(全局路径)
↓
行为决策(当前意图:跟车/超车/停车)
↓
运动规划(具体轨迹:速度曲线+路径点)
↓
控制执行(油门/刹车/转向)
↑
反馈循环(实际状态 vs 规划状态)
这里有个关键点:反馈是双向的。运动规划发现轨迹不可行(比如曲率太大),要告诉行为决策「这个意图执行不了」,行为决策就得换个方案。
我记得有一次调试,运动规划总是报「轨迹跟踪误差过大」。查了半天,原来是行为决策在弯道前才决定减速,但运动规划已经来不及生成平滑的减速曲线了。后来我加了个「意图预判」机制——行为决策提前200ms把意图发给运动规划,问题就解决了。
个人经验:好的规划系统,三个层级之间的接口一定要定义清楚。我习惯用「意图+参数」的结构:行为决策发一个意图(如LANE_CHANGE),附带参数(目标车道、期望速度、安全距离)。运动规划根据这个意图去生成具体轨迹。
1.4 实际项目中的常见问题
做路径规划这些年,我踩过不少坑。挑几个典型的说说:
- 全局规划太理想化:A*找出来的路径,曲率可能突变,车辆根本走不了。解决办法:加平滑后处理,或者直接用Hybrid A*。
- 局部规划视野太短:只看眼前3米,遇到大弯道容易「撞墙」。我建议局部规划的视野至少覆盖未来5~8秒的行驶距离。
- 行为决策反应太慢:决策周期100ms,但紧急情况需要20ms响应。解决方案:加一个「应急决策」模块,优先级最高,绕过正常决策流程。
一个小技巧:调试规划系统时,我习惯把每个层级的输出都可视化出来。全局路径画成粗线,局部轨迹画成细线,行为决策用文字标注在车头上。一眼就能看出问题出在哪一层。
好了,这一章的内容就这些。下一章我们会深入行为决策的具体算法——有限状态机、决策树、还有基于学习的决策方法。到时候我会拿实际项目中的代码来讲解。