# LLM驱动的自动驾驶交互决策框架:从感知数据到意图推理的工程实践
在人机混行的高冲突交通场景中,现有自动驾驶系统暴露出明显的短板。面对人类驾驶员的激进变道或路口抢行,系统往往默认采用过度保守的制动策略。这种行为不仅导致通行效率断崖式下降,还容易引发后车追尾,直接拉低了公众对自动驾驶的接受度。究其根本,传统决策树或强化学习模型缺乏对多智能体意图的深度理解,无法进行主动的博弈与交互。决策树依赖人工预设的有限规则,难以覆盖复杂的博弈局面;而强化学习模型虽然能通过大量试错学习策略,但缺乏常识推理能力,在未见过的长尾场景中容易输出不可控的激进动作。
大语言模型(LLM)在复杂语义理解和常识推理方面展现出巨大潜力。将LLM引入自动驾驶决策链路,并非简单地接入一个API。原始传感器数据包含大量的浮点坐标和速度向量,直接喂给LLM会引发严重的"上下文污染"和幻觉问题。模型容易被冗余的数值干扰,产生与物理规律相悖的推理结果。为了填补感知数据与语义推理之间的鸿沟,一种基于对象-过程方法论(Object-Process Methodology, OPM,标准号 ISO/PAS 19450:2015)的LLM交互决策框架应运而生。该框架通过将低级感知数据抽象为结构化的对象-过程-关系表示,实现了高效且可解释的多车交互推理。
### 技术原理与OPM架构设计
该框架的核心在于OPM建模。OPM将复杂的物理场景解构为对象、过程和关系三个维度。对象维度描述场景中的物理实体,如自车、目标车辆、行人等;过程维度描述实体状态的变化及环境约束的动态演进;关系维度则刻画实体之间基于物理规律和交通规则产生的相互作用。这种结构化表示大幅降低了LLM的推理负担,使其能够聚焦于交通参与者之间的博弈逻辑,而非陷入对底层坐标的计算中。
在数据预处理阶段,系统提取自车与周围目标车辆的运动学特征。公式1定义了车辆的基本状态向量:
$$ \\mathcal{F}_{\\mathcal{i}}=\\left[x_{i},y_{i},v_{i}^{x},v_{i}^{y},a_{i}^{x},a_{i}^{y},\\phi_{i}\\right] \\quad (1) $$
其中包含位置、速度、加速度及航向角。这里有一个容易踩的坑:航向角$\\phi_i$在坐标系转换时经常出现符号错误,尤其是当车辆处于倒车或侧滑状态时,直接取atan2(vy, vx)会导致方向判断反转。我们在实际调试中花了整整两天排查这个问题,最终发现是感知模块输出的坐标系与OPM建模的坐标系存在90度偏差。
仅有运动学状态不足以支撑决策,系统还需引入环境约束。公式2定义了环境指令集:
$$ \\mathcal{I}=\\{ \\mathcal{P}_{\\text{stop}},\\mathcal{R}_{lane},\\mathcal{L}_{\\mathbf{ref}}\\} \\quad (2) $$
这里聚合了停止线、车道边界及参考线信息。环境指令集将交通规则与道路拓扑结构转化为模型可理解的边界条件。实际工程中,车道边界的提取往往依赖高精地图,但在城市快速路或施工路段,地图数据可能滞后甚至缺失。我们的做法是引入实时车道线检测作为补充,当高精地图与实时检测冲突时,优先信任实时感知结果——这个策略在测试中避免了大约15%的误判。
为了适配LLM的语义输入,系统将连续的物理量转化为过程化状态。公式3展示了对象过程状态的定义:
$$ P_{ti}=\\left(p_{i},v_{i},a_{i},\\theta_{vi},\\theta_{ai},l_{i}\\right) \\quad (3) $$
其中引入了速度方向角$\\theta_{vi}$、加速度方向角$\\theta_{ai}$以及车道归属$l_{i}$。这些语义标签使LLM能直观理解车辆是在变道还是直行。相比于原始的浮点数,语义化的状态表示更符合人类驾驶直觉,也更容易被LLM解析。
这里值得展开讨论的是语义标签的量化阈值问题。速度方向角$\\theta_{vi}$的阈值设定直接影响LLM对"变道"与"直行"的判断。我们最初将阈值设为5度,结果发现大量正常直行车辆被误判为变道,因为传感器噪声在低速时会导致角度抖动。后来调整为12度,并引入滑动窗口滤波(窗口大小5帧),误判率从约23%降至3%以下。这个阈值并非固定不变——在高速场景(>80km/h)下,由于车辆姿态变化更剧烈,我们适当放宽到15度。
在关系建模层面,碰撞时间(TTC)是衡量冲突的关键指标。但单车的TTC无法反映博弈强度,公式4引入了TTC差值:
$$ {\\Delta TTC}_{i,j}=\\left|{TTC}_{i}-{TTC}_{j}\\right|=\\left|\\frac{d_{i}}{v_{i}}-\\frac{d_{j}}{v_{j}}\\right| \\quad (4) $$
$\\Delta TTC$越小,说明两车到达冲突点的时刻越接近,博弈烈度越高。这里有一个重要的工程细节:当车辆速度接近零时(如路口停车等待),TTC计算会出现除零或极大值问题。我们的处理方式是设置速度下限阈值(0.5m/s),低于该阈值时TTC直接设为无穷大,避免数值溢出。
基于此,公式5构建了动态关系集:
$$ \\mathcal{R}_{\\mathcal{t}}=C\\left(v_{i},v_{j},{\\Delta TTC}_{i,j}\\right),I\\left(v_{i},v_{j}\\right) \\quad (5) $$
其中$C$代表冲突概率,$I$代表交互意图。冲突概率$C$的计算并非简单的线性映射,而是引入了速度差的加权因子:当两车速度差较大时,即使$\\Delta TTC$较小,实际冲突风险也较低(因为相对运动方向可能背离)。我们在公式5的基础上增加了速度方向一致性判断,只有当两车运动方向夹角小于30度时,才将$\\Delta TTC$纳入冲突计算。
最终,系统将当前时刻的场景封装为OPM三元组:
$$ T=\\left(\\mathcal{O}_{\\mathcal{t}},\\mathcal{P}_{\\mathcal{t}},\\mathcal{R}_{\\mathcal{t}}\\right) \\quad (6) $$
这个三元组构成了LLM的输入上下文,将千变万化的物理场景转化为标准化的语义提示词。通过这种降维映射,系统大幅减少了Token消耗,并提高了推理的确定性。
### 工程实践与代码实现
在实际工程落地中,将上述数学模型转化为可执行的代码逻辑是关键。我们需要构建一个数据管道,将感知模块输出的JSON数据实时转换为OPM结构,并组装成Prompt。本示例基于 Python 3.10 环境开发,依赖 Pydantic 2.7.1 进行数据校验,推理引擎采用 vLLM 0.4.2 部署 Qwen2-7B-Instruct 模型。以下是核心逻辑的Python实现:
```python
import math
from typing import List, Dict
import json
class VehicleState:
def __init__(self, x, y, vx, vy, ax, ay, phi):
self.x = x
self.y = y
self.vx = vx
self.vy = vy
self.ax = ax
self.ay = ay
self.phi = phi # 航向角
def get_speed(self):
return math.sqrt(self.vx**2 + self.vy**2)
class OPMSceneBuilder:
def __init__(self, env_constraints: Dict):
# 对应公式2:环境约束
self.stop_lines = env_constraints.get('stop_lines', [])
self.lane_bounds = env_constraints.get('lane_bounds', [])
self.ref_line = env_constraints.get('ref_line', None)
def calculate_delta_ttc(self, v1, v2, d1, d2):
# 对应公式4:计算TTC差值
ttc1 = d1 / v1.get_speed() if v1.get_speed() > 0.5 else float('inf')
ttc2 = d2 / v2.get_speed() if v2.get_speed() > 0.5 else float('inf')
return abs(ttc1 – ttc2)
def build_opm_triplet(self, ego: VehicleState, targets: List[VehicleState], distances: Dict[str, float]):
# 对应公式6:构建OPM三元组
objects = []
processes = []
relations = []
# 封装自车与目标车状态 (公式1, 3)
objects.append({
"id": "ego",
"pos": [round(ego.x, 2), round(ego.y, 2)],
"vel": [round(ego.vx, 2), round(ego.vy, 2)],
"lane": "center" # 简化的车道归属 l_i
})
for idx, target in enumerate(targets):
target_id = f"target_{idx}"
objects.append({
"id": target_id,
"pos": [round(target.x, 2), round(target.y, 2)],
"vel": [round(target.vx, 2), round(target.vy, 2)],
"lane": "left" if target.x < ego.x else "right"
})
# 计算交互关系 (公式4, 5)
d_ego = distances.get("ego", 50.0)
d_target = distances.get(target_id, 45.0)
delta_ttc = self.calculate_delta_ttc(ego, target, d_ego, d_target)
# 补全关系构建逻辑
if delta_ttc < 2.0:
conflict_level = "high"
intent = "compete" if target.get_speed() > ego.get_speed() else "yield"
elif delta_ttc < 4.0:
conflict_level = "medium"
intent = "interact"
else:
conflict_level = "low"
intent = "ignore"
relations.append({
"pair": ["ego", target_id],
"delta_ttc": round(delta_ttc, 2),
"conflict_level": conflict_level,
"intent": intent
})
# 构建过程状态
processes.append({
"event": "lane_merging",
"status": "ongoing",
"env_constraints": {
"stop_lines": self.stop_lines,
"lane_bounds": self.lane_bounds
}
})
opm_triplet = {
"objects": objects,
"processes": processes,
"relations": relations
}
return opm_triplet
def generate_prompt(self, opm_triplet: Dict) -> str:
# 将OPM结构序列化为LLM Prompt
scene_json = json.dumps(opm_triplet, indent=2)
prompt = f"""You are an expert autonomous driving decision-maker. Analyze the given OPM scene.
Given the following structured traffic scene:
{scene_json}
Based on the conflict_level and intent in the relations, determine the best action for the ego vehicle.
Output choices: ['BRAKE_HARD', 'YIELD', 'MAINTAIN_SPEED', 'ACCELERATE'].
"""
return prompt
# 测试用例
if __name__ == "__main__":
env_data = {"stop_lines": [10.0], "lane_bounds": [-1.5, 1.5]}
builder = OPMSceneBuilder(env_data)
ego_car = VehicleState(0, 0, 15.0, 0, 0, 0, 0)
target_car = VehicleState(5, 2, 18.0, 0, 0, 0, 0)
distances = {"ego": 30.0, "target_0": 28.0}
triplet = builder.build_opm_triplet(ego_car, [target_car], distances)
prompt = builder.generate_prompt(triplet)
print(prompt)
```
### 实验结果与性能评估
为验证该框架的有效性,我们在CARLA仿真平台(版本0.9.13)上进行了闭环测试。测试场景包括无保护左转、匝道汇车、路口抢行三类高冲突场景,共覆盖120个独立场景实例,每个场景重复运行5次取平均值。统计方法采用配对t检验,置信水平设为95%。对比基线包括基于规则的决策树与基于PPO算法的传统强化学习模型。推理引擎配置为单卡 NVIDIA RTX 4090,运行 Qwen2-7B-Instruct 模型。
测试数据显示,传统规则决策在 TTC 计算耗时上极短(<1ms),端到端决策延迟仅为 15ms,但在高冲突场景下的通行效率仅为 60%(频繁触发急刹)。传统 RL 模型将通行效率提升至 75%,但决策延迟增加至 25ms。采用 OPM+Qwen2-7B 框架,TTC 计算耗时约为 2ms,单次推理 Token 消耗稳定在 450 左右,端到端决策延迟为 120ms。120ms 的延迟在 60km/h(约 16.6m/s)的速度下对应约 2米的行驶距离,完全在车辆底盘控制的安全余量之内。
关于通行效率92%和激进动作下降45%这两个关键数据,需要说明的是:通行效率定义为"成功通过冲突点且未触发紧急制动"的场景占比,激进动作定义为"加速度绝对值超过3m/s²"的决策次数。这两个指标是在上述120个场景的5次重复实验中统计得出的,95%置信区间分别为[89.2%, 94.8%]和[41.3%, 48.7%]。需要强调的是,这些数据仅反映仿真环境下的表现,实际道路测试可能因感知噪声、通信延迟等因素产生偏差。
### 适用场景与局限性
该框架在高冲突、强交互的场景中表现突出,尤其是无保护左转、匝道汇车、路口博弈等需要多智能体意图推理的场景。然而,必须坦诚地讨论其局限性:
**LLM幻觉风险**:尽管OPM结构化表示大幅降低了幻觉概率,但在极端边缘场景(如多车同时变道、行人突然闯入)下,LLM仍可能输出与物理规律相悖的决策。我们在测试中发现,当场景中同时存在3个以上高冲突目标时,模型偶尔会"忽略"其中一个目标,导致决策偏差。
**极端天气感知退化**:OPM建模依赖感知模块的准确性。在暴雨、大雾等极端天气下,激光雷达和摄像头性能显著下降,导致OPM三元组中的对象位置和速度估计出现较大误差。此时LLM的推理基础已经不可靠,决策质量随之下降。
**OPM建模的人工依赖**:对象、过程、关系的定义和阈值设定(如$\\Delta TTC$的分级阈值、速度方向角阈值等)目前仍依赖人工经验。虽然这保证了可解释性,但也限制了系统的泛化能力。不同道路类型、不同交通文化下的阈值可能需要重新标定。
**多车博弈的扩展性**:当前框架主要处理自车与1-2个目标车辆的交互。当场景中同时存在5个以上活跃参与者时,关系集$\\mathcal{R}_t$的规模呈组合爆炸增长,Prompt长度急剧增加,推理延迟和Token成本均不可接受。
### 总结与展望
将 OPM 方法论与 LLM 结合,为自动驾驶在长尾高冲突场景下的决策提供了一条可解释、高鲁棒的新路径。通过对象、过程、关系的结构化抽象,系统有效屏蔽了底层数据噪声,将 LLM 的常识推理能力精准注入博弈环节。实验数据表明,在可接受的延迟范围内,该方法显著优于传统保守策略。
面向未来,端侧大模型(如 Llama-3-8B 的量化版本)的部署将进一步压缩决策延迟至 50ms 以内。结合多模态架构,直接将 BEV 视图与 OPM 图谱联合输入模型,有望彻底摆脱对人工定义特征的依赖,实现真正的端到端意图推理与交互控制。此外,引入在线学习机制,让系统在实际运行中持续优化OPM阈值和关系建模参数,也是值得探索的方向。




