第三章:决策规划框架总览
大家好,我是你们的老朋友。今天我们来聊聊自动驾驶决策规划系统的整体架构。说实话,很多新手一上来就盯着某个算法猛学,结果发现拼不到一起。我个人习惯是,先看全局,再抠细节。就像盖房子,你得先知道哪是承重墙,哪是卫生间。
决策规划系统,说白了就是让车知道「要去哪、怎么走、走哪条线」。这三个问题,分别对应了三个层级:全局路径规划、行为决策、运动规划。它们像公司的三层管理:CEO定大方向,经理做战术安排,一线员工执行具体动作。
一、全局路径规划:给车一张「地图」
全局路径规划,也叫Route Planning。它的任务很简单:给定起点和终点,找出一条最优的宏观路径。注意,是宏观的,不是微观的。它不关心你具体怎么变道、怎么避障,只关心你走哪条路、上哪个高速、在哪个路口转弯。
我在项目中遇到过一个问题:有一次测试车在园区里跑,全局规划给了一条穿过草坪的路径。为什么?因为高精地图里那片草坪被标注成了「可通行区域」。嗯,这里要注意,全局规划的质量高度依赖地图数据的准确性。地图错了,规划再好也没用。
常用的算法有哪些?
- Dijkstra:经典的最短路径算法,稳,但慢。
- A*:加了启发式搜索,比Dijkstra快很多。我个人最常用这个。
- RRT:随机采样树,适合高维空间,但路径不一定最优。
你想想看,全局规划其实是个「离线」任务。它不需要实时更新,除非用户改了目的地。所以它的计算频率很低,一般几秒甚至几十秒更新一次就够了。
核心要点:全局路径规划的输出是一条由道路、路口、路段组成的序列。它不包含具体的车道信息,更不包含速度曲线。
二、行为决策:给车一个「大脑」
行为决策,也叫Behavioral Decision。这个层级负责回答「我现在该干什么?」。比如:是跟车还是变道?是加速超车还是减速让行?要不要在红灯前停下来?
我曾经踩过一个坑:行为决策模块输出「变道」指令,但运动规划模块发现旁边车道有车,于是拒绝执行。结果两个模块互相打架,车在车道线上来回摇摆。后来我加了一个「决策可行性检查」的环节,才解决这个问题。
行为决策的常见实现方式:
- 有限状态机(FSM):最传统的方式。定义几个状态:巡航、跟车、变道、停车等。状态之间通过条件转移。简单直观,但状态多了容易爆炸。
- 决策树:像if-else的升级版。可解释性强,但维护起来也累。
- 强化学习:最近很火。让车自己学,但可解释性差,你敢让它在高速上自己试错吗?我个人持保留态度。
行为决策的输出是什么?是一个驾驶意图。比如「保持当前车道,速度30km/h」或者「准备向左变道」。它不给出具体的路径点,只给出一个「指令」。
我的建议:行为决策模块一定要有「超时保护」。如果某个决策长时间无法执行,比如变道指令发了5秒还没变过去,就应该回退到安全状态,比如减速或停车。否则车会一直卡在那里。
三、运动规划:给车一双「手和脚」
运动规划,也叫Motion Planning。这是最底层、最精细的规划。它要生成一条平滑、安全、可执行的轨迹。这条轨迹包含位置、速度、加速度、甚至方向盘转角。
运动规划又分两部分:
- 路径规划:生成一条几何路径,也就是车要走的那条线。
- 速度规划:在这条路径上分配速度,也就是什么时候加速、什么时候减速。
我记得有一次调试,路径规划出来的曲线很平滑,但速度规划没做好,导致车在弯道里速度太快,差点侧滑。从那以后,我特别强调路径和速度要联合优化,不能分开搞。
常用的运动规划算法:
| 算法 | 特点 | 适用场景 |
|---|---|---|
| 多项式曲线 | 简单、平滑 | 低速、结构化道路 |
| 贝塞尔曲线 | 控制点直观 | 泊车、换道 |
| 样条曲线 | 分段平滑 | 高速、长距离 |
| 优化方法(MPC) | 考虑动力学约束 | 复杂场景、高速 |
运动规划的输出是一系列轨迹点,每个点包含:时间戳、x坐标、y坐标、航向角、速度、加速度。控制模块拿到这些点,再去控制油门、刹车、方向盘。
注意:运动规划必须满足车辆的动力学约束。比如最大转向角、最大加速度、最小转弯半径。你规划出一条完美的曲线,但车转不过去,那就是废纸一张。
四、三层架构如何协作?
这三层不是各干各的,而是层层递进、互相反馈的。我画个简单的流程:
全局路径规划 → 行为决策 → 运动规划 → 控制模块
↑ ↑ ↑
└──────────────┴────────────┘
反馈与重规划
举个例子:
- 全局规划说:走A路,在B路口右转。
- 行为决策说:当前车道前方有慢车,我决定变道超车。
- 运动规划说:好,我生成一条从当前车道到左车道的平滑轨迹,速度从40提到50。
- 控制模块执行。
如果运动规划发现变道轨迹不安全(比如左后方有车快速接近),它会反馈给行为决策:「变道不可行」。行为决策收到后,重新决策:那就跟车吧。
你看,这就是一个闭环。没有反馈的架构,就像蒙着眼睛开车,迟早出事。
总结一下:全局规划管「去哪」,行为决策管「怎么做」,运动规划管「怎么动」。三层各司其职,又紧密配合。搞懂这个框架,你再看具体的算法,就不会迷路了。
好了,这一章就到这里。下一章我们深入讲讲全局路径规划里的A*算法,我会带一个实际的代码例子。到时候见。