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秒的预测基本不可靠,别规划太远的动作
- 别忘了地图信息:车道线、限速、路口形状,这些信息能大幅提升预测准确率
- 测试时要覆盖边缘场景:比如前车突然急刹、行人横穿、施工路段,这些才是预测模块的真正考验
好了,预测模块就聊到这儿。下一章咱们讲讲规划模块——怎么把预测结果变成具体的行驶轨迹。