第一章:决策规划基础
大家好,我是你们这门课的主讲。在自动驾驶这个行当摸爬滚打了好些年,踩过不少坑,也积累了一些经验。今天咱们开始第一讲,聊聊决策规划最基础的东西。
说实话,很多人一上来就盯着各种高大上的算法看,什么A*、RRT*、Lattice Planner。但我个人习惯,先把这个地基打牢。你想想看,如果连状态空间和动作空间都分不清,后面写代码肯定要出大问题。
1.1 状态空间与动作空间
先问大家一个问题:自动驾驶的车,它到底「知道」些什么?又能「做」些什么?
状态空间,说白了就是车辆当前所处的所有可能情况的集合。我习惯把它分成三块:
- 自车状态:位置(x, y)、航向角(yaw)、速度、加速度、方向盘转角。这些是基础。
- 环境状态:车道线、路沿、交通标志、红绿灯。嗯,这里要注意,环境不是一成不变的。
- 交互状态:周围其他车辆的位置、速度、意图。这个最难搞。
重要概念:状态空间的维度决定了问题的复杂度。每增加一个维度,计算量可能翻倍。这就是所谓的「维度灾难」。
动作空间就好理解了——车能执行什么操作?
我见过不少新手,把动作空间设计得特别细,什么「方向盘左打5度」、「油门踩30%」。其实没必要。在决策规划层面,我们通常用更抽象的动作:
- 纵向动作:加速、匀速、减速、停车
- 横向动作:直行、向左换道、向右换道
举个例子,我在做高速巡航项目时,动作空间就只定义了5种:保持车道、左换道、右换道、跟车、紧急制动。简单但够用。
个人经验:动作空间不是越细越好。太细了,搜索空间爆炸;太粗了,又不够灵活。我一般建议先粗后细,跑通了再优化。
1.2 路径规划与轨迹规划的区别
这个问题,我面试的时候必问。很多人答不上来,或者答得模棱两可。
路径规划,只关心「走哪条路」。它输出一条几何曲线,不关心时间。比如从A点到B点,沿着哪条车道走,什么时候变道。路径规划的结果是一条空间曲线。
轨迹规划,关心的是「怎么走」。它不仅要给出路径,还要给出每个时刻的速度、加速度。说白了,轨迹 = 路径 + 时间信息。
我给大家画个重点:
| 对比项 | 路径规划 | 轨迹规划 |
|---|---|---|
| 输出 | 几何曲线 (x, y) | 时间序列 (x, y, v, a, t) |
| 约束 | 避障、道路边界 | 避障 + 动力学 + 舒适性 |
| 典型算法 | A*、Dijkstra、RRT | Lattice Planner、MPC |
我曾经在一个项目中,路径规划做得很好,但轨迹规划没跟上。结果呢?车是能绕开障碍物,但一加速一减速,乘客直接晕车。这就是只做了路径规划,没做轨迹规划的后果。
避坑指南:千万不要把路径规划和轨迹规划混为一谈。路径规划只管「能不能到」,轨迹规划管「能不能舒服地到」。两者缺一不可。
1.3 决策规划算法的评价指标
好,现在问题来了:我们写了一大堆算法,怎么评价它好不好?我总结了四个核心指标。
安全性
这是底线,没得商量。安全性的核心是碰撞检测。我习惯用「安全距离」来衡量——在任何时刻,自车与障碍物的距离必须大于某个阈值。
但这里有个坑:安全距离设大了,车开得畏畏缩缩;设小了,又容易出事故。我一般会动态调整:高速时距离大一些,低速时小一些。
舒适性
说白了就是乘客的感受。主要看三个东西:
- 加速度变化率(Jerk):这个最重要。Jerk太大,人会前仰后合。
- 横向加速度:转弯时太猛,乘客会往一边倒。
- 方向盘转角变化率:频繁打方向,体验极差。
我记得有一次测试,算法在避障时Jerk达到了8 m/s³,测试工程师直接说「这车是不是新手开的?」从那以后,我把Jerk的约束加到了优化目标里。
实时性
自动驾驶是实时系统。你算得再好,如果算得太慢,车都撞上了才给出结果,那等于零。
我一般要求:决策规划模块的周期不能超过100ms。对于紧急情况,最好控制在50ms以内。怎么优化?
- 减少搜索空间
- 用启发式方法加速
- 必要时做降采样
最优性
这个指标比较微妙。什么是最优?最短路径?最省油?最舒适?
我个人习惯,把最优性定义为一个加权目标函数:
J = w1 * 行驶时间 + w2 * 能耗 + w3 * 舒适性惩罚 + w4 * 安全惩罚
权重怎么调?没有标准答案。我一般先给安全权重设最大,然后根据实际路测效果微调。
核心观点:这四个指标是相互矛盾的。安全性高了,可能实时性就差;舒适性好了,最优性可能下降。做决策规划,本质上就是在四个指标之间找平衡。
好了,第一章的内容就到这里。咱们把基础概念理清了,后面讲具体算法的时候,你就能知道每个算法到底在解决什么问题。下一章,我们聊聊搜索算法在路径规划中的应用。