第一章:决策规划基础

大家好,我是你们这门课的主讲。在自动驾驶这个行当摸爬滚打了好些年,踩过不少坑,也积累了一些经验。今天咱们开始第一讲,聊聊决策规划最基础的东西。

说实话,很多人一上来就盯着各种高大上的算法看,什么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 * 安全惩罚

权重怎么调?没有标准答案。我一般先给安全权重设最大,然后根据实际路测效果微调。

核心观点:这四个指标是相互矛盾的。安全性高了,可能实时性就差;舒适性好了,最优性可能下降。做决策规划,本质上就是在四个指标之间找平衡。

好了,第一章的内容就到这里。咱们把基础概念理清了,后面讲具体算法的时候,你就能知道每个算法到底在解决什么问题。下一章,我们聊聊搜索算法在路径规划中的应用。