4、预测模块设计:目标行为预测

预测模块,说白了就是回答一个问题:「周围的车接下来要干嘛?」

我刚开始做自动驾驶那会儿,觉得感知做准了就万事大吉。结果有一次路测,前车明明在直道上,我们的车却突然急刹——因为系统没预测到那辆车会变道。嗯,从那以后我就明白了,没有预测的自动驾驶,就像蒙着眼开车

今天咱们聊聊预测模块的核心:目标行为预测。包括轨迹预测和意图预测,以及背后的两类主流方法——基于模型的和基于学习的。

4.1 目标行为预测:轨迹 vs 意图

先区分两个概念:

  • 轨迹预测:输出一串未来位置点。比如「未来3秒,这辆车每0.1秒的位置在哪」。
  • 意图预测:输出一个离散动作。比如「这辆车要左转、直行、还是靠边停」。

我个人的习惯是:先做意图预测,再做轨迹预测。为什么?因为意图能大幅缩小搜索空间。你想想看,如果我知道前车要左转,那它的轨迹大概率会往左车道偏,而不是随机乱跑。

实际项目中的经验:意图预测的准确率通常能做到95%以上,但轨迹预测的误差很难低于0.5米。所以别指望轨迹预测能完美,留好安全余量才是王道。

4.2 基于模型的方法:卡尔曼滤波与粒子滤波

这类方法的核心思想是:用数学公式描述运动规律

4.2.1 卡尔曼滤波

卡尔曼滤波,我愿称之为「线性系统的最优估计器」。它假设目标的运动是线性的,噪声是高斯分布。

公式其实不复杂,核心就两步:

// 预测步
x_pred = F * x_prev + B * u
P_pred = F * P_prev * F^T + Q

// 更新步
K = P_pred * H^T * (H * P_pred * H^T + R)^-1
x_new = x_pred + K * (z - H * x_pred)
P_new = (I - K * H) * P_pred

我在项目中用过卡尔曼滤波做车辆跟踪。效果不错,但有个大坑——它假设运动是线性的。如果前车突然急转弯,卡尔曼滤波的预测就会严重滞后。

我曾经踩过的坑:有一次在高速上,前车为了避让障碍物突然变道,卡尔曼滤波的预测轨迹还在直线上。结果我们的车差点追尾。后来我加了一个「机动检测」逻辑,当残差过大时,临时增大过程噪声Q值,才解决了这个问题。

4.2.2 粒子滤波

粒子滤波比卡尔曼滤波更灵活。它用一堆「粒子」来近似概率分布,每个粒子代表一个可能的轨迹。

说白了,就是撒一把点,看哪些点更符合观测

粒子滤波的优势在于:

  • 可以处理非线性、非高斯的情况
  • 能表示多模态分布(比如「可能左转也可能直行」)

但缺点也很明显:计算量大。粒子数太少会发散,太多又跑不动。

我的建议:如果场景简单(高速巡航),用卡尔曼滤波就够了。如果场景复杂(城市路口、密集车流),考虑粒子滤波或直接上学习方法。

4.3 基于学习的方法:LSTM与Transformer

这几年,基于学习的方法越来越主流。原因很简单:现实世界的运动规律太复杂,数学公式根本写不全

4.3.1 LSTM

LSTM(长短期记忆网络)擅长处理时序数据。它通过「门控机制」记住长期依赖关系。

一个典型的LSTM预测模型结构:

输入: [历史轨迹点 (x,y) 序列, 车辆状态 (速度, 加速度), 地图信息]
     ↓
LSTM编码器 → 隐藏状态 h_t
     ↓
解码器 (另一个LSTM或全连接层)
     ↓
输出: 未来轨迹点序列 或 意图概率分布

我在一个项目中用LSTM预测车辆换道意图。输入是过去3秒的轨迹和速度,输出是「左变道/直行/右变道」的概率。准确率能做到92%左右。

但LSTM有个问题:它很难捕捉车辆之间的交互。你想想看,前车刹车,后车也会跟着减速,这种因果关系LSTM处理起来很吃力。

4.3.2 Transformer

Transformer的出现,很大程度上解决了交互建模的问题。它的自注意力机制可以同时关注所有车辆之间的关系。

我最近在做一个基于Transformer的轨迹预测模型,结构大概是:

输入: 所有车辆的轨迹 + 车道线 + 交通灯状态
     ↓
特征编码 (MLP + 位置编码)
     ↓
Transformer Encoder (多层自注意力)
     ↓
解码头 (MLP)
     ↓
输出: 每个车辆的多条候选轨迹 + 置信度

Transformer的优势很明显:

  • 能同时建模所有车辆的交互
  • 可以输出多模态轨迹(比如「可能直行也可能左转」)
  • 对长序列的建模能力比LSTM强

但缺点也别忘了:计算量大、训练慢、对数据量要求高

实际项目中的对比:在同样的数据集上,LSTM的推理延迟约5ms,Transformer约15ms。但Transformer的预测精度(ADE/FDE指标)比LSTM好20%左右。怎么选?看你的算力预算和实时性要求。

4.4 两种方法的对比与选型

维度 基于模型(卡尔曼/粒子滤波) 基于学习(LSTM/Transformer)
计算量 低(卡尔曼)~ 中(粒子滤波) 高(LSTM)~ 很高(Transformer)
数据需求 几乎不需要数据 需要大量标注数据
可解释性 高(公式透明) 低(黑盒)
复杂场景 差(线性假设限制) 好(能学复杂模式)
多模态输出 难(需要额外处理) 容易(直接输出分布)
部署难度 低(嵌入式友好) 高(需要推理框架)

我个人建议的选型策略:

  • 资源受限的嵌入式平台:用卡尔曼滤波做基础预测,必要时加粒子滤波
  • 有GPU的域控制器:用LSTM或轻量Transformer
  • 最稳妥的方案:模型方法做兜底,学习方法做增强,两者互补

一个小技巧:我在实际项目中,会把卡尔曼滤波的预测结果作为LSTM的一个输入特征。这样既保留了物理模型的稳定性,又利用了学习模型的灵活性。效果比单独用任何一种都好。

4.5 总结与避坑指南

预测模块设计,说到底就是在准确性和实时性之间找平衡

最后分享几个我踩过的坑:

  • 别过度依赖预测:预测永远是概率性的,规划模块必须能处理预测错误的情况
  • 注意预测的时效性:超过3秒的预测基本不可靠,别规划太远的动作
  • 别忘了地图信息:车道线、限速、路口形状,这些信息能大幅提升预测准确率
  • 测试时要覆盖边缘场景:比如前车突然急刹、行人横穿、施工路段,这些才是预测模块的真正考验

好了,预测模块就聊到这儿。下一章咱们讲讲规划模块——怎么把预测结果变成具体的行驶轨迹。