← 自动驾驶主线

预测

从当前状态推演交通参与者的多种未来

约 12 分钟阅读

知道每辆车现在在哪、开多快,仍然不足以安全驾驶——因为你不知道它下一秒想干什么。


同一辆车,两种切法

接着上一章。感知已经把场景交代得很完整:深色轿车的位置、速度、朝向都有,它正带着横向速度,靠向你要汇入的目标车道。信息看起来够了?

不够。同样一辆正在靠近车道边界的车,同样的位置和速度,未来可能是快速切入,也可能是缓慢切入,两条线从同一个点出发,几秒之后就分得很开。最省事的预测是按当前速度匀速外推,画出一条直线:它分不出快切和慢切,更预判不了对方会不会缩回去。等到对方的走法和外推线明显分叉,系统才反应过来。

预测模块的三个工程指标,也从这个例子里长出来:

  1. 召回率:漏掉一次真实的切入,就是一次危险;
  2. 准确率:把没有切入意图的车判成切入,就是一脚多余的急刹,乘客最讨厌的体感;
  3. 对决策规划的影响:不能只看预测自己的指标,它的错误全都会在下游变成动作。

这一章讲预测怎么从“沿着现在外推”,一步步走到“给出多个带概率的未来”。


传统预测的三类假设

Lefèvre 等人 2014 年的综述,把传统预测方法按“假设对方怎么动”分成三类,一类比一类多考虑一层。拿深色轿车一问,回答各不相同:

按现在的横向速度推下去

  • 假设:运动只由当前状态和运动学决定
  • 代表:CV、CTRV 等运动学模型,卡尔曼滤波、IMM
  • 失效:预见不了机动,也预见不了前车逼出来的减速;只在短时可靠

先判断切入还是缩回

  • 假设:每辆车独立执行一个机动,比如保持、变道、从某个出口离开
  • 代表:SVM、HMM、MLP 做意图分类,再展开成轨迹
  • 失效:忽略车与车的相互影响,路口这类强交互处会误判

还要看后车让不让

  • 假设:每辆车怎么走,受周围的车影响
  • 代表:多车闭环前向仿真
  • 失效:可能的组合太多,难以实时算完
交互一类放到数据驱动之后,和学习方法一起讲。

物理外推能走多远

最朴素的预测是匀速模型(CV,Constant Velocity):假设对方保持当前速度直行,速度的小扰动当作高斯噪声。它朴素到什么程度?nuScenes 里的实现就是一行循环:x + t·vx, y + t·vy。

别急着笑它。短时间内它相当准:物理惯性是真实存在的,一辆车再怎么想变道,零点几秒内的位置也基本被当前状态锁定。问题出在路弯的地方。典型的失败案例是弯道:CV 沿切线方向直挺挺地外推出去,预测对方“冲出弯道”。它不知道路是弯的。

CV 只是运动学模型族里最简单的一个。按“假设什么不变”,常见的有:

模型假设不变的量在哪失效
CV速度的大小和方向加减速、转弯
CA加速度,仍走直线转弯
CTRV(定曲率)/ CTRA横摆角速度,外加速率或加速度转弯率靠历史拟合,噪声大,也不看车道;车走直线或弯道曲率一变,就会偏
CSAV / CSAA前轮转角,外加速率或加速度;按自行车模型换算成转弯同上

放进卡尔曼滤波当运动方程,它们身兼两职:

  1. 跟踪:每来一帧检测,先按模型推一步,再用观测修正,把含噪的检测滤成平滑的位置、速度、航向;
  2. 预测:没有新观测,只推不修。状态沿模型往前走,协方差越推越大:预测越远,越没把握。

一个模型管不了“时而直行、时而转弯”。IMM 同时跑几个滤波器,各用一种运动模型,比如一个匀速、一个转弯;每一步按谁更贴合观测更新各模型的概率,再按概率混合结果。车一打方向,转弯模型的概率就升上来。

但这一族连同 IMM,都在延长现在,时间一长都会失准:能跟上已经开始的转弯,预见不了还没开始的变道。司机脑子里装的是接下来:他要去哪个出口、让不让你、赶不赶时间。物理状态里没有这些。

一条经验分界:

  • 短时预测,约 3 秒以内:靠运动学外推或网络推演,还能用;
  • 长时预测,8 秒以上:必须知道意图,还要压住误差发散。

而规划真正需要的恰恰是后者:要不要汇入,得看未来好几秒的车流怎么走。


先猜“想去哪”:意图预测的量产形态

基于机动的方法,也就是意图预测,分两步:先把未来离散成几个机动,判断是哪一个;再把它展开成轨迹。

第一步是分类。两种经典分类器:

  • SVM 判变道:输入到目标车道的横向距离、横向速度、车道线虚实这类手工特征,输出去不去这条车道;标签打在真实变道之前的一段时间上,学的正是提前量。深色轿车一路逼近目标车道,正是它要抓的信号。
  • HMM 估意图:历史轨迹是观测序列,意图藏在隐状态里;用 Viterbi 解出最可能的隐状态序列。

量产的样子看 Apollo 5.0。预测障碍车会选哪条车道,用的是:

  • 一个 62 维的手工特征向量:由障碍物特征和车道线特征拼成,每条候选车道各算一份;
  • 一个 4 层全连接网络,最后一层 Sigmoid,输出每条候选车道的概率;
  • 旁边还有一个手写的几何打分:车道半宽减去车到车道中心线的横向距离,过一个 sigmoid。

到了路口,候选从车道换成出口:以车头朝向为基准,把四周切成 12 个扇区,只保留有驶离车道的扇区,做 12 类分类;扇区概率再分给扇区里的车道段。

至少在 Apollo 5.0 里,“我们用神经网络做预测”可以小到这个规模:62 维特征、4 层 MLP,不是大模型。它便宜、快、可解释,也确实能用。

第二步,意图怎么变成轨迹?思路是长时意图加短时趋势,再用一个轻量的规划器补全:

  1. 长时定意图选中车道或出口,从地图取参考线
  2. 短时推趋势运动学或网络推约 3 秒
  3. 拼接取控制点近端取短时预测,远端取参考线
  4. 生成拟合曲线贝塞尔或 B 样条,起点对齐当前状态
近处听短时趋势,远处听意图:轨迹贴着车道走,起点又和车现在的位置、航向接得上。

这一代方法的天花板也很清楚:人工构造的输入特征有天然的局限,你想到的特征才存在,没想到的交互模式永远进不了输入。

出路是让网络自己看:把障碍车的历史轨迹、车道形状、周围车的运动,全部渲染成图像或编码成向量,特征提取交给网络。这一步把预测从规则栈带进了数据驱动的时代。


数据驱动:输入怎么编,输出怎么给

输入侧的演进是一条清晰的线:

  1. 栅格化MTP场景画成俯视图,交给 CNN
  2. 向量化VectorNet车道和轨迹都是折线点集
  3. 统一编码Wayformer各类信息整理成张量,一起编码
  • 栅格化:把场景画成一张以目标车为中心的俯视图,典型规格是 300×300 像素、每像素 0.2 米,也就是 60 米见方的视野。直观,但几何精度被压进了像素,算力浪费在大片空白路面上。
  • 向量化:VectorNet 不再画图,而是把车道线和轨迹都表示成折线点集。先在每条折线内部聚合,再让所有折线在一张全局交互图里做注意力。精确、稀疏,2020 年之后成了主流做法。
  • 统一编码:把智能体历史、相互交互、道路结构、红绿灯状态各自整理成张量,一起送进场景编码器(Scene Encoder)。

输出侧有两个连着的坑:

  1. 只回归一条轨迹:用平均误差训练,网络面对“可能左转也可能直行”的车,会输出一条不左不直的平均线,哪个未来都不像;
  2. 改成一次输出 M 条,也还不够:如果损失按各条的概率加权求和,几条分支会被一起拉向同一条平均线。这才叫模式坍缩(mode collapse)。

解法是显式的多模态训练:一次输出 M 条轨迹,每条带一个概率;回归损失只记在离真值最近的那一条上,分类损失负责学概率。“选哪个模态”和“拟合轨迹”分开算,是多模态预测损失设计的关键。

长时预测还有专门的技巧。预测的不确定性随时间变长而明显增大,直接回归 8 秒的整条轨迹,远端容易发散。KEMP 的思路是先预测几个关键帧,再补全中间,把一个长序列问题拆成几个短序列问题。它和“先预测终点、再倒推轨迹”的目标点方法(TNT、DenseTNT)是同一个思想:给长时预测先钉几个锚。

传统方法的两件工具也没有被扔掉,而是写进了网络的输出:

  • 运动学模型变成候选集:CoverNet 把预测做成“从一组轨迹里挑”。候选集可以固定不变,也可以按当前的位置、速度、航向,对前轮转角和加速度离散采样,用自行车运动学模型现场展开。
  • 意图加运动学,变成锚点加残差:MultiPath 把不确定性拆成两类。意图不确定性是往哪个大方向走,表示成一组锚轨迹上的概率;控制不确定性是选定方向后具体怎么走,表示成相对锚轨迹的高斯偏移。这正是“先定意图、再展开轨迹”的学习版。

交互:你的预测里有没有别人对你的反应

到这里,每辆车都能给出多条带概率的轨迹了。但还有一个更深的坑,用一个路口的例子最容易看清:

每辆车独立预测

  • 路口中间那辆车有两条候选:左转 0.3,往前挪一段 0.7;对向车的轨迹另外单独预测
  • 放到一起,它左转的那条会和对向车的直行轨迹在路口中央交叉
  • 模型从没被要求让不同车的预测相容,下游只能自己解矛盾,或者哪条都躲

概率标在整个场景上

  • “30% 的可能是这样一个路口,70% 是那样一个路口”
  • 同一个场景里,所有车的轨迹互相配套、互不穿越
  • 下游拿到的是几个自洽的场景分支

在我们的汇入口,这个区别生死攸关。深色轿车“完成切入”还是“退回原车道”,和主路后车“减速让行”还是“保持速度”,不是独立事件:后车让了,切入更可能完成;后车不让,轿车更可能缩回去。边际预测给你四个概率数字,联合预测给你两三个自洽的场景分支。决策层需要的是后者。

再往前一步,是把自车也放进预测。他车的行为取决于你怎么开:你开始探出,后车可能提前减速。

规则栈的做法是多车前向仿真:

  1. 给每辆车挑一个语义策略,如车道保持、变道、停车,概率来自意图预测。
  2. 策略是闭环的:每一步都看周围车的最新状态再出控制。他车用基于模型的简单控制器,比如 EPSILON 规划系统用 IDM 管速度、纯跟踪管转向。
  3. 自车的每个候选策略各仿真一遍,各得一份未来。

主路后车执行车道保持,要和前车保持距离;仿真里自车一汇到它前面,它就减速。交互是闭环自带的,不用学;所有车在同一次仿真里互相看得见,出来的天然是联合场景。代价在他车模型:它是手写的。IDM 这类模型永远让行、不抢行,仿真里的后车会比真人客气,这个毛病见优化专题。拿仿真结果怎么选动作,见第 5 章 · 决策。

学习栈把这件事交给网络:

  • Planning-informed 一类方法,把自车的候选规划当作预测的输入:回答“如果我这么开,他会怎样”。
  • DTPP 更进一步:把自车的候选轨迹组织成一棵树,他车的反应以这棵树为条件来预测;条件预测和代价评估都是可微分的网络,从数据里学。

到这里,预测不再只是规划的上游,而是和规划缠成了一个环。第 7 章的端到端,会把这个环整个装进一个网络里。


评测:minADE 的猫腻

预测的标准指标是一组缩写,值得花一分钟看懂它们各自在防什么:

指标算什么防什么
minADE / minFDE模型给出 K 条轨迹,取终点离真值最近的那条,算平均 / 终点误差衡量几何上准不准;但 K 条里蒙对一条就算赢
p- 系列、brier- 系列在误差上加一个概率惩罚项:模型给最佳那条的概率越低,扣得越多惩罚“广撒网”:几何上蒙对了,但不知道哪条会发生
Miss Rate所有预测的终点都不在真值 2 米内的场景比例一条都没打中的情况
DAC预测轨迹有没有开出可行驶区域几何合理性,和误差无关

所以看一份预测评测报告,第一句该问:报的是 minADE 还是 brier-minFDE?K 是多少?只报 min 系列、不报概率指标的模型,可能“什么都预测了,就是不知道哪个会发生”。


预测交付什么

回到汇入口,预测模块最终交给决策层的是:

  • 深色轿车两个主要分支:完成切入(概率较高,因为横向速度还在增加),或者退回原车道;
  • 主路后车两个分支:保持速度,或者减速让行;
  • 关键的联合信息:立即汇入只在“切入中止,且后车让行”这一个组合里没有冲突,其余组合都会在冲突区相遇;
  • 以及各分支可能占据的时空区域。

预测对象也不只有车:骑行者、行人同样要预测,有的模型给行人单独估意图;交付物也可以是未来各时刻的占据栅格加运动向量,即占据流。

注意,预测没有说“该不该汇入”。它给的是几个带概率的未来,以及每个未来的代价暗示。愿意为哪种概率承担哪种后果,是下一章的事。


本章速查

概念一句话
传统三类基于物理、基于机动、考虑交互;依次多考虑意图、车与车的相互影响
运动学模型族CV、CA、CTRV(定曲率)、CTRA、CSAV 等,按“什么不变”区分;都只能延长现在
卡尔曼与 IMM跟踪时推一步、修一步,预测时只推不修、协方差越推越大;IMM 按概率混合几个运动模型
短时 vs 长时约 3 秒内物理外推可用;8 秒以上必须引入意图;规划需要的是后者
意图预测先离散化(哪条车道、哪个出口),再分类:SVM、HMM、MLP;Apollo 5.0 里小到 62 维特征加 4 层 MLP
意图变轨迹意图给参考线管远处,短时趋势管近处,再拟合成长轨迹
栅格化 vs 向量化画成图片给 CNN,还是折线点集给图网络;向量化保精度、省算力
多模态输出M 条轨迹加概率;回归损失只记在最近的模态上,防止几条分支坍缩成一条平均线
候选集与锚点CoverNet 从一组候选轨迹里挑:候选可以是固定的一组,也可以用运动学模型按当前状态生成;MultiPath 用锚点概率表示意图、用偏移表示控制
边际 vs 联合独立预测会给出物理上不可能的组合;联合预测把概率标在整个场景上
前向仿真每辆车一个闭环策略,一起往前推;交互自带,但他车模型手写、偏客气
规划条件预测把自车候选动作当作预测输入,回答“如果我这么开,他会怎样”
minADE 的坑K 条蒙对一条就算赢;要看带概率惩罚的 p- / brier- 系列,才知道模型是不是真的懂
02

规划器:端到端怎样生成一条可执行轨迹

当感知、导航与自车状态已经被编码,端到端规划器究竟怎样用 Query、AR、Diffusion 或 Flow Matching 产生轨迹,并在实时预算内选出最后一条?