知道每辆车现在在哪、开多快,仍然不足以安全驾驶——因为你不知道它下一秒想干什么。
同一辆车,两种切法
接着上一章。感知已经把场景交代得很完整:深色轿车的位置、速度、朝向都有,它正带着横向速度,靠向你要汇入的目标车道。信息看起来够了?
不够。同样一辆正在靠近车道边界的车,同样的位置和速度,未来可能是快速切入,也可能是缓慢切入,两条线从同一个点出发,几秒之后就分得很开。最省事的预测是按当前速度匀速外推,画出一条直线:它分不出快切和慢切,更预判不了对方会不会缩回去。等到对方的走法和外推线明显分叉,系统才反应过来。
预测模块的三个工程指标,也从这个例子里长出来:
- 召回率:漏掉一次真实的切入,就是一次危险;
- 准确率:把没有切入意图的车判成切入,就是一脚多余的急刹,乘客最讨厌的体感;
- 对决策规划的影响:不能只看预测自己的指标,它的错误全都会在下游变成动作。
这一章讲预测怎么从“沿着现在外推”,一步步走到“给出多个带概率的未来”。
传统预测的三类假设
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 | 前轮转角,外加速率或加速度;按自行车模型换算成转弯 | 同上 |
放进卡尔曼滤波当运动方程,它们身兼两职:
- 跟踪:每来一帧检测,先按模型推一步,再用观测修正,把含噪的检测滤成平滑的位置、速度、航向;
- 预测:没有新观测,只推不修。状态沿模型往前走,协方差越推越大:预测越远,越没把握。
一个模型管不了“时而直行、时而转弯”。IMM 同时跑几个滤波器,各用一种运动模型,比如一个匀速、一个转弯;每一步按谁更贴合观测更新各模型的概率,再按概率混合结果。车一打方向,转弯模型的概率就升上来。
但这一族连同 IMM,都在延长现在,时间一长都会失准:能跟上已经开始的转弯,预见不了还没开始的变道。司机脑子里装的是接下来:他要去哪个出口、让不让你、赶不赶时间。物理状态里没有这些。
一条经验分界:
- 短时预测,约 3 秒以内:靠运动学外推或网络推演,还能用;
- 长时预测,8 秒以上:必须知道意图,还要压住误差发散。
而规划真正需要的恰恰是后者:要不要汇入,得看未来好几秒的车流怎么走。
先猜“想去哪”:意图预测的量产形态
基于机动的方法,也就是意图预测,分两步:先把未来离散成几个机动,判断是哪一个;再把它展开成轨迹。
第一步是分类。两种经典分类器:
- SVM 判变道:输入到目标车道的横向距离、横向速度、车道线虚实这类手工特征,输出去不去这条车道;标签打在真实变道之前的一段时间上,学的正是提前量。深色轿车一路逼近目标车道,正是它要抓的信号。
- HMM 估意图:历史轨迹是观测序列,意图藏在隐状态里;用 Viterbi 解出最可能的隐状态序列。
量产的样子看 Apollo 5.0。预测障碍车会选哪条车道,用的是:
- 一个 62 维的手工特征向量:由障碍物特征和车道线特征拼成,每条候选车道各算一份;
- 一个 4 层全连接网络,最后一层 Sigmoid,输出每条候选车道的概率;
- 旁边还有一个手写的几何打分:车道半宽减去车到车道中心线的横向距离,过一个 sigmoid。
到了路口,候选从车道换成出口:以车头朝向为基准,把四周切成 12 个扇区,只保留有驶离车道的扇区,做 12 类分类;扇区概率再分给扇区里的车道段。
至少在 Apollo 5.0 里,“我们用神经网络做预测”可以小到这个规模:62 维特征、4 层 MLP,不是大模型。它便宜、快、可解释,也确实能用。
第二步,意图怎么变成轨迹?思路是长时意图加短时趋势,再用一个轻量的规划器补全:
- 长时定意图选中车道或出口,从地图取参考线
- 短时推趋势运动学或网络推约 3 秒
- 拼接取控制点近端取短时预测,远端取参考线
- 生成拟合曲线贝塞尔或 B 样条,起点对齐当前状态
这一代方法的天花板也很清楚:人工构造的输入特征有天然的局限,你想到的特征才存在,没想到的交互模式永远进不了输入。
出路是让网络自己看:把障碍车的历史轨迹、车道形状、周围车的运动,全部渲染成图像或编码成向量,特征提取交给网络。这一步把预测从规则栈带进了数据驱动的时代。
数据驱动:输入怎么编,输出怎么给
输入侧的演进是一条清晰的线:
- 栅格化MTP场景画成俯视图,交给 CNN
- 向量化VectorNet车道和轨迹都是折线点集
- 统一编码Wayformer各类信息整理成张量,一起编码
- 栅格化:把场景画成一张以目标车为中心的俯视图,典型规格是 300×300 像素、每像素 0.2 米,也就是 60 米见方的视野。直观,但几何精度被压进了像素,算力浪费在大片空白路面上。
- 向量化:VectorNet 不再画图,而是把车道线和轨迹都表示成折线点集。先在每条折线内部聚合,再让所有折线在一张全局交互图里做注意力。精确、稀疏,2020 年之后成了主流做法。
- 统一编码:把智能体历史、相互交互、道路结构、红绿灯状态各自整理成张量,一起送进场景编码器(Scene Encoder)。
输出侧有两个连着的坑:
- 只回归一条轨迹:用平均误差训练,网络面对“可能左转也可能直行”的车,会输出一条不左不直的平均线,哪个未来都不像;
- 改成一次输出 M 条,也还不够:如果损失按各条的概率加权求和,几条分支会被一起拉向同一条平均线。这才叫模式坍缩(mode collapse)。
解法是显式的多模态训练:一次输出 M 条轨迹,每条带一个概率;回归损失只记在离真值最近的那一条上,分类损失负责学概率。“选哪个模态”和“拟合轨迹”分开算,是多模态预测损失设计的关键。
长时预测还有专门的技巧。预测的不确定性随时间变长而明显增大,直接回归 8 秒的整条轨迹,远端容易发散。KEMP 的思路是先预测几个关键帧,再补全中间,把一个长序列问题拆成几个短序列问题。它和“先预测终点、再倒推轨迹”的目标点方法(TNT、DenseTNT)是同一个思想:给长时预测先钉几个锚。
传统方法的两件工具也没有被扔掉,而是写进了网络的输出:
- 运动学模型变成候选集:CoverNet 把预测做成“从一组轨迹里挑”。候选集可以固定不变,也可以按当前的位置、速度、航向,对前轮转角和加速度离散采样,用自行车运动学模型现场展开。
- 意图加运动学,变成锚点加残差:MultiPath 把不确定性拆成两类。意图不确定性是往哪个大方向走,表示成一组锚轨迹上的概率;控制不确定性是选定方向后具体怎么走,表示成相对锚轨迹的高斯偏移。这正是“先定意图、再展开轨迹”的学习版。
交互:你的预测里有没有别人对你的反应
到这里,每辆车都能给出多条带概率的轨迹了。但还有一个更深的坑,用一个路口的例子最容易看清:
边际预测
每辆车独立预测
- 路口中间那辆车有两条候选:左转 0.3,往前挪一段 0.7;对向车的轨迹另外单独预测
- 放到一起,它左转的那条会和对向车的直行轨迹在路口中央交叉
- 模型从没被要求让不同车的预测相容,下游只能自己解矛盾,或者哪条都躲
联合预测
概率标在整个场景上
- “30% 的可能是这样一个路口,70% 是那样一个路口”
- 同一个场景里,所有车的轨迹互相配套、互不穿越
- 下游拿到的是几个自洽的场景分支
在我们的汇入口,这个区别生死攸关。深色轿车“完成切入”还是“退回原车道”,和主路后车“减速让行”还是“保持速度”,不是独立事件:后车让了,切入更可能完成;后车不让,轿车更可能缩回去。边际预测给你四个概率数字,联合预测给你两三个自洽的场景分支。决策层需要的是后者。
再往前一步,是把自车也放进预测。他车的行为取决于你怎么开:你开始探出,后车可能提前减速。
规则栈的做法是多车前向仿真:
- 给每辆车挑一个语义策略,如车道保持、变道、停车,概率来自意图预测。
- 策略是闭环的:每一步都看周围车的最新状态再出控制。他车用基于模型的简单控制器,比如 EPSILON 规划系统用 IDM 管速度、纯跟踪管转向。
- 自车的每个候选策略各仿真一遍,各得一份未来。
主路后车执行车道保持,要和前车保持距离;仿真里自车一汇到它前面,它就减速。交互是闭环自带的,不用学;所有车在同一次仿真里互相看得见,出来的天然是联合场景。代价在他车模型:它是手写的。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- 系列,才知道模型是不是真的懂 |
