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 基于意图

这个方法更聪明一点。先判断驾驶员想干什么,再预测轨迹。

意图通常分为几类:

  • 直行
  • 左转/右转
  • 变道(左变道/右变道)
  • 靠边停车
  • 掉头

怎么判断意图?我常用的方法有:

  1. 隐马尔可夫模型(HMM)——把转向灯、方向盘角度、横向位置作为观测
  2. LSTM/GRU——用历史轨迹序列预测意图类别
  3. 规则+阈值——比如横向速度超过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 不确定性如何传递给决策模块

这里有个关键点:不确定性不是用来展示的,是用来指导决策的。

我常用的做法是:

  1. 预测模块输出每条轨迹的概率和置信区间
  2. 决策模块根据置信区间调整安全距离
  3. 如果不确定性过高(比如方差大于阈值),触发保守策略——减速、鸣笛、甚至停车

举个例子:

// 决策模块接收预测不确定性
if (预测轨迹的方差 < 0.5) {
    // 高置信度,正常跟车
    跟车距离 = 2.0秒
} else if (预测轨迹的方差 < 2.0) {
    // 中等置信度,加大安全距离
    跟车距离 = 3.5秒
} else {
    // 低置信度,触发防御性驾驶
    跟车距离 = 5.0秒
    触发鸣笛提醒
}

注意:不要直接把不确定性阈值写死。我踩过这个坑——有一次在雨天,所有预测的方差都偏大,结果系统一路都在减速。后来我改成根据天气、路况动态调整阈值,才解决问题。

3.4 本章知识体系总览

下面这张图,是我自己梳理的行为预测知识框架。你看完应该能对整体结构有个清晰的认识。

行为预测知识体系 车辆轨迹预测 行人意图预测 不确定性建模 基于物理模型 (CTRV/CTRA) 基于意图 (HMM/LSTM) 基于交互 (GNN/博弈论) 关键特征提取 规则引擎/随机森林 轻量级神经网络 高斯分布/混合密度 蒙特卡洛dropout 集束搜索/K条候选 输出:带概率的轨迹集合 + 不确定性度量 三种方法可以组合使用,例如:物理模型做短时预测 + 意图模型做长时预测 不确定性建模贯穿所有预测方法,是安全决策的基石 图3-1 行为预测知识体系总览

好了,这一章的内容就到这里。行为预测这块,说白了就是「猜」——但我们要猜得有依据、有概率、有退路。下次你在路上开车时,不妨观察一下周围的车和人,想想他们下一秒会做什么。你会发现,预测这件事,比想象中复杂得多。

可可精品资料库