3. 行为预测
各位同学,今天我们来聊聊行为预测。说实话,这是自动驾驶决策系统里最让我头疼,也最让我着迷的部分。为什么?因为路上的人和车,都不是按剧本走的。
我刚开始做预测模块时,总觉得只要模型够复杂,预测就能准。后来被现实狠狠教育了一顿——有一次测试车在路口等左转,系统预测对面直行车会减速让行,结果对方司机一脚油门冲了过来。嗯,从那以后我明白了一个道理:预测不是算命,是概率游戏。
3.1 车辆轨迹预测:三种主流思路
车辆轨迹预测,说白了就是猜别人接下来要去哪、怎么走。目前主流方法分三类,我一个个说。
3.1.1 基于物理模型
这是最朴素的方法。用运动学或动力学公式,根据当前状态外推未来轨迹。
核心思想:假设车辆遵循物理规律,比如匀速、匀加速、恒定转弯率。
常用的模型有:
- CTRV(恒定转弯率和速度)——我项目里用得最多的基础模型
- CTRA(恒定转弯率和加速度)——比CTRV多考虑加速情况
- 自行车模型——适合低速场景,比如泊车
举个例子,CTRV模型的状态方程长这样:
// 伪代码:CTRV预测一步
x_next = x + v * cos(yaw) * dt
y_next = y + v * sin(yaw) * dt
yaw_next = yaw + yaw_rate * dt
v_next = v // 假设速度不变
我的经验:物理模型在高速巡航场景下表现不错,误差在1-2米内。但遇到路口博弈、变道意图时,基本就废了。我曾经在高速上测试,前车突然打转向灯,物理模型完全没反应——因为它只认物理量,不认意图。
3.1.2 基于意图
这个方法更聪明一点。先判断驾驶员想干什么,再预测轨迹。
意图通常分为几类:
- 直行
- 左转/右转
- 变道(左变道/右变道)
- 靠边停车
- 掉头
怎么判断意图?我常用的方法有:
- 隐马尔可夫模型(HMM)——把转向灯、方向盘角度、横向位置作为观测
- LSTM/GRU——用历史轨迹序列预测意图类别
- 规则+阈值——比如横向速度超过0.5m/s且持续1秒,判定为变道意图
注意:意图预测不是100%准确的。我曾经遇到过一辆车打了左转向灯,结果直行了200米才变道——转向灯就是个烟雾弹。所以,意图预测一定要结合概率输出,别搞成硬分类。
3.1.3 基于交互
这是目前最前沿的方向。说白了,就是考虑「你影响我,我影响你」的博弈关系。
举个例子:你准备汇入主路,主路上的车看到你打灯,可能会减速让你,也可能加速不让你。你的预测模型必须把这个交互考虑进去。
常用的方法:
- Social LSTM——用池化层聚合周围车辆的信息
- 图神经网络(GNN)——把车辆看作节点,交互关系看作边
- 博弈论模型——比如纳什均衡、Stackelberg博弈
我个人比较推荐GNN方案。为什么?因为它能灵活处理可变数量的交互对象。你想想看,高速上周围可能有10辆车,城区可能有20个——用固定尺寸的输入根本搞不定。
3.2 行人意图预测
行人比车辆难预测得多。为什么?因为行人没有「规则」可言。
车辆至少还有车道线、转向灯、交通规则约束。行人呢?他可能突然跑起来,可能站在路边玩手机,可能看都不看就横穿马路。
我遇到过最离谱的一次:一个行人站在斑马线边上,盯着手机一动不动。系统判断他不会过马路,结果绿灯一亮,他头也不抬直接冲了出去。嗯,从那以后我加了一条规则——「行人静止但面朝道路,视为潜在过街意图」。
3.2.1 行人意图的关键特征
根据我的项目经验,以下几个特征最重要:
| 特征 | 描述 | 重要性 |
|---|---|---|
| 头部朝向 | 行人看哪个方向 | 高 |
| 身体姿态 | 站立、弯腰、跑步准备 | 高 |
| 与路沿距离 | 离马路边缘多远 | 中 |
| 历史速度 | 之前是走还是停 | 中 |
| 注意力状态 | 看手机、打电话、戴耳机 | 低但有用 |
避坑指南:我曾经只用了位置和速度做行人预测,结果在校园场景里频繁误判。后来加了头部朝向特征,准确率从72%提升到了89%。所以,别偷懒,能加的特征尽量加。
3.2.2 行人预测的常用模型
我推荐一个轻量级方案:
// 行人意图预测的简单规则引擎
if (行人距离路沿 < 1.0m && 头部朝向道路) {
过街概率 += 0.6
}
if (行人速度 > 1.5m/s && 方向指向道路) {
过街概率 += 0.3
}
if (行人正在看手机) {
过街概率 -= 0.2 // 注意力分散,行动延迟
}
// 最终概率 > 0.7 则触发减速
当然,这只是个基线方案。实际项目中,我会用随机森林或轻量级神经网络来做。为什么不用深度学习?因为行人预测需要极低延迟——你想想看,行人可能0.5秒内就改变主意,模型推理时间必须控制在10ms以内。
3.3 预测不确定性建模
这是整个预测模块的灵魂。说白了,就是告诉决策模块:「我猜他会左转,但我只有80%的把握」。
为什么要建模不确定性?因为自动驾驶不能赌。如果预测模块输出一个确定的轨迹,决策模块就会盲目相信,一旦预测错了,后果很严重。
3.3.1 不确定性的来源
我把它分为三类:
- 感知不确定性——传感器噪声、遮挡导致的位置误差
- 模型不确定性——预测模型本身的局限性
- 行为不确定性——人类驾驶员/行人的随机性
其中,行为不确定性最难处理。你想想看,一个司机可能因为心情好就让你先走,也可能因为赶时间就抢道——这种随机性,模型永远学不完。
3.3.2 常用的不确定性建模方法
我推荐以下几种:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 高斯分布 | 预测轨迹的均值和方差 | 高速巡航、直线行驶 |
| 混合密度网络 | 多个高斯分布加权组合 | 多模态场景(路口、变道) |
| 蒙特卡洛dropout | 推理时多次采样 | 需要模型不确定性估计 |
| 集束搜索 | 输出K条候选轨迹及概率 | 交互场景、博弈场景 |
我的建议:实际工程中,混合密度网络+集束搜索的组合最实用。前者处理多模态,后者提供可解释的候选轨迹。我在一个城市道路项目里用这个方案,把接管率降低了40%。
3.3.3 不确定性如何传递给决策模块
这里有个关键点:不确定性不是用来展示的,是用来指导决策的。
我常用的做法是:
- 预测模块输出每条轨迹的概率和置信区间
- 决策模块根据置信区间调整安全距离
- 如果不确定性过高(比如方差大于阈值),触发保守策略——减速、鸣笛、甚至停车
举个例子:
// 决策模块接收预测不确定性
if (预测轨迹的方差 < 0.5) {
// 高置信度,正常跟车
跟车距离 = 2.0秒
} else if (预测轨迹的方差 < 2.0) {
// 中等置信度,加大安全距离
跟车距离 = 3.5秒
} else {
// 低置信度,触发防御性驾驶
跟车距离 = 5.0秒
触发鸣笛提醒
}
注意:不要直接把不确定性阈值写死。我踩过这个坑——有一次在雨天,所有预测的方差都偏大,结果系统一路都在减速。后来我改成根据天气、路况动态调整阈值,才解决问题。
3.4 本章知识体系总览
下面这张图,是我自己梳理的行为预测知识框架。你看完应该能对整体结构有个清晰的认识。
好了,这一章的内容就到这里。行为预测这块,说白了就是「猜」——但我们要猜得有依据、有概率、有退路。下次你在路上开车时,不妨观察一下周围的车和人,想想他们下一秒会做什么。你会发现,预测这件事,比想象中复杂得多。
可可精品资料库