第 13 章 自动驾驶 VLA Agent:从感知到闭环决策
1. 开篇与目标
在多模态大模型出现之前,自动驾驶主要依赖“模块化流水线”(Modular Pipeline):感知模块画框,预测模块猜意图,规划模块画线,控制模块踩油门。这种架构稳定、可解释,但存在严重的信息级联损耗——感知模块一旦丢弃了“路边行人的眼神”或“前车轻微的晃动”,下游模块就永远无法挽回这些隐含的交互意图。
视觉-语言-动作(Vision-Language-Action, VLA) 模型试图改变这一现状。它将自动驾驶视为一个端到端的序列生成问题:输入是一系列视频帧、雷达点云和语言指令,输出是未来的车辆轨迹。
本章将带你构建一个 VLA 驾驶智能体。不同于处理静态文档的 Agent,驾驶 Agent 面临着严格的实时性要求、不可逆的物理后果以及长尾场景(Corner Cases)的挑战。
本章学习目标:
- 架构设计:如何将多视角相机、LiDAR 和语言指令编码为 Transformer 可理解的 tokens。
- 动作解码:理解为何输出“轨迹(Trajectory)”比直接输出“油门/方向盘”更优。
- 闭环训练:掌握从开环行为克隆(Behavior Cloning)到闭环仿真(Closed-loop Simulation)的进阶之路。
- 安全体系:设计一套确定性的安全护栏(Safety Shield),防御模型的幻觉。
2. 核心论述:VLA 驾驶系统的解构
2.1 任务定义:不仅仅是“不撞车”
VLA Agent 的目标函数是复杂的。它必须在以下三个相互冲突的维度中寻找平衡:
- 安全性 (Safety):硬约束。不碰撞、不违规、不驶出道路。
- 任务性 (Liveness):软约束。必须到达目的地,且效率不能太低(不能因为怕撞车就永远停在路口)。
- 舒适性 (Comfort):体验指标。加速度变化率(Jerk)要小,不急刹急停。
语言指令(Language Instruction)在这里起到了调节器(Conditioning)的作用。例如,指令“由于这程赶时间,请稍微开快点”实际上是在调整“安全性”与“效率”之间的权重参数;而“小心那辆晃晃悠悠的自行车”则是将注意力机制(Attention)强制聚焦在特定 Object Token 上。
2.2 多模态输入流与 Token 化
驾驶场景的输入吞吐量极大。一辆自动驾驶汽车每秒产生数百 MB 的数据,我们必须进行高效的压缩与编码。
2.2.1 视觉编码 (Vision Encoding)
我们不能简单地将图像 Resize 后喂给模型,因为驾驶极其依赖空间几何关系和高分辨率细节(如远处的红绿灯状态)。
- 多视角融合:通常使用 6-8 个摄像头覆盖 360 度(Front, Front-Left, Front-Right, Back, Back-Left, Back-Right)。
- Token 策略:不建议将多图拼接成一张大图(会导致畸变)。推荐使用 Shared Vision Encoder 分别提取特征,然后附加上 Camera Extrinsics Embedding(相机外参嵌入)。
- 原理:让模型知道 Token A 来自“左后方”,Token B 来自“正前方”。这对于学习“物体从后方超车移动到前方”的物理规律至关重要。
2.2.2 状态与导航 (State & Nav)
除了视觉,Agent 还需要本体感知(Proprioception)。
- 车辆状态:当前速度 、加速度 、方向盘转角 、角速度 。
- 导航意图:
- 低级意图:One-hot 向量(左转、右转、直行、掉头)。
- 高级意图:局部高清地图(HD Map)的鸟瞰图(BEV)切片,或者由导航软件生成一串目标路点(Goal Points)。
2.2.3 架构示意图
[Input Modalities] [The VLA Transformer] [Output Head]
1. Multi-View Images ---> +----------------------+
(Front, L/R, Back) | Vision Encoder (ViT) | --+
+ Extrinsics Embed +----------------------+ |
|
2. Language Command ---> +----------------------+ | +----------------+
"Overtake the truck" | Text Encoder (LLM) | --+---> | |
+----------------------+ | | Transformer |
| | Backbone |
3. Ego-State ---> +----------------------+ | | (Fusion & |
(Speed, Accel) | MLP Projector | --+ | Reasoning) |
+----------------------+ | | |
| +-------+--------+
4. Navigation Context ---> +----------------------+ | |
(HD Map / Goal) | Map Encoder | --+ |
+----------------------+ v
[Trajectory Decoder]
Generate K points:
{(x1,y1,t1),
(x2,y2,t2)...}
2.3 动作空间:为什么选择“轨迹”?
VLA Agent 的输出设计直接决定了系统的鲁棒性。
2.4 从“开环”到“闭环”的鸿沟
这是 VLA 落地最艰难的一步。
2.5 安全护栏 (Safety Shield)
大模型本质上是概率模型,它永远存在“幻觉”的可能性。在 100km/h 的速度下,0.1% 的幻觉率也是不可接受的。因此,必须设计双系统架构。
System 1: VLA Agent (AI)
- 负责高层语义理解、复杂博弈、舒适性规划。
- 特点:聪明但不可靠。
System 2: Safety Shield (Rule-based / Optimization)
工作流:
- VLA 输出建议轨迹 。
- Shield 检查 是否与感知到的障碍物包围盒(Bounding Box)重叠。
- Shield 检查 的曲率是否会导致侧翻(动力学约束)。
- 如果通过,执行 ;如果不通过,Shield 启动回退策略(Fallback Policy):生成一条基于优化的、无碰撞的、通常是急刹车或保守绕行的轨迹。
3. 本章小结
- 端到端趋势:VLA 正在将自动驾驶从“规则堆砌”推向“数据驱动”,解决了传统栈中信息丢失的问题。
- 输入关键:不要丢失几何信息。多视角融合 + 相机外参嵌入 + Ego State 是标准动作。
- 输出选择:输出轨迹(Waypoints)而非控制指令,利用底层控制器处理高频物理动态和延迟补偿。
- 训练核心:仅靠开环(Open-loop)指标(如 L2 距离)毫无意义。必须依赖闭环仿真和 DAgger 等算法解分布偏移问题。
- 安全底线:AI 负责“开得好”,规则负责“不撞死”。Safety Shield 拥有最高否决权。
4. 练习题
基础题 (熟悉材料)
1. 模态丢失的影响
**题目**:如果一个 VLA Agent 仅使用前视摄像头(Front Camera)和 GPS 导航指令,没有侧视和后视输入。请列举三个在城市道路驾驶中必定会失败(或极度危险)的具体场景。
**Hint**:思考需要“回头看”或“侧面观察”的动作。
> **参考答案**:
> 1. **无保护左转/右转**:在十字路口转弯时,必须观察侧向来车。仅靠前视无法覆盖侧方盲区,极易发生侧面碰撞。
> 2. **变道(Lane Change)**:变道前必须确认目标车道后方是否有快速来车。没有后视/侧后视摄像头,变道等同于赌博。
> 3. **窄路会让**:在狭窄街道遇到对向来车需要靠边停车时,如果没有侧视视角,很难判断车侧面与路缘石(Curb)或路边停放车辆的距离,容易导致剐蹭。
>
>
2. 轨迹 vs 控制指令与延迟
**题目**:为什么说输出“未来3秒的轨迹点”比直接输出“当前方向盘转角”更能抵抗网络延迟?假设模型推理耗时 200ms。
**Hint**:思考当网络卡顿后,之前的指令是否还有效。
> **参考答案**:
> * **时空一致性**:轨迹是一系列带有时间戳的空间坐标(如 在 , 在 )。
> * **延迟补偿**:如果模型推理用了 200ms,底层控制器(Controller)收到轨迹时,可以简单地丢弃 的点,直接去追踪 及以后的点。
> * **控制指令失效**:如果直接输出“方向盘左转 10 度”,这个指令是基于 200ms 前的状态生成的。在延迟期间,车辆可能已经偏离,继续执行旧指令会导致严重的超调或震荡(画龙)。
>
>
3. 安全护的优先级
**题目**:Safety Shield 检测到 VLA 生成的轨迹将会在 1 秒后撞上前方突然急刹的前车。此时 Shield 应该做什么?(选择最佳策略并解释)
A. 重新 Prompt VLA 模型让其重试。
B. 对 VLA 的轨迹进行平滑插值修正。
C. 抛弃 VLA 输出,直接触发 AEB(自动紧急制动)逻辑。
**Hint**:紧急情况的时间预算通常小于 100ms。
> **参考答案**:
> **选择 C**。
> * **理由**:在即将碰撞的紧急关头(Time-to-Collision 很短),**时间是第一要素**。
> * A (重试):推理延迟太高,根本来不及。
> * B (修正):如果原轨迹是撞墙,微调平滑可能只是“温柔地撞墙”,或者修正算法本身过于复杂导致超时。
> * C (AEB):这是确定性的物理兜底。此时不应再追求舒适或智能,首要目标是利用最大物理摩擦力避免碰撞。
>
>
挑战题 (开放性思考)
4. 冻结机人问题 (The Freezing Robot Problem)
**题目**:在人流密集的复杂路口,如果将 Safety Shield 的安全阈值设置得非常保守(例如:与任何物体保持 2 米距离),VLA Agent 可能会陷入“原地不敢动”的状态,因为任何轨迹都会触发 Shield 的拦截。如何设计一种机制来解决这个问题,既保证安全又能完成任务?
**Hint**:人类司机在人群中是如何一点点“挤”过去的?
> **参考答案**:
> **解决方案:交互式规划与动态风险评估**
> 1. **速度相关阈值**:Safety Shield 的安全距离应是**速度的函数**。如果车速极低(如 < 3km/h),允许与障碍物的距离缩短至 10-20cm。这允许车辆进行“蠕行(Creeping)”。
> 2. **交互预测 (Interactive Prediction)**:模型不能假设行人是静止的障碍物。需要预测“如果我向前蠕行一点,行人会避让”的概率。
> 3. **分级 Shield**:
> * *Level 1 (Warning)*: 距离但速度低,允许通过,但随时准备刹车。
> * *Level 2 (Critical)*: 预测到必然碰撞,强制刹车。
>
>
>
>
> * **实施**:VLA 生成带有“意图博弈”的低速轨迹,Shield 在低速下放宽空间约束,允许车辆慢慢“挤”过人群。
>
>
5. 语言指令的歧义消解
**题目**:用户指令是“在前面那个路口右转”。但视觉感知显示前方有两个紧挨着的路口(一个小的加油站入口,一个真正的十字路口)。VLA 应该如何利用多模态能力来消解这个歧义?
**Hint**:不仅要看,还要会问,或者查地图。
> **参考答案**:
> **策略:多源验证与主动澄清**
> 1. **地图对齐 (Map Grounding)**:VLA 结合 GPS 和 HD Map,查询“路口”的定义。通常加油站入口在地图属性上不是“Intersection”,从而排除干扰。
> 2. **视觉语义推理**:分析路口特征。真正的路口通常有红绿灯、路牌、人行横道;加油站入口则没有。
> 3. **主动询问 (Active Querying)**:如果置信度相近(例如两个都是小路口),Agent 应生成语音反问:“是第一个路口还是第二个有红绿灯的路口?”
> 4. **保守决策**:在得到确认前,保持在右侧车道行驶,但暂不执行转弯动作,避免误入。
>
>
6. 奖励函数设计 (Reward Engineering)
**题目**:如果你使用强化学习(RL)微调 VLA Agent,你需要设计 Reward Function。简单的 `Reward = +1 if success else 0` 过于稀疏,难以训练。请设计一个稠密的 Reward 函数,包含至少 4 个分量,并解释每个分量的作用。
**Hint**:参考 PID 控制的误差项和乘客的感受。
> **参考答案**:
>
>
> 1. **进度奖励 (Progress Reward)** :车辆沿正确导航路径前进的速度投影。鼓励车辆往终点开,而不是原地不动。
> 2. **车道居中奖励 (Centering Reward)** :车辆中心与车道中心线的横向偏差的负值。鼓励走直线,不画龙。
> 3. **舒适度奖励 (Comfort Reward)** :惩罚急加速(Acc)、急刹车和急转弯(Jerk)。。
> 4. **碰撞惩罚 (Collision Penalty)** :如果发生碰撞或离障碍物过近,给予巨大的负奖励(如 -1000)并终止回合。
>
>
> * *注*:权重 的调节是关键, 必须占绝对主导地位。
>
>
7. 长尾场景:交警手势
**题目**:在通过一个复杂的施工路段时,车道线混乱,交警在手势指挥。VLA Agent 通常难以仅仅通过数据训练学会这种极低频场景。请结合“多模态 RAG”或“Handoff”提出解决方案。
**Hint**:Agent 不一定要自己解决所有问题,它需要知道何时“求助”。
> **参考答案**:
> * **方案:不确定性估计 + 远程接管 (Tele-operation)**
>
>
> 1. **检测异常**:VLA 输出轨迹的置信度(Logprobs)极低,或者视觉模块检测到“Police Officer”类,但没有明确的动作指令匹配。
> 2. **RAG 检索 (可选)**:检索类似的施工案例库,看是否有类似场景的应对策略(如“无视车道线,跟随前车”)。
> 3. **降级与接管**:如果置信度仍低于阈值,Agent 触发“Handoff”信号,减速停车或进入极低速的“跟随模式”(Creep mode),并请求云端驾驶员(人类)介入。
>
>
5. 常见陷阱与错误 (Gotchas)
5.1 恐怖的“因果混淆” (Causal Confusion)
- 现象:模型学会了“只要仪表盘上的刹车灯亮了,我就输出刹车指令”。
- 原因:在训练数据中,刹车灯亮(输入)和车辆减速(输出)是高度相关的。模型走了捷径,没去学“因为前面有人所以刹车”,而是学了“因为灯亮所以刹车”。
- 后果:惯性效应。一旦模型决定刹车,下一帧它看到自己在刹车,就会继续刹车,导致车在路中间停死,即使前方障碍物已消失。
- 修复:严禁将车辆自身的执行器状态(如刹车灯状态、油门踏板深度历史)作为视觉特征喂给模型。只喂环境状态(速度、加速度是物理状态,可以喂)。使用 Dropout 随机屏蔽历史信息。
5.2 模拟器过拟合 (Simulator Overfitting)
- 现象:在 CARLA 里跑分 SOTA,实车一上路就撞。
- 原因:模拟器的纹理、光照太完美,或者物理碰撞太简单。模型记住了 CARLA 树木的特定绿色 RGB 值。
- 修复:域随机化 (Domain Randomization)。训练时随机改变天空颜色、调整摄像头噪点、甚至随机关掉几个摄像头。让模型学会依赖“几何结构”而不是“纹理细节”。
5.3 坐标系变换噩梦
- 现象:车向左转,但轨迹向右指,或者车子在原地打转。
- 调试技巧:
- 确认 Camera Coordinate System:OpenCV 是“右-下-前”,而自动驾驶常用“前-左-上”。
- 确认 Ego vs World:VLA 输出的轨迹通常是基于当前时刻车身坐标系的相对坐标。千万不要把它当成绝对的经纬度或 Map 坐标去执行。每帧都需要做
T_world_to_ego 的变换。
- 可视化一切:在调试时,必须将模型输出的轨迹投影回 Camera 图像上进行肉眼验证。
5.4 “僵尸车”现象
- 现象:模型遇到稍微没见过的情况(OOD),就倾向于停车。
- 原因:在数据集中,“停车”是最安全的动作,也是出现频率很高的动作(等红灯、堵车)。数据不平衡导致模型学会了“只要不确定,停车总是对的”。
- 修复:数据重采样(Resampling),降低停车样本的权重;或者使用逆强化学习(IRL)来学习更激进的策略。