论文解读:端到端与扩散式时空规划¶
覆盖论文: - UniAD(Hu et al., CVPR 2023 Best Paper, arXiv:2212.10156)⭐⭐⭐ 核心 - Diffusion Policy(Chi et al., RSS 2023 / IJRR 2024, arXiv:2303.04137)⭐⭐⭐ 核心 - PLUTO(Cheng et al., arXiv:2404.14327, 2024)⭐⭐⭐ 核心 - VAD / VADv2(Jiang et al., ICCV 2023 / 2024)⭐⭐ 非核心 - Hydra-MDP(Li et al., CVPR 2024 NAVSIM Challenge)⭐⭐ 非核心 - Diffusion Planner(Zheng et al., ICLR 2025 Oral, arXiv:2501.15564)⭐⭐ 非核心 - EMMA(Waymo, Gemini-based, arXiv 2024-10)⭐⭐ 非核心 - Diffuser(Janner et al., ICML 2022)🔹 前驱
代码仓库:
OpenDriveLab/UniAD、real-stanford/diffusion_policy、jchengai/pluto、taco-group/OpenEMMA、MCZhi/GameFormer-Planner解读目标:掌握"端到端学习规划"与"扩散式轨迹生成"两条 2024–2026 前沿范式的核心原理与工程实现,理解它们为什么天然产出**时空联合轨迹**(直接输出 \((x(t),y(t))\) 而非 path + speed),并能独立复现核心结果。
本章定位:本章是"时空联合规划"专题的收官章(T6)。前五章(T1 Frenet/ST 图、T2 时空走廊、T3 CILQR/TEB、T4 Apollo/Autoware、T5 MAPF)建立的是**经典优化与搜索**范式——人手设计代价、约束、求解器。本章转向**学习生成**范式:让神经网络从数据中直接学出时空轨迹。理解前五章的"显式建模",才能看清本章"隐式学习"到底替换掉了什么、又留下了什么没解决(安全性验证)。
📌 解读数据说明(务必先读)
本解读的**论文事实层**(标题、作者、会议/年份、arXiv 编号、核心结论、关键实验数字、代码仓库地址与顶层结构)已通过**联网检索官方来源核实**(论文 arXiv、官方 GitHub、会议主页);但**未** clone 源码逐行比对,也未做 MinerU 全文逐页核对。因此:
- 代码走读:均为"基于公开实现的**示意性**走读"。文件名为**真实仓库的模块名**(如 UniAD 的
mmdet3d_plugin/uniad/dense_heads/、整体入口uniad_e2e.py,均已核实存在),但**具体行号L###为指示性定位、未逐行核对**;标注# 示意的代码块是为讲解改写的教学版,标注# 源码结构的是依据公开实现还原的结构。- 论文引用:定位到**方法节/组件**(如"MotionFormer 节"),不杜撰未核实的精确页码与 Eq. 编号。
- 数值:已核实的关键数字(如 UniAD planning 平均碰撞率 0.31%)直接给出;仍未核实的个别数字保留「需核验」。
- 歧义审计 / 论文-代码差异:CONFLICT 项基于公开认知列出,凡未经逐行核对的标注「待源码确认」。
进一步提供 clone 源码 + 论文全文后,可将代码走读精修到逐行级、补齐精确页码与 CONFLICT 判定。当前版本在论文事实层已达可信,工程实现层为示意——这一区分请在阅读代码走读时始终记住。
前置自测¶
读这一章前先自测以下 5 题。论文解读章不像方法章那样自包含——它假设你已掌握扩散模型、注意力机制、模仿学习的基础。若有 2 题以上答不上,建议先补对应基础(深度学习的 DDPM/Transformer、本专题 T1–T5)。
- (扩散基础) DDPM 的前向过程对一段干净数据做什么?反向(去噪)过程训练网络预测什么?推理时从什么状态开始?
- (注意力) DETR 的 object query 是什么?经过若干层 cross-attention 后它"吸收"了什么?它与一个检测框(中心+长宽+朝向+类别)相比,携带的信息有何本质不同?
- (评估) 开环评估与闭环评估的本质区别是什么?为什么一个模仿学习模型可能开环 L2 很低、闭环却频频压线急刹?
- (模仿学习) 行为克隆(BC)的两大固有问题是什么?(提示:一个关于训练/测试分布,一个关于因果。)
- (优化范式) "生成-验证"(或"生成-投影")范式指什么?请从本专题前几章(如 T3 的优化、T4 的工业栈)举一个你已知的例子。
第 1、2 题指向**深度学习基础**(扩散 / 注意力);第 3、4 题是本章 PLUTO 节的核心,也是评估一切学习式规划器的标尺;第 5 题贯穿全章——它是给神经网络规划器加安全兜底的通用答案。
参考答案要点(先自己作答,再对照;每条标注本章深入位置):
- 前向过程把干净数据**逐步加高斯噪声**直到近似纯噪声(有闭式,可一步到任意噪声级);反向过程训练网络**预测加进去的噪声 \(\epsilon\)**(等价于预测 score);推理从**纯高斯噪声**起步逐步去噪。→ 详见核心论文 B 组件①、组件②补充。
- object query 是**可学习向量**,cross-attention 后它"吸收"了某个目标的**高维实例信息**(外观、运动、上下文);相比检测框(十来个标量)信息量大得多、未被压扁。→ 详见核心论文 A 组件②③。
- 开环用真实历史回放、输出不影响下一步输入、误差不累积;闭环让**输出反馈成输入**、误差累积放大。模仿模型只在专家分布附近训练过,闭环一旦偏离就进入没见过的状态→雪球。→ 详见核心论文 C 动机、深入二。
- 分布偏移(训练用专家分布、测试是模型自造分布)与**因果混淆**(学到伪相关而非真因果)。→ 详见深入二。
- 用学习模型**生成**高质量/多模态候选,用显式规则或优化**验证并兜底**安全。已知例子:T4 Apollo 的 EM Planner 输出后用 QP + 约束做可行化(生成-投影的经典版)。→ 全章统一范式,详见范式总结、安全过滤架构。
若第 1、4 题答不上,强烈建议先补深度学习扩散与模仿学习基础再读本章;第 3、5 题答不全不要紧——它们正是本章要带你彻底打通的核心。
本章目标¶
学完本章后,你应该能够:
- 阐述 端到端范式相对模块化经典栈的两个根本动机(信息瓶颈、目标不一致),并说明为什么所有端到端/扩散方法都**天然时空联合**(直接输出 \((x(t),y(t))\),绕过 T1 的 PVD)。
- 复述 UniAD 的 planning-oriented 架构:query 接口如何让信息不被"压扁"、规划梯度如何反传到感知,以及基于 occupancy 的碰撞后优化为何是关键 trick。
- 推导 Diffusion Policy 的前向加噪 / 反向去噪 / 训练目标,解释多模态从随机噪声起点而来,并清晰区分**去噪步 \(k\)** 与**动作时间步 \(t\)**。
- 解释 闭环为何比开环难(误差累积 + 分布偏移),以及 PLUTO 的纵横感知 + 对比学习 + 数据增强如何各自缩小开环-闭环鸿沟。
- 选型 在场景表示 / 输出形式 / 多模态 / 安全保证 / 训练范式 / 实时性等维度上对 7 个方法横向对比,并按任务需求做出有理有据的选择。
- 识别 端到端规划的核心未解难题(神经网络规划器的安全验证),理解"生成-验证"安全外壳为何是当前唯一务实答案。
- 运用 论文解读方法(三栏式 / 论文-代码映射表 / 四级歧义审计 / 研究视角)独立精读一篇前沿规划论文。
本章知识导航¶
本章是**论文解读**章,主线是一条技术演进线,而非并列的知识点。组织方式:先给技术树全景(森林),再按"局限→下一篇动机"的因果链逐篇展开(树),最后综合对比(生态)。
背景与动机(为什么需要端到端 / 为什么天然时空联合)
│ 技术树全景:G1 模仿 → G2 UniAD → G3 VAD → G4 扩散 → G5 PLUTO → G6 EMMA
▼
核心论文 A:UniAD(G2 范式奠基)
│ 局限①密集表示 → VAD ;局限②单模态 → 扩散 ;局限③开环 → 闭环
▼
核心论文 B:Diffusion Policy(G4 生成范式,跨自驾/机械臂)
│ 局限:推理慢 / 不保证约束 / 闭环未验
▼
核心论文 C:PLUTO(G5 闭环突破)
│ 局限:受限专家 → Hydra ;无安全保证 → 安全滤波 ;任务专用 → EMMA
▼
非核心群(VAD / Hydra-MDP / Diffusion Planner / EMMA)+ 安全过滤架构
▼
设计空间全景(7 方法横向对比 + 选型决策图)→ 范式总结
阅读路径建议:
- 第一遍(抓范式):背景与动机 → 三篇核心论文各自的"一句话总结 + 核心贡献 + 局限",跳过三栏式代码走读,先把技术演进线串起来。
- 第二遍(吃方法):回到三栏式,重点啃 Diffusion Policy 的扩散数学和 PLUTO 的对比学习——这两处是全章最硬的方法内核。
- 第三遍(建判断):设计空间全景 + 范式总结 + 故障排查,从"理解方法"上升到"会选型、知边界"。
预计阅读时间¶
| 档位 | 时间 | 覆盖范围 |
|---|---|---|
| 速查 | 30 分钟 | 技术树全景 + 设计空间对比表 + 知识点总表,建立"有哪些方法、各自定位"的全局图 |
| 速读 | 4-5 小时 | 正文 + 跳过代码走读细节,抓住三篇核心论文的方法直觉与因果串联 |
| 精读 | 20-30 小时 | 全文 + 完成全部练习 + 跑通三个 A 型复现(Diffusion Policy PushT / UniAD 推理 / PLUTO 闭环) |
论文-代码映射表(总览)¶
下表把三篇核心论文的关键方法组件映射到对应代码模块,并按四级清晰度标注(SPECIFIED 论文明确且与码一致 / PARTIAL 论文提及但细节需从码补 / UNSPECIFIED 论文未提仅码中有 / CONFLICT 论文与码不一致)。所有 PARTIAL/UNSPECIFIED/CONFLICT 项在正文对应段落都有展开,全表也在章末"歧义审计汇总表"中复列。
| 论文 | 方法组件 | 对应代码(模块名已核实,行号为示意) | 清晰度 | 备注 |
|---|---|---|---|---|
| UniAD | 整体 pipeline 协调 | uniad_e2e.py(已核实为顶层入口) |
SPECIFIED | 协调下列所有 task module |
| UniAD | BEV 编码(BEVFormer) | projects/mmdet3d_plugin/uniad/dense_heads/ + BEVFormer backbone |
SPECIFIED | 复用 BEVFormer,时空注意力 |
| UniAD | TrackFormer(检测+跟踪) | .../dense_heads/track_head/ |
PARTIAL | track query 跨帧传播细节需读码 |
| UniAD | MotionFormer(运动预测) | .../dense_heads/motion_head/(已核实存在) |
PARTIAL | 三类交互注意力的具体掩码需核实 |
| UniAD | Planner(自车规划) | .../dense_heads/planning_head/ |
PARTIAL | 含基于 occupancy 的碰撞后优化 |
| UniAD | 碰撞后优化(collision optimizer) | .../dense_heads/planning_head/ |
UNSPECIFIED | 论文一笔带过,关键 trick 在码中 |
| Diffusion Policy | DDPM 去噪网络 | diffusion_policy/policy/diffusion_* |
SPECIFIED | U-Net / Transformer 两版 |
| Diffusion Policy | 观测条件化(FiLM / cross-attn) | .../model/diffusion/conditional_unet1d.py |
PARTIAL | 条件注入方式两版不同 |
| Diffusion Policy | receding-horizon 执行 | .../policy/*.predict_action |
UNSPECIFIED | 论文图示,执行步数 \(T_a\) 在码/config |
| PLUTO | longitudinal-lateral aware query | pluto/models/ |
PARTIAL | query 构造细节需读码 |
| PLUTO | 对比学习模块(CIL) | .../modules/contrastive_* |
PARTIAL | 正负样本构造需核实;ckpt 名 pluto_1M_aux_cil 印证 |
| PLUTO | nuPlan 闭环接口 | .../planner/pluto_planner.py(已核实存在) |
SPECIFIED | 对接 nuPlan simulation |
映射表的价值不在"对照",而在**导航**:当你真正去复现某篇论文,遇到论文语焉不详处,先查这张表——标 PARTIAL/UNSPECIFIED 的节,意味着"别信论文、去读代码"。
背景与动机¶
这个方向要解决什么问题¶
把前五章的经典栈在脑子里跑一遍:相机/激光 → 感知(检测、跟踪、建图)→ 预测(他车未来轨迹)→ 规划(Frenet + ST 图 + QP)→ 控制。这是一条**手工设计、模块串联**的流水线,每个模块单独训练或单独调参,模块之间用人为定义的接口(检测框、预测轨迹、代价函数)传递信息。
这条流水线有两个深层问题,正是本章所有工作要回应的:
问题一:累积误差与信息瓶颈。 感知模块输出的检测框丢掉了原始特征里的不确定性;预测模块基于这些框做预测,误差进一步放大;规划模块拿到的是被两层处理"压扁"过的信息。每一道人为接口都是一个信息瓶颈——上游一个漏检,下游规划无从补救。
问题二:优化目标不一致。 感知模块优化的是检测精度(mAP),预测优化的是轨迹误差(ADE/FDE),规划优化的是舒适与安全。没有一个模块在直接优化"最终把车开好"这件事。 检测精度高 0.5% 不一定让车开得更好,但模块化范式无法表达这种"以终为始"的目标。
本质洞察:经典栈的本质是**用人类先验把一个端到端问题切成若干个子问题**,每个子问题有清晰的、可监督的中间表示(框、轨迹、代价)。这让系统**可解释、可调试、可验证**,代价是**信息在接口处损失、目标在模块间割裂**。本章的端到端范式做的恰好是反向操作——拆掉中间接口,让梯度从最终目标一路反传到原始传感器。这笔交易换来了信息保真和目标一致,代价是可解释性与可验证性——而后者正是端到端方法至今未能解决的核心难题(见章末范式总结)。
而**扩散式**范式回应的是另一个问题——多模态。在一个无保护左转路口,"现在抢行"和"等待让行"是两个都合理但完全不同的决策。经典优化器输出单条最优轨迹,会把两个模式"平均"成一条危险的中间轨迹(既没抢成也没让够)。扩散模型天然能表示多峰分布,一次采样出多条各自自洽的候选——这正是它在机械臂(多种抓取方式)和自驾(多种交互策略)上都奏效的原因。
这两条范式为什么天然是"时空联合"的¶
这是本章与前五章最根本的连接点。回忆 T1:经典栈做 PVD(路径-速度分解)——先定几何路径 \(\sigma(s)\),再定速度剖面 \(s(t)\)。本章所有方法**绕过了 PVD**:
- UniAD 的 Planner 直接回归未来 \(T\) 个时刻的自车位置 \((x_1,y_1),\dots,(x_T,y_T)\)——带时间戳的点序列,路径和速度信息揉在一起,没有"先路径后速度"。
- Diffusion Policy / Planner 把整条轨迹 \(\tau = [(x_t,y_t)]_{t=1}^T\) 当作一个**去噪对象**,从噪声里一次性生成——同样是时空联合。
换句话说,学习式方法回到了 T1 一开始就放弃的"完整轨迹直接优化"——只不过经典方法因为这个问题非凸、高维、实时性差而放弃,学习方法则用"离线训练承担计算、在线只做前向"绕开了实时性难题。这是一个漂亮的呼应:PVD 是为了让人手设计的优化器能实时求解而做的妥协;当求解器换成神经网络,这个妥协就不再必要了。
技术树全景¶
先看森林,再看树。端到端规划的技术演进可以画成下面这棵树——六代工作,两条主线(模仿学习主线 + 扩散生成主线)在 2024–2025 交汇:
G1 模仿学习开端(2016-2020)
ChauffeurNet (Waymo'19) / LBC (CVPR'20)
核心:直接模仿人类驾驶 → 因果混淆 + 分布偏移两大病
│
▼
G2 模块化端到端(2023)★ 转折点
UniAD (CVPR'23 Best Paper) ◄────────────── 核心论文 A
核心:感知-预测-规划 query 贯通,planning-oriented
│
├──────────────────────┐
▼ ▼
G3 矢量化端到端(2023-24) (另一条线:生成式)
VAD / VADv2 G4 扩散规划(2022-25)
核心:矢量化场景,更快 Diffuser (ICML'22, 🔹前驱)
│ │
│ ▼
│ Diffusion Policy (RSS'23) ◄── 核心论文 B
│ 核心:轨迹=去噪过程,天然多模态
│ │
▼ ▼
G5 闭环 SOTA(2024) Diffusion Planner (2025)
PLUTO (arXiv'24) ◄──────── 核心论文 C 自驾版扩散,联合去噪
Hydra-MDP (CVPR'24 Chal.)
核心:模仿学习首次在 nuPlan 闭环超越规则派
│
▼
G6 大模型驾驶(2024-26)
EMMA (Waymo, Gemini) / DriveVLM / LMDrive
核心:多模态大语言模型直接输出规划轨迹
读这棵树的三个关键转折:
- G1→G2:从"一个网络端到端模仿"到"模块化但梯度贯通"。UniAD 的贡献不是端到端本身(G1 就端到端了),而是**保留了中间任务监督的同时让梯度贯通**——既要可解释的中间表示,又要端到端的目标一致。
- 分叉:G3 矢量化(VAD)和 G4 扩散(Diffusion Policy)是两条平行路线,分别优化"效率"和"多模态"。
- G5 的里程碑意义:2024 年 PLUTO/Hydra-MDP 首次让模仿学习在 nuPlan 闭环超越规则派——在此之前,"学习方法开环指标好但闭环不如规则"是领域共识,G5 打破了它。
三篇核心论文恰好踩在三个关键节点:UniAD(G2 范式奠基)、Diffusion Policy(G4 生成范式的代表,且跨自驾/机械臂)、PLUTO(G5 闭环突破)。下面逐篇深读。
核心论文 A:UniAD —— Planning-oriented Autonomous Driving ⭐⭐⭐¶
论文信息:Yihan Hu, Jiazhi Yang, Li Chen, Keyu Li, ... , Hongyang Li 等,Planning-oriented Autonomous Driving,CVPR 2023 Best Paper(9000+ 投稿中 12 篇 Award Candidate,最终获 Best Paper),arXiv:2212.10156,OpenDriveLab(上海 AI Lab)。代码:
OpenDriveLab/UniAD(Apache-2.0,PyTorch;整体 pipeline 由uniad_e2e.py控制,任务模块在projects/mmdet3d_plugin/uniad/dense_heads/)。
一句话总结 + 核心贡献¶
一句话:UniAD 把检测、跟踪、建图、运动预测、占据预测、规划六个任务统一进**一个网络**,所有任务以 query 为接口串联,并以**规划(planning)为最终导向**组织整个架构——使得规划的梯度可以一路反传到感知,实现"以终为始"的联合优化。
核心贡献(这正是 Best Paper 的分量所在,研究视角一节会再剖析):
- planning-oriented 的架构哲学:不是"把多个任务塞进一个网络"(多任务学习早就有),而是论证了**应该让中间任务都服务于规划这个最终目标**,并给出了一套让信息从感知流向规划、梯度从规划流回感知的具体接口设计。
- query 作为统一接口:用 query 向量在模块间传递实例级信息(每个 agent 一个 query),避免了检测框这种"压扁"的中间表示。
- 首个在 nuScenes 上把这六个任务做到联合 SOTA 的系统,且消融实验系统性地证明了"每个上游任务都对规划有正贡献"。
动机:模块化 vs 端到端的"第三条路"¶
在 UniAD 之前,自驾系统有两种极端:
- 模块化(经典栈):感知、预测、规划独立模块,可解释但信息瓶颈(背景节已述)。
- 纯端到端(G1,如 ChauffeurNet):单一网络从传感器直接到控制,目标一致但**黑盒、无中间监督、难调试**,且容易因果混淆(模型可能学到"前车刹车灯亮→我刹车"的伪相关而非真正理解场景)。
UniAD 的动机就是走**第三条路**:
反事实推理:如果 UniAD 不保留中间任务监督,直接像 ChauffeurNet 那样端到端回归轨迹,会怎样?答案是退回 G1 的老路——失去可解释性、训练不稳定、容易学到捷径特征。如果 UniAD 不让梯度贯通,只是把六个独立模块拼在一起各自训练,会怎样?那就是模块化范式,信息仍在接口处损失。UniAD 的设计精确地落在两个极端之间:用中间任务监督保住可解释性与训练稳定性,用 query 接口 + 联合训练保住信息保真与目标一致。
核心方法(按组件展开)¶
UniAD 的数据流是一条"感知→预测→规划"的链,但每一环都通过 query 把信息喂给下一环:
多视角相机图像
│ ① BEV 编码(BEVFormer backbone)
▼
BEV 特征 B ∈ R^{H×W×C}
│ ② TrackFormer:track query Q_A → 检测+多目标跟踪
├──────────────► track query Q_A(每个 agent 一个)
│ ③ MapFormer:map query Q_M → 在线建图(车道/分隔线)
├──────────────► map query Q_M
│ ④ MotionFormer:用 Q_A, Q_M, B → 多智能体联合运动预测
├──────────────► motion query / agent 未来
│ ⑤ OccFormer:→ 未来多步占据栅格 O_t
├──────────────► occupancy O_t(用于碰撞)
▼ ⑥ Planner:ego query + B + O_t → 自车未来轨迹 (x_t, y_t)
自车时空轨迹 τ = [(x_1,y_1),…,(x_T,y_T)]
下面用三栏式精讲三个最关键的组件:query 传递机制(②③④ 的灵魂)、MotionFormer 的三类交互、Planner 的碰撞后优化(最关键、论文最语焉不详、代码 trick 最密集的一环)。其余组件(BEV 编码、OccFormer)只做要点说明,因为 BEV 编码复用 BEVFormer(属前置知识),OccFormer 与规划的耦合相对间接。
组件 ②③④:query 作为统一接口¶
论文原文(转述)。 论文在方法总览中强调:各任务节点不再通过显式的、人为定义的中间结果(如检测框、栅格图)连接,而是通过 query 这一可学习的特征向量连接——每个 agent 对应一个 query,它在 TrackFormer 中被初始化与更新,并作为后续 MotionFormer、Planner 的输入之一。(UniAD 方法总览节)
用人话重新讲一遍。
先说 query 是什么。在 DETR 系列里,一个 "object query" 是一个可学习的向量,网络通过它"问"图像:"这里有没有一个目标?是什么?在哪?" 经过若干层 cross-attention(query 去 attend 图像特征),这个向量就"吸收"了某个目标的全部信息。
UniAD 的关键 insight 是:这个吸收了某 agent 全部信息的 query 向量,比一个检测框(中心点 + 长宽 + 朝向 + 类别,区区十来个数)携带的信息丰富得多。 检测框是 query 经过一个检测头"压扁"后的结果;而 query 本身还保留着这个 agent 的外观、运动趋势、上下文关系等高维信息。
所以 UniAD 不把检测框传给下游,而是把 **query 本身**传下去:
- TrackFormer 产出每个被跟踪 agent 的 track query(跨帧传播,实现端到端跟踪——同一个 agent 的 query 在连续帧间延续,天然完成数据关联)。
- 这些 track query 直接喂给 MotionFormer 做运动预测,喂给 Planner 做规划。下游拿到的是"完整的 agent 表示"而非"压扁的框"。
本质洞察:query 接口的本质是**把"信息损失点"从模块边界推迟到尽可能晚**。经典栈在感知输出框时就损失了信息;UniAD 让高维 query 一直流到规划,只在每个任务需要可监督输出时才"分叉"出一个压扁的预测(框/轨迹)用于计算 loss,而主干信息流不被压扁。这就是"既要中间监督、又要信息保真"如何同时实现的技术答案。
代码实现走读(示意,行号需核实)。
# 来源:OpenDriveLab/UniAD,track_head / motion_head(源码结构,示意性走读)
# 核心:track query 在帧间传播,并作为下游输入——不经过"检测框"中转
class UniADPipeline(nn.Module): # 示意:实际拆在多个 head 中
def forward_single_frame(self, imgs, prev_track_query):
bev = self.bev_encoder(imgs) # ① BEVFormer → BEV 特征
# ② TrackFormer:上一帧的 track query + 新生 query 一起 attend BEV
# track_query 跨帧延续 = 端到端跟踪(无需匈牙利匹配做数据关联)
track_query = self.track_former(bev, prev_track_query) # [N_agent, C]
det_boxes = self.det_head(track_query) # 仅用于算检测 loss,不下传
map_query = self.map_former(bev) # ③ 在线建图 query
# ④ MotionFormer:直接吃 track_query / map_query,而不是 det_boxes
agent_futures = self.motion_former(track_query, map_query, bev)
occ = self.occ_former(track_query, bev) # ⑤ 未来占据
# ⑥ Planner:ego query + BEV + occupancy
ego_traj = self.planner(self.ego_query, bev, occ, agent_futures)
return ego_traj, track_query # track_query 传给下一帧
注意第 det_boxes 行的注释——检测框只用于计算检测 loss,不参与下游信息流。这是"中间监督但信息不压扁"的代码级体现,也是初学者读 UniAD 最容易看错的地方(见陷阱 1)。
组件 ④(深入):MotionFormer 的三类交互¶
论文原文(转述)。 MotionFormer 通过建模 agent 与 agent、agent 与地图、agent 与目标点(goal)三类交互,联合预测所有 agent 的多模态未来轨迹。(MotionFormer 节)
用人话重新讲一遍。 预测一辆车的未来,光看它自己不够,要看三样东西:
- agent–agent 交互:旁边的车在干什么(它要并线,我可能要让)。实现为 agent query 之间的 self-attention。
- agent–map 交互:道路结构约束(车道要拐弯,车也得拐)。实现为 agent query 对 map query 的 cross-attention。
- agent–goal 交互:每个 agent 可能去哪(goal point),不同 goal 对应不同模态。这是"多模态"的来源——一辆车在路口可能直行也可能右转,对应不同 goal,预测出多条轨迹。
这三类交互是 GameFormer、VAD 等后续工作反复沿用的设计,可视为运动预测的"标准三件套"。
代码实现走读(示意)。
# 来源:OpenDriveLab/UniAD,motion_head(源码结构,示意)
class MotionFormerLayer(nn.Module):
def forward(self, agent_q, map_q, goal_anchors, bev):
# 1) agent–agent:彼此 attend
agent_q = self.agent_self_attn(agent_q, agent_q, agent_q)
# 2) agent–map:attend 在线地图
agent_q = self.agent_map_attn(q=agent_q, k=map_q, v=map_q)
# 3) agent–goal:对一组目标锚点 attend → 多模态
agent_q = self.agent_goal_attn(q=agent_q, k=goal_anchors, v=goal_anchors)
return agent_q # 每个 agent 输出 K 条模态轨迹
组件 ⑥(最关键):Planner 与基于 occupancy 的碰撞后优化¶
这是整篇论文**理论上一笔带过、但实际最 work 的一环**,也是论文-代码差异最大的地方——典型的"论文没告诉你的"。
论文原文(转述)。 Planner 以 ego query 结合 BEV 与场景信息回归自车未来轨迹;为提升安全性,在预测轨迹基础上利用未来占据进行碰撞规避的优化。(Planning 节,对优化细节着墨很少)
用人话重新讲一遍。 Planner 分两步:
第一步,学习式回归:ego query(代表自车)attend BEV 特征和场景信息,回归出未来 \(T\) 步的轨迹点 \((x_t,y_t)\)。注意这里直接输出带时间的轨迹点——这就是"时空联合"在 UniAD 里的体现,没有 path/speed 解耦。
第二步,基于 occupancy 的碰撞后优化(关键 trick):纯学习回归的轨迹不保证不撞。UniAD 用 OccFormer 预测的未来占据栅格 \(O_t\) 做一次**后优化**——把"轨迹点落在未来被占据的格子里"作为一个碰撞代价,用梯度下降微调轨迹点,把它从危险区"推"开。这一步是把**软的学习先验**和**显式的安全约束**缝合起来。
代码实现走读(示意)。
# 来源:OpenDriveLab/UniAD,planning_head(源码结构,示意性还原)
def plan_with_collision_optimization(ego_query, bev, occ_future, init_traj):
# 第一步:学习式回归
traj = init_traj if init_traj is not None else regress_traj(ego_query, bev)
# 第二步:用未来 occupancy 做碰撞后优化(论文几乎没展开的关键步骤)
traj = traj.clone().requires_grad_(True)
for _ in range(N_ITER): # N_ITER:论文未给,码中常数(UNSPECIFIED)
cost = collision_cost(traj, occ_future) # 轨迹点落在占据格 → 高代价
cost = cost + smoothness_cost(traj) # 平滑正则
grad = torch.autograd.grad(cost, traj)[0]
traj = traj - LR * grad # 沿梯度把轨迹推离障碍
return traj.detach()
💡 论文没告诉你的(组件 ⑥)¶
| 隐藏细节 | 论文 | 来源 | 教学价值 |
|---|---|---|---|
碰撞优化迭代步数 N_ITER、步长 LR |
未给 | 代码常数(UNSPECIFIED,需核实) | 复现时这两个值直接决定"推得够不够远又不过冲" |
| 碰撞代价的具体形式(occupancy 阈值/软化) | 一笔带过 | 代码逻辑 | 太硬→轨迹抖动,太软→推不开,是调参核心 |
| occupancy 与 planner 是否端到端联合训练 | 含糊 | 已核实:Stage 2 联合训练(SPECIFIED,见组件⑦) | OccFormer 误差经联合训练被规划目标部分纠正,非单向污染 |
本质洞察(trick 的可迁移性):UniAD 的"学习回归 + 基于预测占据的碰撞后优化"是一个**通用的"生成-投影"模板**——先用学习模型给一个高质量初值,再用显式代价做可微投影把它拉回可行域。这个模板会在本章反复出现:Diffusion Planner 的"去噪 + 约束投影"、Autoware 的"diffusion_planner + safety_filter"都是它的变体。记住这个模板,你就抓住了"如何给学习式规划器加安全兜底"的一般答案。
组件 ①(补全):BEV 编码——整条链的输入地基¶
前面三栏式聚焦 ②③④⑥(query、交互、规划),但整条链的**地基**是 ① BEV 编码——没有高质量的 BEV 特征,后面全部白搭。它复用 BEVFormer,属前置知识,这里做简化三栏式(深入四会单独讲 BEV 表示的原理)。
论文原文(转述)。 UniAD 以 BEVFormer 作为骨干,将多视角相机图像编码为统一的 BEV 特征,并通过时序自注意力融合历史帧信息。(方法总览/骨干节)
用人话重新讲一遍。 六个相机各看一个方向的透视图,但规划需要的是一张"俯视地图"。BEVFormer 做两件事:① 空间 cross-attention——在 BEV 网格上放一组 BEV query,每个 query 对应地面上一个 \((x,y)\) 格子,让它通过相机投影几何去对应的图像区域"采样"特征(把透视图特征搬到俯视格子上);② 时序 self-attention——把上一帧的 BEV 特征用自车运动 warp 对齐到当前帧,与当前 BEV 融合,让运动信息(速度、加速度趋势)进入特征。输出的 BEV 特征 \(B\in\mathbb R^{H\times W\times C}\) 就是后面所有模块的共同输入。
代码实现走读(示意,行号需核实)。
# 来源:BEVFormer / UniAD bev_encoder(源码结构,示意性走读)
class BEVEncoder(nn.Module):
def forward(self, multi_view_imgs, prev_bev, ego_motion):
img_feats = self.img_backbone(multi_view_imgs) # 每个相机抽特征
bev_query = self.bev_query_embed # [H*W, C]:每格一个 query
for layer in self.encoder_layers:
# ① 时序:把上一帧 BEV 用 ego_motion warp 后做 self-attn
bev_query = layer.temporal_self_attn(
bev_query, warp(prev_bev, ego_motion)) # warp 用错位姿=拖影(陷阱4)
# ② 空间:BEV query 按投影几何 attend 多视角图像特征
bev_query = layer.spatial_cross_attn(
bev_query, img_feats, ref_points_cam) # ref_points_cam: 3D→各相机投影
return bev_query.reshape(H, W, C) # BEV 特征 B
💡 论文没告诉你的(BEV 编码):BEV 的网格分辨率(\(H\times W\))、感知范围(前后左右多少米)、时序融合用几帧——这些都在 config 里(PARTIAL),直接决定精度与算力的平衡。范围太小看不到远处快速接近的车,分辨率太粗定位不准。这也是 VAD 矢量化要绕开的"密集网格代价"(局限一)。
组件 ⑤(补全):OccFormer——未来占据预测¶
OccFormer 在数据流中处于预测与规划之间,为组件⑥的碰撞后优化提供"未来哪里被占"的依据。它与规划的耦合相对间接,做简化三栏式。
论文原文(转述)。 OccFormer 以 agent query 与 BEV 特征预测多步未来的实例级占据栅格,刻画场景中动态目标随时间的空间占用。(OccFormer 节)
用人话重新讲一遍。 普通占据预测只回答"未来某格子被占了吗"(二值);UniAD 的 OccFormer 做的是**实例级**占据——不仅知道格子被占,还知道**被哪个 agent** 占。它让 agent query(带着每个目标的身份与运动信息)与 BEV 特征交互,逐时间步地"画"出每个 agent 在未来 \(t\) 时刻会占据哪些格子。输出是一串未来占据栅格 \(O_1,\dots,O_T\),喂给 Planner 做碰撞后优化——"我的轨迹点 \((x_t,y_t)\) 在 \(t\) 时刻是否落进了某个被占格子"。
本质洞察:实例级占据是"预测"与"规划"之间的桥。它把 MotionFormer 的"agent 未来轨迹"翻译成 Planner 能直接用的"空间占用场"——前者是稀疏的点序列,后者是稠密的可碰撞检测的栅格。这一步转换正是组件⑥碰撞代价能算的前提。
代码实现走读(示意,行号需核实)。
# 来源:UniAD occ_head(源码结构,示意性走读)
class OccFormer(nn.Module):
def forward(self, agent_query, bev):
occ_seq = []
for t in range(self.T_future): # 逐未来时间步
# agent query 与 BEV 交互,解码出该时刻的实例占据
occ_t = self.decode_occupancy(agent_query, bev, t) # [H, W],含实例归属
occ_seq.append(occ_t)
return torch.stack(occ_seq) # [T, H, W] 未来占据序列
💡 论文没告诉你的(OccFormer):未来预测多少步
T_future、占据的概率阈值(多高算"被占")——影响碰撞优化的激进程度(PARTIAL,需从 config 核实)。且 OccFormer 与 Planner 是否端到端联合训练存疑(见上面差异表 CONFLICT? 项)——若分阶段训练,OccFormer 的误差会单向传给规划而无法被规划梯度纠正。
至此 UniAD 的六个组件(①BEV ②Track ③Map ④Motion ⑤Occ ⑥Plan)全部走读完毕——这是一条"BEV 地基 → query 贯通的感知预测 → 占据桥接 → 规划 + 碰撞投影"的完整链。
组件 ⑦(复现关键):两阶段训练策略——论文用一句话带过、但决定能否复现¶
这是论文正文只用一句话提及、却直接决定复现成败的一环。好在它已被官方明确,可作为"论文没充分展开但有据可查"的范例。
论文原文(转述)。 UniAD 分两阶段训练:先联合训练感知部分(跟踪与建图)若干 epoch,再端到端训练全部模块。论文称两阶段经验上更稳定,并把细节指向补充材料。(训练节)
用人话重新讲一遍 + 已核实细节。 为什么不一步到位端到端训练?三个现实原因(官方已说明):
- 显存:全模型六任务一起训练约需 50GB 显存,超出多数 GPU;分阶段降低峰值占用。
- 训练稳定性:感知基础(track/map)必须先立住,上层任务(motion/occ/plan)才学得动——地基不稳,楼盖不起来。
- 收敛速度:预训练好的感知模块给端到端阶段一个好的初始化,收敛更快。
具体配方(已核实):
| 阶段 | 训练什么 | epoch 数 | 产物 ckpt | 配置 |
|---|---|---|---|---|
| Stage 1 | 仅 track + map(感知) | ~6 | uniad_base_track_map.pth |
stage1_track_map/base_track_map.py |
| Stage 2 | 用 Stage 1 初始化,全部模块联合(track/map/motion/occ/planning) | ~20 | uniad_base_e2e.pth |
stage2_e2e/base_e2e.py |
💡 这恰好解决了一个歧义审计项:本章前面映射表曾把"occupancy 与 planner 是否端到端联合训练"标为 CONFLICT?「待源码确认」。现在可以**定性为 SPECIFIED**——在 Stage 2,occ 与 planning 与其余模块**一起端到端联合优化**(而非各自分阶段)。这意味着 OccFormer 的占据预测误差会通过联合训练被规划目标部分纠正,而不是单向污染规划。复现时务必走完两阶段、用 Stage 1 的
uniad_base_track_map.pth初始化 Stage 2,跳过会导致训练不稳、指标对不上。trick 教学:分阶段训练(按"动机→发现→原理→可迁移性") - 动机:复杂多任务系统一步端到端训练,显存爆、训练不稳、收敛慢。 - 发现:官方配置
stage1_track_map/stage2_e2e两套,论文正文仅一句带过,细节在补充材料与代码。 - 原理:先训练"信息源头"(感知)拿到稳定特征,再让高层任务在好的初始化上端到端微调——本质是**课程式训练(curriculum)的一种。 - **可迁移性:任何"感知→决策"的复杂级联学习系统(机械臂的感知+操作、无人机的感知+规划)都适用"先立感知地基、再端到端联调"的两阶段策略。
关键实验数据(建立量化直觉)¶
UniAD 在 nuScenes 上联合评估六个任务,相比各任务的专用方法与简单多任务基线均有提升。以下数字来自官方仓库报告(已核实):
| 指标 | UniAD 表现(已核实) | 说明 |
|---|---|---|
| 规划平均碰撞率(avg. collision) | 0.31% | 安全性核心指标,达到当时 SOTA |
| 运动预测 minADE | 0.71 m | 多智能体未来轨迹的最小平均位移误差 |
| 占据预测 IoU | 63.4% | 未来占据栅格的交并比 |
| 规划 L2 误差(1s/2s/3s 平均) | ~1 m 量级,优于此前端到端基线 | 预测轨迹与人类轨迹的偏差(精确分项见原论文) |
| 多任务 SOTA | 检测/跟踪/建图/预测/占据均达到或接近 SOTA | 证明联合不牺牲单任务 |
⚠️ 留意:这些是 **nuScenes 开环**指标。0.31% 的碰撞率亮眼,但开环碰撞率与真实闭环安全不能直接画等号——"批判性再审视"一节会说明 nuScenes 开环基准本身的局限。
消融实验是这篇论文的精华(研究视角会展开):逐个去掉上游任务(去掉 tracking、去掉 mapping、去掉 motion、去掉 occ),观察规划指标变化——结果是**每去掉一个,规划都变差**。这系统性地证明了 planning-oriented 的核心论点:"每个上游任务都对规划有正贡献"。
⚠️ 常见陷阱¶
陷阱 1(论文误导 / 概念误区):以为下游模块吃的是检测框
- 错误描述:读架构图时默认"TrackFormer 输出框 → MotionFormer 吃框",按经典 pipeline 的直觉理解。
- 现象/后果:复现或改造时把 query 接口改成框接口,信息被压扁,端到端的优势消失,性能掉一大截却找不到原因。
- 根本原因:UniAD 的灵魂恰恰是**不传框、传 query**;框只用于算 loss。论文架构图容易让人误读为经典串联。
- 正确做法:盯住代码里下游模块的输入张量——是 [N_agent, C] 的 query,不是 [N_agent, 7] 的框。改造时保持 query 接口。
陷阱 2(论文误导):把碰撞后优化当成可有可无的后处理
- 错误描述:认为"反正网络回归出轨迹了,碰撞优化是锦上添花",复现时跳过或随便设参数。
- 现象/后果:碰撞率显著上升,且轨迹在障碍附近抖动,与论文报告的安全性对不上。
- 根本原因:论文对这一步着墨极少,但它是安全指标达标的关键;N_ITER/LR/代价形式都 UNSPECIFIED,凭感觉设会失效。
- 正确做法:把它当一等公民复现,从代码提取超参数(见"论文没告诉你的"),并做敏感性实验。
陷阱 3(思维陷阱):把"端到端 SOTA"理解为"可以上车了" - 错误描述:看到 UniAD 开环指标 SOTA,认为端到端已经成熟。 - 现象/后果:忽视开环-闭环差距和安全验证缺失,对方案成熟度判断过于乐观。 - 根本原因:nuScenes 是**开环**评估(用真实历史回放,不与环境闭环交互),开环好不代表闭环稳;且神经网络规划器缺乏形式化安全保证。 - 正确做法:区分开环/闭环评估(PLUTO 一节会详述闭环为何更难),并把"安全验证"视为未解难题(章末范式总结)。
陷阱 4(编程陷阱):BEV 时序对齐用错自车位姿 - 错误描述:BEVFormer 做时序融合时,把历史 BEV 特征按错误的自车位姿变换对齐到当前帧。 - 现象/后果:运动的物体在 BEV 上"拖影"或错位,检测/预测精度下降。 - 根本原因:BEV 时序融合需要用 ego-motion 把历史特征 warp 到当前坐标系,位姿(平移+旋转)一旦弄错或漏了旋转,对齐就错。 - 正确做法:核对 ego2global / 帧间相对位姿的使用,单元测试用静止场景验证历史特征对齐后应与当前帧重合。
练习¶
-
(差异分析·必做) 对照
OpenDriveLab/UniAD仓库的planning_head,找出基于 occupancy 的碰撞后优化的真实实现:迭代步数、步长、碰撞代价的具体形式。与本章"论文没告诉你的"表对照,确认哪些是 UNSPECIFIED、哪些其实在论文附录里。(这道题的目的是亲手体验"论文一笔带过、代码才是真相"。) -
(复现验证·必做) 按 UniAD README 在 nuScenes mini 上跑通推理,可视化感知→预测→规划的端到端输出。对比 UniAD 规划轨迹与 ground truth 的 L2 误差,看看是否在 ~1 m 量级。记录你遇到的环境配置坑(mmdet3d 版本、CUDA 版本),它们大概率属于"复现陷阱"。
-
(设计思考·选做) UniAD 的 query 接口让信息不被压扁。但 query 是固定维度向量,一个复杂场景里 agent 数量可变。请设计:当场景中 agent 数量从 10 变成 100,query 接口如何 scale?计算/显存瓶颈在哪?(提示:attention 的 \(O(N^2)\) 与 query 数量的关系——这正是 VAD 矢量化要优化的。)
🔬 研究视角:UniAD 为什么是 Best Paper¶
跳出"它做了什么",从"它作为一篇研究为什么够分量"来看——这能教你如何评估一篇论文:
- 问题定义贡献(最高级别的贡献):UniAD 重新定义了"自驾系统该怎么组织"这个问题。它没有发明新的检测器或新的预测器,而是提出了一个**架构哲学**——planning-oriented。提出一个让整个领域重新思考的视角,比刷高某个指标价值高得多。这是它拿 Best Paper 的根本原因。
- 框架贡献:给出了一个**完整、可跑、可复现**的端到端系统,把抽象哲学落地为具体的 query 接口设计。哲学 + 可工作的系统,缺一不可。
- 实验方法论贡献:消融实验**系统性地、逐个地**验证了"每个上游任务对规划的贡献"。这不是堆砌实验,而是用实验直接论证核心论点——"任务都该服务于规划"被"去掉任意任务规划都变差"所支撑。好的消融不是证明方法好,而是证明每个设计选择都必要。
评估一篇论文时,问三个层次的问题:它定义了新问题吗(最高)?它给了完整框架吗(中)?它的实验论证了核心论点吗(基础)?UniAD 三层都强,这是它成为里程碑的原因。
局限(过渡到下一篇的动机)¶
UniAD 强大,但有三个明确局限,恰好驱动了后续两条主线:
局限一:query 数量与 attention 的 \(O(N^2)\) 开销。 栅格化/密集表示 + 大量 query 使计算和显存吃紧,难以高频实时。→ 这直接驱动了 VAD(G3)的矢量化——用矢量化的实例表示替代密集表示,大幅提速(VAD 在非核心论文群详述)。
局限二:模仿学习的单模态倾向。 UniAD 的 Planner 回归单条轨迹,在多模态交互场景(无保护左转)下会把多个合理决策"平均"。→ 这驱动了扩散范式(G4)——用去噪过程天然表示多模态,正是**下一篇核心论文 Diffusion Policy** 的核心卖点。
局限三:开环训练、缺乏闭环与安全保证。 nuScenes 开环评估好,但闭环行不行、安全可不可证,UniAD 没回答。→ 这驱动了 G5 的闭环 SOTA(PLUTO/Hydra-MDP)——把战场搬到 nuPlan 闭环,并首次证明模仿学习能在闭环超越规则派(核心论文 C)。
下一节我们顺着**局限二**的线索,进入扩散范式——看 Diffusion Policy 如何把"生成一条轨迹"重新表述为"从噪声里去噪出一条轨迹",以及这个看似绕弯的表述为什么恰恰解决了多模态问题。
科研启发¶
| 启发类型 | 想法 |
|---|---|
| 局限性→改进 | UniAD 碰撞后优化是固定迭代的可微投影——能否用一个学习的"安全头"替代手工碰撞代价,端到端学出投影方向? |
| 假设挑战 | UniAD 默认 OccFormer 的占据预测可靠。若占据预测本身有误差,碰撞优化会被误导——能否让 planner 对 occupancy 的不确定性敏感(概率占据)? |
| 跨论文组合 | UniAD 的 query 接口 + 扩散的多模态解码:把 Planner 换成扩散头,让 ego query 作为条件去噪出多条轨迹,是否兼得"信息保真"与"多模态"?(这几乎就是后续工作的方向) |
| 空白地带 | UniAD 在 nuScenes 开环。把整套 planning-oriented 架构搬到 nuPlan 闭环评估,query 接口的优势是否还在? |
核心论文 B:Diffusion Policy —— Visuomotor Policy Learning via Action Diffusion ⭐⭐⭐¶
顺着 UniAD 的**局限二**进来:UniAD 的 Planner 回归单条轨迹,遇到"抢行 or 让行"这类多模态决策会把两个合理选项平均成一个危险的中间值。怎么办?Diffusion Policy 给的答案很反直觉——不要去预测一条轨迹,而是去学一个能采样出多条轨迹的生成模型。
论文信息:Cheng Chi, Siyuan Feng, Yilun Du, Zhenjia Xu, Eric Cousineau, Benjamin Burchfiel, Shuran Song,Diffusion Policy: Visuomotor Policy Learning via Action Diffusion,RSS 2023(扩展版 IJRR 2024),arXiv:2303.04137。代码:
real-stanford/diffusion_policy(MIT,PyTorch)。一个必要的提醒:Diffusion Policy 诞生于**机械臂操作(manipulation),动作是末端/关节指令而非车辆轨迹。但本专题把它列为核心,是因为它确立的 **"动作序列 = 去噪对象" 范式被自驾的 Diffusion Planner 直接继承——把"动作序列"换成"时空轨迹 \((x_t,y_t)\)",整套机制原样成立。读这一篇,重点抓**可迁移的范式**,而非具体的机械臂任务。
一句话总结 + 核心贡献¶
一句话:把"从观测到动作序列"的策略,建模为一个**以观测为条件的去噪扩散过程**——推理时从纯高斯噪声出发,在观测条件下反复调用去噪网络,逐步"雕刻"出一段动作序列。因为扩散模型能隐式表示任意复杂的分布,它**天然多模态**,且训练只是回归噪声、非常稳定。
核心贡献:
- 把 DDPM 引入机器人策略学习,提出 action diffusion 范式,正面解决了**多模态动作分布**的表达难题。
- 系统性验证:跨 15 个任务、4 套 benchmark 大幅超越此前的显式策略表示(MSE 回归 / 离散分类 / 混合高斯)。
- 给出落地的工程配方:两种去噪网络架构(CNN 1D-UNet / Transformer)、receding-horizon 执行、位置控制优于速度控制等关键设计——这些是"从能跑到好用"的关键。
动机:为什么"回归一条轨迹"是错的表示¶
UniAD 的 Planner 用 MSE 回归轨迹。MSE 回归隐含一个致命假设——目标分布是单峰高斯。但人类驾驶/操作的决策天然多峰。把多峰分布用单峰去拟合,结果是落在两峰之间的"平均值",而平均值往往是最差的选择(抢行和让行的平均 = 既没抢成也没让够,正好撞上)。
那换个表示行不行?逐个看此前的尝试,理解扩散为什么胜出:
| 动作表示 | 怎么做 | 致命问题 |
|---|---|---|
| MSE 回归 | 直接输出动作向量 | 多模态被平均(UniAD 的问题) |
| 离散分类 | 把动作空间离散成 bins 分类 | 高维动作 → bin 数指数爆炸(维度灾难) |
| 混合高斯 / MDN | 输出 K 个高斯的混合 | 模式数 K 要预设;训练易 mode collapse |
| 扩散(本文) | 学去噪过程,采样即生成 | 推理慢(多步去噪)——但表达力换来的 |
反事实推理:如果 Diffusion Policy 把去噪网络换成一个直接回归动作的 MLP,它就退化回 MSE 回归,多模态问题原样复发。所以扩散**不是**"换了个更大的网络",而是**换了一种概率建模方式**——从"预测分布的一个点估计"变成"学习从噪声到数据分布的随机映射"。理解这一点,才不会把扩散当成"又一个网络结构"。
本质洞察:扩散模型做的事,是把"直接建模复杂分布 \(p(\tau|O)\)"这个难题,拆解成一串简单的高斯去噪步。每一步只需回答"当前这个稍微带噪的轨迹,噪声大概长什么样"——这是个简单的回归。难的全局多模态分布,被一串简单的局部高斯步**逐步逼近**。这与 T3 的迭代优化(CILQR 把难的非凸问题拆成一串凸子问题)在哲学上同构:把一个难问题分解成一串简单步骤的迭代。
核心方法(按组件展开)¶
组件 ①(核心):扩散模型基础——前向加噪与反向去噪¶
论文原文(转述)。 论文将动作生成建模为去噪扩散概率模型(DDPM):定义一个前向过程逐步向动作序列添加高斯噪声,并训练一个网络学习其反向(去噪)过程;以视觉观测作为去噪网络的条件输入。(方法节)
用人话重新讲一遍。
先建立直觉,再上公式。想象你有一段专家演示的干净动作序列 \(\tau^0\)(比如机械臂未来 16 步的位置)。
前向过程(加噪,训练时用,无需学习):往 \(\tau^0\) 里一点点掺高斯噪声,掺 \(K\) 次(典型 \(K=100\)),每次噪声更大一点,最后 \(\tau^K\) 变成几乎纯噪声。这个过程有闭式——任意一步 \(k\) 的带噪动作可以一步算出来,不用真的迭代 \(k\) 次:
其中 \(\bar\alpha_k = \prod_{i=1}^{k}\alpha_i\),\(\alpha_i = 1-\beta_i\),\(\{\beta_i\}\) 是预设的噪声 schedule(从小到大)。\(k\) 小时 \(\bar\alpha_k\approx 1\)(基本是干净动作),\(k\) 大时 \(\bar\alpha_k\approx 0\)(基本是纯噪声)。
⚠️ 记号警告(这是初学者最大的混淆点,见陷阱 2):上标 \(k\) 是**去噪步**(denoising iteration,\(0\sim K\)),它和动作序列 \(\tau\) 内部的时间索引 \(t\)(第几步动作)是**两个完全不同的维度**。\(\tau^k\) 是"去噪到第 \(k\) 步的整段动作序列",这段序列里还有 \(t=1\dots T_p\) 个时间步。后面所有公式里,上标 = 去噪步,下标 = 动作时间步。
反向过程(去噪,这才是要学的):训练一个网络 \(\epsilon_\theta(\tau^k, k, O)\),输入带噪动作 \(\tau^k\)、噪声级别 \(k\)、观测条件 \(O\),预测当初掺进去的那团噪声 \(\epsilon\)。训练目标就是一个 MSE:
推理(采样,生成动作):从纯噪声 \(\tau^K\sim\mathcal N(0,I)\) 开始,用学好的 \(\epsilon_\theta\) 一步步去噪(DDPM 更新式):
迭代 \(K\) 次得到干净动作 \(\tau^0\)。多模态从哪来?每次推理的起点 \(\tau^K\) 是随机噪声——不同的随机起点,去噪后落到分布的不同峰上。采样 10 次,可能得到"抢行"和"让行"两类轨迹各几条。这就是扩散天然多模态的机制。
代码实现走读(示意,行号需核实)。
# 来源:real-stanford/diffusion_policy(源码结构,示意性走读)
# 训练:加噪 → 预测噪声 → MSE(极简,这是扩散稳定的根源)
def train_step(self, batch):
obs, action = batch['obs'], batch['action'] # action: [B, T_p, A_dim]
cond = self.obs_encoder(obs) # 观测编码为条件
noise = torch.randn_like(action) # 采样噪声 ε
k = torch.randint(0, self.K, (action.shape[0],)) # 随机去噪步 k
# 一步加噪(前向闭式),noisy_action = √ᾱ_k·a + √(1-ᾱ_k)·ε
noisy_action = self.noise_scheduler.add_noise(action, noise, k)
pred_noise = self.net(noisy_action, k, cond) # ε_θ 预测噪声
return F.mse_loss(pred_noise, noise) # 训练目标就是这一行
# 推理:从噪声迭代去噪
@torch.no_grad()
def predict_action(self, obs):
cond = self.obs_encoder(obs)
traj = torch.randn(self.B, self.T_p, self.A_dim) # τ^K:纯噪声起点(多模态之源)
for k in self.noise_scheduler.timesteps: # K 步去噪(DDPM)或少步(DDIM)
pred_noise = self.net(traj, k, cond)
traj = self.noise_scheduler.step(pred_noise, k, traj) # DDPM 更新式
return traj # τ^0:干净动作序列
组件 ②:观测条件化——FiLM vs cross-attention¶
论文原文(转述)。 观测通过条件机制注入去噪网络;CNN 版采用 FiLM 调制,Transformer 版采用交叉注意力。(方法/架构节)
用人话重新讲一遍。 去噪网络要"看着观测去噪",观测怎么进网络有两种主流接法:
- CNN(1D temporal U-Net)+ FiLM:把观测编码成一组 \((\gamma, \beta)\),对 U-Net 每层特征做仿射调制 \(\text{FiLM}(h)=\gamma\odot h+\beta\)。观测像一个"旋钮",逐层调制去噪过程。
- Transformer + cross-attention:把观测当成 memory,去噪的动作 token 通过 cross-attention 去 attend 观测。更灵活,但小数据上可能不如 CNN 稳。
论文的经验结论是:CNN 版更稳、调参更省心,作为默认;Transformer 版在高维动作/长 horizon 上潜力更大。
组件 ②补充:为什么"预测噪声"等价于"学 score 函数"(一个必须打通的桥)¶
读到这里你可能有个疑问:核心论文 B 训练网络**预测噪声 \(\epsilon\),但非核心群里 Diffusion Planner 说它"学习轨迹 **score 函数的梯度 \(\nabla_\tau \log p(\tau)\)"。这两个说法是一回事吗?打通这座桥,你才能把本章的扩散方法和"score-based 生成模型""概率流 ODE""classifier guidance"全部串起来——否则它们看起来像三套不同理论。
结论先行:预测噪声、预测 score、预测干净样本 \(\tau^0\),是**同一个对象的三种等价参数化**,彼此可线性换算。
怎么换算(直觉版)。回忆前向加噪闭式 \(\tau^k = \sqrt{\bar\alpha_k}\,\tau^0 + \sqrt{1-\bar\alpha_k}\,\epsilon\)。对带噪分布 \(p(\tau^k)\),可以证明它的 score(对数概率的梯度)与噪声之间有一个干净的关系:
直觉上:score 指向"概率更高的方向",也就是"更干净、噪声更少的方向";而噪声 \(\epsilon\) 正是"当前样本偏离干净样本的方向"。两者**方向相反、差一个缩放系数**——所以"预测 \(\epsilon\)"和"预测 score"携带的是同一信息。网络学会了预测噪声 \(\epsilon_\theta\),就等于学会了 score(去噪方向),只差一个已知的系数 \(-1/\sqrt{1-\bar\alpha_k}\)。
这座桥通向哪三个地方:
- score-based 生成模型(Song & Ermon)与 DDPM 的统一:两套理论曾被认为不同,其实是同一框架的两种视角。Diffusion Planner 选择 score 视角表述,本质和 Diffusion Policy 的 \(\epsilon\) 视角等价。
- 概率流 ODE(深入一的加速基础):知道了 score,反向去噪可以写成一个确定性 ODE(probability flow ODE),用高阶数值解法少步求解——DDIM、DPM-Solver 的理论根基就在这里。
- classifier guidance(Diffusion Planner 的 flexible guidance):要让生成偏向"满足某约束/某风格",只需在 score 上**加一项约束的梯度** \(\nabla_\tau \log p(\text{约束}\mid\tau)\)。这就是 Diffusion Planner"把安全/风格偏好注入生成"的数学机制,也是全章"生成-投影"模板在扩散里最优雅的体现——投影不是事后做,而是**融进每一步去噪的 score 里**。
本质洞察:一旦你看出"噪声 = 负的 score × 系数",本章三篇扩散相关工作(Diffusion Policy / Diffuser / Diffusion Planner)就从"三个孤立方法"变成"同一 score-based 框架下的三个实例"。这正是论文解读要达到的境界——不是记住每篇怎么做,而是看穿它们共享的同一套数学骨架。
组件 ③:receding-horizon 执行——这里才有"时间"¶
这是把"生成一段动作"变成"持续控制"的关键,也是与本专题"时空"最相关的一环。三个 horizon:
| 符号 | 名字 | 含义 |
|---|---|---|
| \(T_o\) | observation horizon | 用过去 \(T_o\) 步观测作为条件 |
| \(T_p\) | prediction horizon | 一次预测未来 \(T_p\) 步动作 |
| \(T_a\) | action execution horizon | 实际只执行前 \(T_a\) 步,然后重新观测预测 |
典型 \(T_a < T_p\)(预测 16 步只执行 8 步),这与 T3/T4 的 **MPC 滚动时域**思想完全一致——预测一段、执行一截、滚动重规划。\(T_a\) 太大反应慢(环境变了还在执行旧动作),太小则丢失扩散生成的时序一致性。
action chunk 与跟踪误差的权衡(已核实):论文把 receding-horizon 列为核心技术贡献之一。一个被后续工作反复确认的现象是——\(T_a\)(action chunk)越大,去噪查询越少、推理越省,但轨迹跟踪误差越大(连续两次生成之间环境已变,旧轨迹越执行越偏)。所以 \(T_a\) 不是越大越省越好,而是"省算力"和"跟得准"之间的折中。这与 UniAD 碰撞优化的
N_ITER、PLUTO 的扰动幅度一样,是个**没有万能默认值、必须按任务调**的关键超参。
组件 ④:两种去噪架构(CNN U-Net vs Transformer)怎么选¶
组件②提了 FiLM 和 cross-attention 两种条件注入,背后其实是**两套去噪骨架**,论文都给了、各有适用面,复现时第一个要做的选择就是它。
用人话讲。
- CNN 版(1D temporal U-Net):把动作序列当成一维时间信号,用 1D 卷积的 U-Net 去噪,观测用 FiLM 逐层调制。优点:训练稳、对超参不敏感、小数据友好——论文把它作为**默认推荐**。适合:动作维度不太高、demo 数据有限的多数操作任务。
- Transformer 版:动作 token 通过 cross-attention 去 attend 观测。优点:建模长程依赖、高维动作更有潜力。代价:对超参(学习率、warmup)更敏感,小数据上可能不如 CNN 稳。适合:高维动作、长 horizon、数据充足的场景。
代码实现走读(示意,行号需核实)。
# 来源:real-stanford/diffusion_policy(源码结构,示意性走读)
# 两套去噪骨架共享同一训练/采样循环,只换 self.net
# (A) CNN 版:1D U-Net + FiLM 注入观测
class ConditionalUnet1D(nn.Module): # diffusion_policy/model/diffusion/conditional_unet1d.py
def forward(self, noisy_action, k, cond):
t_emb = self.time_mlp(k) # 去噪步 k 的嵌入
c = torch.cat([t_emb, cond], dim=-1) # 观测条件并入
h = noisy_action
for block in self.down_blocks:
h = block(h, c) # FiLM: 用 c 生成 (γ,β) 调制每层
# ... 中间 + 上采样,略
return self.final(h) # 预测噪声 ε
# (B) Transformer 版:动作 token cross-attend 观测 memory
class TransformerForDiffusion(nn.Module):
def forward(self, noisy_action, k, cond):
x = self.input_emb(noisy_action) + self.time_emb(k)
return self.decoder(tgt=x, memory=cond) # cross-attention 注入观测
选型建议:第一次复现**直接用 CNN 版**(论文默认、最稳);只有当你的动作维度很高或 horizon 很长、且数据量足够时,再尝试 Transformer 版。这条"先稳后强"的建议,和本章复现指南"先 PushT 后 nuPlan"的路径是同一种工程理性。
💡 论文没告诉你的(扩散策略的工程命脉)¶
| 隐藏细节 | 论文 | 来源 | 教学价值 |
|---|---|---|---|
| EMA 权重 | 提及但易忽视 | 代码默认开启 | 去噪网络用指数移动平均权重做推理,对稳定**至关重要**,关掉性能大跌 |
| 噪声 schedule 选择 | 附录 | 代码 noise_scheduler |
squared-cosine schedule 比线性好;训练/推理 schedule 必须一致 |
| 推理步数 | 默认 100 | 代码/config | DDPM 100 步太慢;换 DDIM 可降到 ~10 步而质量损失小——这正是大纲思考题"从 100 降到 10"的来源 |
| 位置控制 vs 速度控制 | 有消融 | 论文+代码 | 输出**位置**比输出**速度**更稳(速度误差会积分漂移) |
trick 教学:为什么 EMA 对扩散这么关键(按"动机→发现→原理→可迁移性"展开) - 动机:扩散训练的 loss 在不同噪声级别 \(k\) 间方差大,单步权重抖动剧烈,直接拿最新权重推理结果不稳。 - 发现:代码里
EMAModel默认开启(decay≈0.9999),论文正文几乎没强调。 - 原理:EMA 对训练轨迹上的权重做指数平滑,等价于一种隐式的模型集成,抹平了高方差训练带来的权重震荡。 - 可迁移性:EMA 是**所有扩散/生成模型训练的通用稳定器**,也广泛用于自监督学习(如 BYOL 的 target network)。记住它,迁移到任何扩散式规划器都用得上。
关键实验数据(建立量化直觉)¶
Diffusion Policy 的说服力来自**广度 + 受控消融**,下面的数字均已核实:
| 维度 | 结果(已核实) |
|---|---|
| 任务覆盖 | 跨 15 个任务、4 套 benchmark(仿真 + 真机),平均成功率显著高于 LSTM-GMM / IBC / BET 等 |
| 长程多模态 | Block Push 的 p2 指标提升 32%、Kitchen 的 p4 指标提升 213%——多子目标任意顺序完成的场景优势最大 |
| action horizon | 消融确认 \(T_a=8\) 步为多数任务最优:太小反应快但时序不一致,太大一致但反应慢(Fig 6 left) |
| 位置 vs 速度控制 | 位置控制**显著优于**速度控制;耐人寻味的是基线方法反而偏好速度控制(Fig 5) |
| 延迟鲁棒性 | 位置控制可容忍**多达 4 步延迟**仍保持峰值性能;速度控制受延迟影响大得多(复合误差) |
| 推理速度 | DDIM 训练 100 步 / 推理 10 步,在 Nvidia 3080 上做到 0.1s 延迟——这是它能上真机闭环的关键 |
| 训练稳定性 | 最优超参跨任务**基本一致**;对比之下 IBC(隐式 BC)训练易不稳 |
两个值得记住的发现(论文的精华,常被忽略):
-
对空闲动作(idle actions)的鲁棒性。遥操作演示里常有"暂停"——机械臂停在原地,产生一串几乎相同的位置/接近零速度的动作。单步策略(如 BC-RNN、IBC)容易**过拟合这种暂停**,真机上一旦遇到就"卡住"不动。而 Diffusion Policy 预测的是**一段动作序列**,天然跨过了这些空闲段,不会卡死。这是"预测序列而非单步"的一个意外红利——它不只解决多模态,还顺带治了"卡顿"。
-
位置控制为什么赢。直觉上速度控制更"平滑",但 Diffusion Policy 发现位置控制(预测目标位置)对延迟鲁棒得多:位置目标即使晚到几毫秒,机械臂仍能到大致正确的位姿;而速度命令一旦延迟,就会**过冲**(积分放大误差)。这呼应了本章反复出现的主题——速度/增量类输出会累积误差,位置/绝对类输出更稳,这个经验对自驾轨迹生成同样有借鉴意义(科研启发表里已列为待验证问题)。
⚠️ 常见陷阱¶
陷阱 1(论文误导 / 概念误区):搞错去噪网络的预测目标(预测噪声 vs 预测样本)
- 错误描述:以为网络直接预测干净动作 \(\tau^0\),而代码/默认实现预测的是噪声 \(\epsilon\)。
- 现象/后果:loss 看似能降,但采样出的动作发散或退化,调试极难。
- 根本原因:DDPM 有多种等价参数化(预测 \(\epsilon\) / 预测 \(\tau^0\) / 预测 score),更新式各不相同;混用训练目标与采样更新式必然出错。
- 正确做法:确认 noise_scheduler 的 prediction_type(epsilon 还是 sample),并用配套的更新式。改参数化时整套同步改。
陷阱 2(概念误区):把去噪步 \(k\) 和动作时间步 \(t\) 混为一谈 - 错误描述:看到 \(\tau^k\) 以为是"第 \(k\) 个动作"。 - 现象/后果:张量维度对不上(去噪步是标量条件,动作时间步是序列长度),代码里把 \(k\) 喂到了时间维。 - 根本原因:扩散有两个"步"——去噪迭代步(上标 \(k\))和动作序列时间步(下标 \(t\)),初学极易混淆。 - 正确做法:牢记上标=去噪步(标量、做条件),下标=动作时间步(序列维度)。本节"记号警告"框就是为此。
陷阱 3(编程陷阱):推理用了非 EMA 权重,或训练/推理 schedule 不一致 - 错误描述:推理时加载训练权重而非 EMA 权重;或推理换了噪声 schedule。 - 现象/后果:性能比论文报告差一大截,且"看起来代码没错"。 - 根本原因:EMA 权重和 schedule 是扩散正确推理的隐含前提(见"论文没告诉你的")。 - 正确做法:推理强制用 EMA 权重;训练/推理 schedule 严格一致;DDIM 加速时正确设置子序列。
陷阱 4(思维陷阱):以为扩散总比回归好 - 错误描述:不分场景一律上扩散。 - 现象/后果:在单模态、低维、对延迟敏感的任务上,扩散的多步推理拖慢了系统,效果却不比 MSE 回归好。 - 根本原因:扩散的优势是**多模态表达**,代价是**推理慢**;单峰任务上这笔交易不划算。 - 正确做法:先判断任务是否真有多模态结构;单模态/强实时场景,回归或单步生成可能更优。
陷阱 5(编程陷阱 / 论文误导):忽视演示数据里的"空闲动作" - 错误描述:直接拿遥操作演示训练,不处理其中的暂停段(机械臂停在原地、一串几乎相同的位置或近零速度动作)。 - 现象/后果:若用单步策略会过拟合暂停、真机"卡住";即便用 Diffusion Policy,混入大量空闲段也会稀释有效监督、拖慢收敛。 - 根本原因:遥操作中暂停很常见(甚至像倒液体这类任务必需),论文专门讨论了它,但初学复现时容易忽略——单步策略对此尤其脆弱。 - 正确做法:Diffusion Policy 预测**动作序列**本身就大幅缓解了卡顿(序列会跨过空闲段);但仍建议检查数据里空闲段的比例,必要时做清洗或下采样。这也是"为什么预测序列比预测单步更鲁棒"的一个实证理由。
练习¶
- (复现验证·必做) 用
diffusion_policy的 PushT 示例训练 2D 推块任务,可视化 100 步去噪过程——观察轨迹如何从噪声逐步收敛。再把推理从 DDPM 100 步换成 DDIM 10 步,对比轨迹质量与推理耗时(回应大纲思考题)。 - (差异分析·必做) 在代码里把
prediction_type从epsilon改成sample,对应修改采样更新式,验证两者等价。记录你踩到的坑——这道题让你亲历陷阱 1。 - (设计扩展·选做) 把"动作序列扩散"改造成"时空轨迹扩散":动作换成 \((x_t,y_t)\),观测换成 BEV/agent 历史。这正是 Diffusion Planner 的思路。你需要改动哪些部分?动力学可行性怎么保证?(提示:去噪后做投影——这又回到了 UniAD 的"生成-投影"模板。)
- (架构对比·选做) 在同一个 PushT 任务上分别用 CNN U-Net 版和 Transformer 版训练,对比训练稳定性、对学习率的敏感度、最终成功率。验证论文"CNN 版更稳、作为默认"的说法在你的设置下是否成立。把 action chunk \(T_a\) 从小到大扫一遍,画出"\(T_a\)-成功率"曲线,观察跟踪误差权衡。
🔬 研究视角:Diffusion Policy 的贡献结构¶
- 问题定义贡献:把"策略学习"重新表述为"条件生成建模",并指出**动作多模态**是此前显式策略表示的共同短板。提出新视角看老问题。
- 框架贡献:给出完整、两种架构、仿真+真机验证、可复现的配方——不是只在一个任务上 demo,而是给出可直接套用的工程模板。
- 实验方法论贡献:跨 15 任务 4 benchmark 的系统验证 + 对架构/horizon/控制模式的消融,说服力来自**广度 + 受控对比**,而非单点 SOTA。
局限(过渡到下一篇的动机)¶
局限一:推理慢。 多步去噪导致推理频率受限,对高频控制不友好。→ 驱动了 DDIM/consistency models 等加速,也驱动 Diffusion Planner(非核心群)在自驾场景做联合去噪与少步推理。
局限二:不保证硬约束。 生成的轨迹可能违反动力学/碰撞约束。→ 驱动"扩散 + 投影"范式,正是 Autoware 2025+ 的 diffusion_planner + safety_filter(本章 §安全过滤会在非核心群带到)。
局限三:开环模仿、闭环未验。 Diffusion Policy 的评估虽含真机,但自驾闭环的"误差累积 + 分布偏移"问题它没有正面回答。→ 这正好把我们带到**核心论文 C:PLUTO**——它把战场搬到 nuPlan 闭环,并第一次证明模仿学习能在闭环超越规则派。
科研启发¶
| 启发类型 | 想法 |
|---|---|
| 局限性→改进 | 多步推理慢——能否用 consistency model 把规划做成单步生成,同时保留多模态? |
| 跨论文组合 | UniAD 的 query 条件 + Diffusion 的多模态解码 = 用 ego/agent query 做条件、扩散出多条时空轨迹(Diffusion Planner 雏形) |
| 假设挑战 | 扩散默认目标分布固定。驾驶风格随场景/乘员变化——能否让条件包含"风格变量",一个模型生成不同风格轨迹? |
| 代码中的发现 | 位置控制比速度控制稳——这个现象在自驾轨迹生成里是否同样成立?值得系统验证 |
桥接:扩散从机械臂搬到自驾,要改什么?¶
本章把一篇**机械臂**论文(Diffusion Policy)和一篇**自驾**论文(Diffusion Planner)都归入扩散派,读者最常问的是:同一套去噪范式,跨这么远的两个领域,到底哪些不变、哪些必须改?这张对照表把差异讲清,也是理解"为什么 Diffusion Planner 不是简单照搬"的关键。
| 维度 | 机械臂(Diffusion Policy) | 自驾(Diffusion Planner) | 为什么不同 |
|---|---|---|---|
| 去噪对象 | 末端/关节动作序列 | 自车 + 他车的时空轨迹 \((x_t,y_t)\) | 自驾必须建模与他车的交互(隐式博弈),机械臂多为单体 |
| 条件输入 | 视觉观测(图像/点云) | BEV + agent 历史 + 地图 + 导航 | 自驾场景结构化程度高,条件更丰富 |
| 多体交互 | 通常无(或少量物体) | 核心——联合去噪逼近博弈均衡 | 道路是多智能体博弈场 |
| 实时性要求 | 操作频率相对可容忍多步 | 须 ~10–20Hz,倒逼少步采样 | 车速高,反应窗口短 |
| action horizon 权衡 | chunk 越大跟踪误差越大(已核实) | 同样存在,且闭环误差累积更致命 | 自驾闭环偏离的后果远严重于机械臂 |
| 安全后果 | 抓取失败可重试 | 碰撞不可逆,必须安全兜底 | 安全等级根本不同 |
本质洞察:扩散范式的**数学内核(去噪、score、guidance)跨领域完全不变**——这正是为什么一篇机械臂论文能成为自驾方法的范式源头。变的只是**三件事**:去噪对象的语义(动作→多体轨迹)、交互建模的有无(单体→博弈)、实时与安全的标准(可重试→不可逆)。看清"内核不变、外壳适配",你就能把扩散范式迁移到任何新领域——无人机集群、多臂协作、交通流控制,只需回答这三个适配问题。这也呼应了本章"跨方向迁移"表的方法论:迁移一个范式,先分离它的不变内核与领域外壳。
核心论文 C:PLUTO —— 把模仿学习规划推到闭环超越规则派 ⭐⭐⭐¶
顺着 UniAD 的**局限三**和 Diffusion Policy 的**局限三**进来:两者都在"开环"上证明了自己,但自动驾驶真正的考场是**闭环**——车真的按你的输出去开,下一帧的处境由你这一帧的决策决定。在 PLUTO 之前,领域的共识是"学习派开环好看、闭环不如规则派"。PLUTO 第一次正面推翻了它。
论文信息:Jie Cheng, Yingbing Chen, Qifeng Chen,PLUTO: Pushing the Limit of Imitation Learning-based Planning for Autonomous Driving,arXiv:2404.14327(2024),HKUST。代码:
jchengai/pluto(PyTorch,对接 nuPlan;conda python=3.9 + nuplan-devkit)。
一句话总结 + 核心贡献¶
一句话:通过**纵横解耦感知的轨迹表示(longitudinal-lateral aware)、**对比模仿学习(CIL) 和**强数据增强**三件套,把纯模仿学习的规划性能,首次推到在 nuPlan 闭环 benchmark 上超越精心设计的规则派规划器。
核心贡献:
- 打破领域共识:首次用纯模仿学习(非 RL、非规则)在 nuPlan 闭环超越规则派——这是里程碑式的结论性贡献。
- 对比模仿学习(CIL):标准模仿只告诉模型"专家怎么开",PLUTO 额外构造负样本教模型"什么是坏轨迹",正面缓解模仿学习的分布偏移病。
- 系统的数据增强 + 纵横感知 query:把"让模仿学习闭环稳"的工程要素整合成一套可复现配方。
动机:闭环为什么比开环难得多¶
这是本节最重要的概念,必须讲透——它是理解一切"学习式规划"成熟度的标尺。
开环评估(open-loop):拿一段真实驾驶日志,每个时刻把**真实的历史**喂给模型,让它预测下一段轨迹,与**真实的未来**比 L2 误差。关键特征:模型的输出不影响下一步的输入——下一步仍喂真实历史。误差不累积。UniAD 在 nuScenes 就是这么评的。
闭环评估(closed-loop):模型输出轨迹后,仿真器**真的让车按这条轨迹走**,车到了新位置,再把**这个由模型自己造成的新处境**喂回模型。关键特征:输出反馈成输入,误差会累积、会自我放大。
两者的鸿沟来自模仿学习的两大固有病:
- 分布偏移(covariate shift):模型只在专家轨迹附近训练过。闭环中一旦有微小偏差,车进入专家从未到过的状态,模型没见过、不知所措,偏差进一步放大——雪球效应。这正是 DAgger 等方法试图解决的经典难题。
- 因果混淆(causal confusion):模型可能学到伪相关("前车刹车灯亮→我刹车")而非真因果。开环下伪相关常常"碰巧对",闭环下一旦情境变化就失效。
一个反直觉的实证(来自 PLUTO 前作 PlanTF,CIL 的动机源头):PlanTF 系统研究后发现一个违反直觉的现象——给模型喂自车的历史运动轨迹,反而让闭环性能显著下降;只用自车**当前位姿(位置 + 航向)** 表现最好;更甚者,连速度、加速度、转向角这些"显然对规划有用"的运动学量,喂进去都会让闭环变差。原因正是 shortcut learning:模型发现"延续我自己过去的运动"是个省力的捷径(开环下这个捷径碰巧对,因为人类驾驶有惯性),于是**学会了外推自己的历史而非真正理解场景**——这就是因果混淆的具体形态。PlanTF 的解法是一个 attention-based state dropout encoder(随机丢弃部分自车状态特征,逼模型不依赖捷径)。这个发现直接启发了 PLUTO 的对比学习——既然模型会偷懒学捷径,那就**主动造出"看起来像捷径但其实是坏轨迹"的负样本**,逼它学会判别好坏而非外推历史。
反事实推理:如果 PLUTO 只做标准行为克隆(BC),不加对比学习和数据增强,会怎样?答案就是 2021–2022 年 nuPlan 上的普遍结果——开环 L2 漂亮,闭环一放开就漂移、压线、急刹,输给简单的规则派(如 PDM/IDM)。PLUTO 的三件套,每一件都精确地打在"缩小开环-闭环鸿沟"上。
本质洞察:模仿学习闭环差,根因是**训练分布(专家轨迹)与测试分布(模型自己造成的状态)不一致**。缩小这个鸿沟有三条路:①让模型见过更多偏离状态(数据增强);②让模型知道什么是坏(对比学习);③让表示对扰动鲁棒(纵横解耦)。PLUTO 三管齐下——它的成功不是某个网络创新,而是**对"模仿学习为什么闭环差"这个问题的系统性回应**。
核心方法(按组件展开)¶
PLUTO 延续了 query-based 规划器(其前作 PlanTF)的骨架,把 agent/map/ego 编码成 token,用 Transformer 交互后解码自车轨迹。三个关键创新如下,重点展开**对比模仿学习**——它最有教学价值。
组件 ①:longitudinal-lateral aware 轨迹表示¶
论文原文(转述)。 模型对自车轨迹的纵向(沿道)与横向(偏移)分量分别建模/感知,以更好地刻画驾驶行为。(方法节)
用人话重新讲一遍。 回忆 T1 的 Frenet 直觉——驾驶行为天然分纵向(快慢、跟车、刹停)和横向(变道、居中、绕行)两条相对独立的轴。PLUTO 在 query/解码设计上显式区分这两个分量(而非在笛卡尔 \((x,y)\) 里混着学),让模型分别"管快慢"和"管左右"。这与 T1 的 Frenet \((s,l)\) 分解一脉相承——经典栈用 Frenet 解耦坐标,PLUTO 用网络结构解耦语义,殊途同归。
为什么解耦有用(深一层)。 把纵横揉在 \((x,y)\) 里学,网络要同时操心"往哪走"和"走多快",两个语义纠缠在同一组输出里——一个变道动作和一个加速动作在 \((x,y)\) 空间会相互干扰梯度。解耦后:横向头专注"选哪条参考线/车道、横向偏移多少",纵向头专注"在选定路径上的速度剖面"。这让多模态**结构化**——横向的"变道 vs 保持"和纵向的"加速 vs 减速"可以独立组合,天然覆盖"变道且加速""保持且减速"等多种驾驶意图,而不必像单一回归头那样把它们平均掉。
代码实现走读(示意,行号需核实)。
# 来源:jchengai/pluto,models(源码结构,示意性走读)
# 核心:横向(参考线/车道选择 + 偏移) 与 纵向(速度剖面) 分别解码
class PlutoDecoder(nn.Module): # 示意
def forward(self, ego_query, scene_tokens, reference_lines):
# 横向分支:在若干候选参考线上选择 + 预测横向偏移 → 多模态来源之一
lat_logits = self.lateral_head(ego_query, reference_lines) # [K_ref] 选哪条线
lat_offset = self.offset_head(ego_query, reference_lines) # 沿线横向偏移
# 纵向分支:在选定几何上预测速度/纵向位置剖面
lon_profile = self.longitudinal_head(ego_query, scene_tokens) # 速度剖面 v(t)
# 合成:横向(路径) × 纵向(速度) → 完整时空轨迹 (x_t, y_t)
traj = self.compose(lat_logits, lat_offset, lon_profile, reference_lines)
return traj, lat_logits # lat_logits 用于多模态/对比
⚠️ 论文-代码差异。 论文把"纵横感知"讲成一个**表示原则**,但代码里它落地为**两个独立解码头 + 参考线机制**——这个"参考线"(reference lines,来自地图中心线的候选路径)论文正文着墨不多,却是横向多模态的实际载体。复现时若忽略参考线、直接回归 \((x,y)\),"纵横感知"就名存实亡(这也是为什么 Diffusion Planner 论文里把"使用预搜索参考线"单独标注——它降低了规划难度,是个不可忽视的先验输入)。
组件 ②(核心):对比模仿学习(CIL)¶
论文原文(转述)。 引入对比学习目标:构造正样本(专家或高质量轨迹)与负样本(扰动的/不良的轨迹),通过对比损失拉开二者在表示空间的距离,使模型习得对轨迹质量的判别能力。(方法节)
用人话重新讲一遍。 标准模仿(BC)只做一件事:让模型输出**贴近专家轨迹**。问题是——它**只见过好的**,对"坏"没有任何概念。闭环中模型偏离专家分布后,它不知道自己正在变坏,于是越走越偏。
对比学习补的就是这块。除了正样本(专家轨迹),额外造一批**负样本**:对专家轨迹做扰动、生成会压线/碰撞/急刹的"坏轨迹"。用一个对比损失(InfoNCE 风格)把正样本的表示拉近、负样本推远——让模型学会"什么是好、什么是坏",而不只是"模仿好"。这样闭环中模型对"我正在变坏"有了感知,能往回拉。
类比:标准 BC 像只看正确答案背题的学生,遇到没背过的题就懵;对比学习像同时研究错题集的学生,知道哪些是陷阱,遇到偏题也能判断对错。边界:错题集类比强调"见过坏例子",但对比学习更进一步——它在**表示空间**显式拉开好坏,而不只是记住几个坏例子。
代码实现走读(示意,行号需核实)。
# 来源:jchengai/pluto,contrastive 模块(源码结构,示意性走读)
def contrastive_loss(self, traj_feat, pos_feat, neg_feats, tau=0.1):
# traj_feat : 模型预测轨迹的表示
# pos_feat : 正样本(专家/高质量轨迹)表示
# neg_feats : 负样本(扰动/碰撞/压线轨迹)表示 [B, N_neg, D]
pos_sim = F.cosine_similarity(traj_feat, pos_feat, dim=-1) / tau
neg_sim = F.cosine_similarity(
traj_feat.unsqueeze(1), neg_feats, dim=-1) / tau # [B, N_neg]
# InfoNCE:把正样本相似度推高、负样本推低
logits = torch.cat([pos_sim.unsqueeze(1), neg_sim], dim=1)
labels = torch.zeros(logits.shape[0], dtype=torch.long) # 正样本在 index 0
return F.cross_entropy(logits, labels)
# 总损失 = 模仿回归 loss + λ · 对比 loss(λ 为权重,论文给范围,码中具体值需核实)
💡 论文没告诉你的(CIL 的"投影头")。 代码开关 model.use_hidden_proj=true 透露了一个论文正文未强调的细节——对比损失不是直接作用在轨迹特征上,而是先过一个**隐藏投影头(hidden projection head)** 把特征映射到一个专门的对比空间再算相似度。这与 SimCLR 的设计如出一辙(对比学习在投影空间做、下游任务用投影前的表示)。为什么要投影头?因为"对比判别好坏"和"回归预测轨迹"需要的表示不完全一样,投影头让两个目标各取所需、互不干扰。复现时若把对比损失直接加在主干特征上(不加投影头),效果会打折——这是个容易踩的隐藏坑。
组件 ③:数据增强——主动制造"偏离状态"¶
论文原文(转述)。 引入一组数据增强策略,对自车状态/轨迹施加扰动以调节驾驶行为、缓解模仿学习的复合误差(compounding error)。(方法节)
用人话重新讲一遍。 既然闭环的病根是"模型没见过偏离专家的状态",那就在训练时**主动制造**这些状态:对自车初始状态做扰动(横向平移、航向偏转、速度扰动),让模型学会"从一个偏离的处境如何开回正轨"。这本质上是 DAgger 思想的离线近似——不在线收集纠错数据,而是离线合成偏离状态 + 专家纠错目标。
关键在于"扰动后目标怎么定"。 只把起点挪歪还不够——还要给网络一个"从歪掉的起点该怎么开回去"的监督目标。做法是:扰动自车初始位姿后,用一个简单的几何/控制规则生成一条"从扰动点平滑回归到原专家轨迹"的纠正轨迹作为新标签。这样模型学到的不是"复读专家轨迹",而是"无论我现在偏到哪,都知道怎么修正回正轨"——这正是闭环鲁棒性的来源。
代码实现走读(示意,行号需核实)。
# 来源:jchengai/pluto,数据增强(源码结构,示意性走读)
def augment_ego_state(ego_traj, ref_path):
# 1) 对自车初始状态施加扰动(横移/航向/速度)
dx = uniform(-LAT_MAX, LAT_MAX) # 横向平移幅度(PARTIAL,需核实范围)
dyaw = uniform(-YAW_MAX, YAW_MAX) # 航向偏转
perturbed_init = apply_perturb(ego_traj[0], dx, dyaw)
# 2) 生成"从扰动点回归专家轨迹"的纠正目标(关键:不是照搬专家)
corrected_traj = smooth_return_to_path(perturbed_init, ref_path)
return perturbed_init, corrected_traj # 新(状态, 标签)对
💡 论文没告诉你的(数据增强)。 扰动幅度的分布(LAT_MAX/YAW_MAX)和"回归轨迹"的生成方式论文给得不全(PARTIAL)。这两者是 CIL 之外缓解分布偏移的另一半——扰动太小,模型仍没见过有意义的偏离;太大,会引入物理上不现实的状态污染训练。这与 PlanTF(同组前作)系统研究的"data augmentation for compounding errors"一脉相承。
数据增强与 CIL 是一体两面(关键澄清)。 上面讲的"扰动起点 + 纠正目标"是数据增强缓解分布偏移的用法;但在 PLUTO 里,数据增强还有**第二个身份**——它正是 CIL 造正负样本的**手段**。论文设计了**六个增强函数**,分成两类:
- 正增强 \(T^+\)(保留 GT 轨迹的合理性):如对自车状态加小扰动(state perturbation)、丢弃与自车无交互的 agent(non-interactive agents dropout)——这些变换后,原专家轨迹**仍然是好的**,所以作正样本。
- 负增强 \(T^-\)(产生"像样但实际坏"的轨迹):构造会压线、碰撞、不合理的轨迹——它们看起来是合法输出,但实际违反驾驶质量,所以作负样本喂给对比损失。
本质洞察(把组件②③拧成一股):现在能看清 PLUTO 三件套不是三个孤立模块——数据增强是"原料厂",对比学习是"加工车间"。增强函数批量生产正/负样本,CIL 用它们在表示空间拉开好坏。所以"造负样本质量决定 CIL 成败"(陷阱 2)本质上是说**负增强函数设计得好不好**。理解这层依赖,你复现时就知道:CIL 不 work,先去查负增强函数,而不是调对比损失的温度。
组件 ④:辅助损失——被名字"剧透"的第三件贡献¶
PLUTO 官方 checkpoint 叫 pluto_1M_aux_cil——cil 是对比模仿学习,aux 就是这里的**辅助损失(auxiliary loss)**。它是论文摘要里明确列出的三大改进之一("一种广泛适用、可批量高效计算的辅助损失计算方法"),但比起 CIL 容易被读者忽略。
用人话讲。 主损失是"预测轨迹贴近专家",但只靠它,模型对"轨迹是否压线、是否离障碍太近、是否撞上他车预测"这些**几何/安全属性**没有直接监督。辅助损失就是把这些属性显式地做成附加的可微目标——例如轨迹点到车道边界的距离约束、与他车预测轨迹的碰撞惩罚、运动学平滑项——和主损失一起优化。
关键在"全程可微"(这是它的工程亮点)。 辅助损失的计算分三步——投影(把轨迹点投到参考线/边界上算横向距离)、插值(在离散轨迹点间插值以连续地算约束)、损失计算(把违反量变成标量损失)。这三步**全部可微**,所以辅助损失能和主模仿损失一起反传、端到端训练,而不是一个不可导的事后检查。再加上**可批量向量化**(在一个 batch 上并行算所有场景的几何约束,而非逐场景串行),它在百万级数据训练中才负担得起。
辅助损失 vs 碰撞后优化(连接 UniAD):注意这与 UniAD 组件⑥的"碰撞后优化"是**两种思路**——UniAD 在**推理时**对输出轨迹做一次碰撞投影(事后修正),PLUTO 把安全/几何约束做成**训练时**的辅助损失(让模型在学习阶段就内化这些约束)。前者是"生成-投影",后者是"约束内化"。两者可以叠加,但代表了给学习式规划器注入安全先验的两个不同时机——记住这个对比,你就掌握了"训练时管 vs 推理时管"的设计选择。
💡 论文没告诉你的(PLUTO 复现命脉)¶
| 隐藏细节 | 论文 | 来源 | 教学价值 |
|---|---|---|---|
| 负样本如何生成(六个增强函数、正负两类) | 描述性 | 代码(PARTIAL,需核实具体实现) | 负样本质量直接决定 CIL 有没有用 |
| 数据增强的扰动幅度分布 | 提及 | 代码/config(PARTIAL) | 太小没效果,太大引入不现实状态 |
| 对比 loss 权重 λ 与温度 τ | 给范围 | 代码具体值需核实 | 平衡模仿与判别,调参敏感 |
| CIL 的启用开关 | 未提 | 已核实:model.use_hidden_proj=true + custom_trainer.use_contrast_loss=true |
复现 CIL 必须打开这两个开关,否则退化成普通模仿 |
| nuPlan 闭环的 reactive/non-reactive 设置 | 实验节 | 评估脚本 | 背景车是否对你反应,闭环难度差异大 |
关键实验数据(建立量化直觉)¶
PLUTO 在 nuPlan 标准闭环 benchmark 上评估。先理解这套 benchmark 的构成(已核实),才能读懂"超越规则派"的分量:
| 评估设置 | 含义 |
|---|---|
| Test14-random | 从 14 类场景各随机采样固定的一批,常规难度 |
| Test14-hard | 用规则派 PDM-Closed 跑每类 100 个场景、取表现最差的 20 个——专挑长尾难例 |
| Val14 | 验证集划分,常用于横向对比 |
| NR / R | non-reactive(背景车回放)/ reactive(背景车用 IDM 等对你反应)两种模式 |
核心结果(精确分数见原论文 Table):
| 维度 | 结果 |
|---|---|
| nuPlan 闭环综合得分 | 首次以纯模仿学习超越当时最强规则/混合基线 PDM——这是全章里程碑级结论 |
| Test14-hard(长尾) | 在专挑的难例上仍保持竞争力,体现三件套对分布偏移的缓解 |
| 开环 vs 闭环 | PLUTO 强调闭环;开环好≠闭环好,而 PLUTO 两者俱佳(对照 UniAD 只有开环) |
| 消融 | 去掉 CIL / 去掉数据增强 / 去掉纵横感知,闭环分数均下降,证明三件套各有贡献 |
为什么"超越 PDM"这么重要:PDM(《Parting with Misconceptions...》,CoRL 2023)是 nuPlan 上长期霸榜的规则/混合基线,闭环得分极高(CLS≈92 量级)。在 PLUTO 之前,学习派普遍**开环好看、闭环输给 PDM**——这是领域共识。PLUTO 第一次用**纯模仿学习**(非 RL、非规则)在闭环把这个共识打破。这不是某个指标涨了几个点,而是**改变了"学习 vs 规则谁更强"的判断**——结论性贡献的价值正在于此。
⚠️ 常见陷阱¶
陷阱 1(思维陷阱·全章最重要):用开环指标判断闭环性能 - 错误描述:看到某模型开环 L2 低,就认为它能在真实闭环开好。 - 现象/后果:上车/闭环测试中漂移、压线、急刹,与开环指标严重背离,决策误判。 - 根本原因:开环不累积误差,闭环累积;开环-闭环鸿沟是模仿学习的本质特征。 - 正确做法:永远以闭环指标为准评估规划器;报告开环时必须同时报闭环(PLUTO 的做法)。
陷阱 2(论文误导):忽视负样本/增强的构造细节,CIL 失效 - 错误描述:照搬"加个对比 loss",但负样本随便造或不造。 - 现象/后果:对比 loss 加了却没用,闭环不见提升,误判为"CIL 没用"。 - 根本原因:CIL 的效果**全系于负样本质量**,而负样本构造细节论文给得不全(PARTIAL)。 - 正确做法:从代码提取负样本生成逻辑(扰动类型/幅度),确保负样本是"像样但确实坏"的轨迹。
陷阱 3(概念误区):把 PLUTO 当强化学习 - 错误描述:以为"超越规则派"靠的是 RL。 - 现象/后果:误以为需要环境交互/奖励工程,复现方向跑偏。 - 根本原因:PLUTO 是**纯模仿 + 对比 + 增强**,不用 RL、不用在线交互。 - 正确做法:明确它是离线模仿范式;对比学习是自监督式辅助目标,不是 RL 奖励。
陷阱 4(编程陷阱):nuPlan 闭环接口的坐标系/时序坑
- 错误描述:对接 nuPlan simulation 时坐标系(global vs ego)或时间戳对齐弄错。
- 现象/后果:闭环里轨迹方向错乱或滞后,仿真直接失败。
- 根本原因:nuPlan 的 observation/trajectory 有特定坐标与时间约定,接口细节多。
- 正确做法:严格按 pluto_planner 的接口约定转换坐标与时间,用静止/直行场景先验证接口正确。
练习¶
- (复现验证·必做) 在 nuPlan 上跑通 PLUTO 闭环评估(Val14/Test14),记录闭环得分并与规则派基线 PDM 对比。这道题让你亲历"闭环评估流程"——它比开环复杂得多。
- (差异分析·必做) 做消融:关掉对比学习(只留 BC + 增强),对比闭环得分变化,定量看 CIL 贡献了多少。
- (设计扩展·选做) 对比模仿学习不只对自驾有用。设计:如何把"造负样本 + 对比 loss"用到 Diffusion Policy 的机械臂任务上,让扩散策略也学会"什么是坏抓取"?
- (对照分析·选做) PLUTO 用"参考线 + 纵横解耦",Diffusion Planner 用"去噪 + classifier guidance",UniAD 用"query 回归 + 碰撞优化"——三者都在 nuPlan/nuScenes 上做规划。列一张表,对比它们的**多模态来源、安全注入时机(训练时/推理时)、是否依赖参考线先验**,并说明哪种最不依赖人工先验。
🔬 研究视角:PLUTO 的贡献结构¶
- 问题定义贡献:把"模仿学习能否在闭环超越规则派"这个**长期悬而未决的问题**摆上台面并给出肯定答案。结论性贡献的分量,在于它改变了领域的判断。
- 框架贡献:提供了一套"让模仿学习闭环稳"的完整可复现配方(纵横感知 + CIL + 数据增强 + 辅助损失 + nuPlan 接口)。
- 实验方法论贡献:在**闭环 benchmark**(含专挑长尾的 Test14-hard)上做系统消融,逐个证明四个组件的贡献——说服力来自"闭环 + 受控消融 + 长尾测试"这一组合,而非单一开环指标。
PLUTO 在技术史上的位置(承上启下):把 G2→G5 的脉络连起来看——UniAD(G2)确立了 query 端到端架构但只在开环验证;领域随后发现 nuScenes 开环不可信(批判性再审视)、转向 nuPlan 闭环;PlanTF(PLUTO 前作)系统研究了闭环所需的"关键特征 + 数据增强"并指出 imitation gap;PLUTO 在此基础上加入对比学习与辅助损失,第一个在闭环越过规则派这道坎。理解这条"架构→评估觉醒→闭环攻坚"的线,你就懂了为什么 2023→2024 这一年领域的重心从"刷开环 SOTA"急速转向"闭环能不能赢规则派"——PLUTO 正是这个转向的句号。
局限(过渡到非核心论文群)¶
局限一:受限于专家数据。 模仿的天花板是专家质量与覆盖;专家没演示过的罕见场景仍是软肋。→ 这驱动了 Hydra-MDP 的**多教师知识蒸馏**——不止学人类一个老师,而是让 Traffic-Light、Lane-Keeping、Comfort 等多个规则教师分别指导不同方面(非核心群详述)。
局限二:闭环 SOTA,但安全无形式化保证。 PLUTO 闭环分数高,但仍是神经网络,无法形式化证明"绝不撞"。→ 这把我们引向**安全过滤兜底架构**与章末"安全验证"这一未解难题。
局限三:仍是任务专用模型。 面对开放世界的长尾、需要常识推理的场景,专用模型力不从心。→ 这驱动了 G6 大模型驾驶(EMMA)——用多模态大语言模型的世界知识直接输出规划(非核心群详述)。
科研启发¶
| 启发类型 | 想法 |
|---|---|
| 局限性→改进 | CIL 的负样本靠手工增强函数生成——能否让负样本"自动挖掘",即用模型自己在闭环中犯过的错(漂移、压线)作为真实负样本,形成"犯错-对比-改进"的闭环自提升? |
| 跨论文组合 | PLUTO 的对比学习(教模型识别好坏)+ 扩散的多模态生成:先用扩散生成多条候选,再用 CIL 学到的判别器给候选打分排序,兼得"多模态生成"与"质量判别" |
| 假设挑战 | PlanTF 发现自车历史会诱发 shortcut。那 agent 历史会不会也诱发 shortcut(模型外推他车历史而非理解交互)?能否对 agent 状态也做 dropout? |
| 代码中的发现 | 辅助损失的"可微投影+插值"是个通用工具——能否把它从训练时损失,搬到推理时做一次可微细化(像 UniAD 碰撞优化那样),让训练/推理都用同一套几何约束? |
| 空白地带 | PLUTO 在 nuPlan 闭环超规则派,但 nuPlan 的 reactive 模式用的是 IDM 简单背景车。换成 nuPlan-R/SMART 这类学习式 reactive 背景车(更接近真实博弈),PLUTO 还能赢吗? |
接下来进入**非核心论文群**:VAD(矢量化提速)、Hydra-MDP(多教师蒸馏)、Diffusion Planner(自驾扩散 + 安全过滤)、EMMA(大模型驾驶)。它们或是三篇核心论文某条局限的回应,或是另一条平行路线,将以精简模式(每篇 50–150 行)解读。
非核心论文群¶
以下四篇按精简模式解读(每篇点明核心 idea、与核心论文的差异、最关键的一个数据、定位)。它们或回应了三篇核心论文的某条局限,或代表另一条平行路线。
VAD / VADv2 —— 矢量化端到端 ⭐⭐¶
论文信息:Bo Jiang, Shaoyu Chen 等,VAD: Vectorized Scene Representation for Efficient Autonomous Driving,ICCV 2023;VADv2(2024)为概率规划扩展版。Horizon Robotics 等。
核心观察与整体方案。 直接回应 UniAD 的**局限一**(密集 BEV 表示 + 大量 query 带来的 \(O(N^2)\) 开销)。VAD 的洞察是:规划真正需要的不是密集占据栅格,而是**矢量化的实例**——车道是几条折线,agent 是几个带属性的向量。把场景从"密集栅格"换成"稀疏矢量",计算量大降,且矢量表示本就贴合规划所需的几何约束。
方法要点(与 UniAD 的差异)。 - 表示:UniAD 用密集 BEV + occupancy 栅格;VAD 用矢量化的 map(折线)和 agent(向量),约束以矢量间的几何关系表达(如自车与边界矢量的距离)。 - 效率:去掉密集占据预测这一重模块,推理显著加速。 - VADv2 的进一步:从回归单条轨迹(UniAD 式单模态)转向**概率规划**——输出动作的概率分布,缓解多模态平均问题(与扩散殊途同归,但用离散动作词表 + 分布而非去噪)。
关键数据。 在 nuScenes 上,VAD 在保持或提升规划性能的同时,推理速度相对 UniAD 大幅提升(量级提升,精确倍数「需核验」)。
更深一层:矢量化为什么快、怎么做。 密集 BEV 表示要在整张 \(H\times W\) 网格上做卷积/注意力,但规划真正关心的只有少数实例(前车、左右车道、行人)——密集网格的绝大部分计算花在"空地"上。VAD 把场景表示为**矢量化 token**:每条车道是一串折线点(polyline)编码成的 token,每个 agent 是一个带属性(位置/速度/类别)的向量 token。规划头不再读密集栅格,而是让 ego query 直接 attend 这些稀疏 token,并把约束表达为**矢量间的几何关系**——例如"自车轨迹点到车道边界折线的距离 ≥ 安全裕度""自车与 agent 矢量的时空距离 ≥ 碰撞阈值"。token 数量从 \(O(HW)\) 降到 \(O(\text{实例数})\),计算量随之大降。
VADv2 的概率规划机制。 VADv2 进一步解多模态:预先定义一个**离散的动作/轨迹词表**(vocabulary,一组候选轨迹),网络输出在这个词表上的**概率分布**,而非回归单条轨迹。推理时按分布采样或取高概率候选——这与扩散的"去噪采样"殊途同归(都得到多模态候选),但机制完全不同:VADv2 是**离散分类 + 预定义词表**,扩散是**连续去噪 + 随机起点**。VADv2 的优势是推理快(一次前向出分布),代价是词表的覆盖度限制了能表达的轨迹空间。
论文没告诉你的 / 局限。 ① 矢量化丢弃了密集占据信息——对"非结构化空间"(如空旷停车场、施工区)的表达不如密集 BEV;② 词表式概率规划的词表如何构造(聚类专家轨迹?均匀采样?)是关键且需从代码核实的细节;③ 矢量 token 的构造依赖上游矢量化感知(在线建图)的质量,误差会传递。
定位。 UniAD 局限一的直接回应——用矢量化把端到端做快。VADv2 则在"多模态"维度上与扩散范式形成对照(离散概率词表 vs 连续去噪生成),是 G3 矢量化线的代表。
Hydra-MDP —— 多教师知识蒸馏 ⭐⭐¶
论文信息:Zhenxin Li 等,Hydra-MDP,CVPR 2024 Autonomous Grand Challenge(NAVSIM 赛道冠军),NVIDIA 等。
核心观察与整体方案。 回应 PLUTO 的**局限一**(模仿单一专家,天花板受专家覆盖限制)。Hydra-MDP 的思路:别只学人类一个老师。它构造**多个规则教师**,每个教师对应一个评估维度(如无碰撞 no-collision、可行驶区域 drivable-area-compliance、行驶舒适 comfort、交通灯 traffic-light 等),把每个教师对候选轨迹的"打分"蒸馏给学生模型。推理时学生综合多头评分选轨迹。
方法要点(与 PLUTO 的差异)。 - 监督信号:PLUTO 用专家轨迹 + 对比;Hydra-MDP 用**多个 metric 教师的评分**做蒸馏——学生学的不是"专家怎么开",而是"各个维度怎么评一条轨迹好坏"。 - 多头结构(Hydra = 多头):一个 backbone + 多个评估头,分别对应不同教师 metric。 - 与规则的关系:把规则知识(各 metric)蒸馏进网络,兼得规则的可靠性与学习的泛化。
关键数据。 NAVSIM benchmark 上取得当年挑战赛冠军成绩(PDMS 分数领先,精确值「需核验」)。
更深一层:多教师蒸馏到底怎么运作。 分三步看:① 教师打分——准备一组候选轨迹(trajectory proposals),每个规则教师按自己的 metric 给每条候选打分(如 no-collision 教师检查这条轨迹会不会撞、comfort 教师算加加速度),这些分数是基于规则/仿真算出的、可靠的"标准答案"。② 学生蒸馏——学生网络有多个评估头,每个头对应一个教师 metric,训练目标是让学生头的打分**逼近对应教师的打分**(这就是知识蒸馏——把教师的判断蒸馏进学生)。③ 推理综合——学生对每条候选输出多个 metric 分数,加权组合成总分,选总分最高的候选。
为什么这样设计巧妙:规则教师可靠但慢(要跑仿真/规则);学生网络快但不知道什么是好。蒸馏让学生**一次前向就预测出"各个 metric 教师会怎么打分"**——把慢而可靠的规则知识,压缩进快速的网络。这是"规则知识 + 学习速度"的融合,与 PLUTO 的"纯模仿 + 对比"、Diffusion 的"纯生成"形成三条不同的技术路线。
论文没告诉你的 / 局限。 ① 候选轨迹(proposals)从哪来——需要一个轨迹提议机制(锚点/采样/词表),其覆盖度影响上限;② 多个 metric 分数如何加权组合是关键超参,论文未必给全;③ 教师 metric 的选择(哪些维度)需要领域知识,遗漏重要维度会留下安全盲区;④ 蒸馏的本质是模仿教师,学生不会超过教师 metric 所能表达的"好"。
定位。 PLUTO 局限一的回应——用多教师蒸馏突破单一专家(人类)的天花板,让监督信号从"一个人类老师"变成"多个 metric 老师"。它代表"规则知识 + 学习"的融合路线(与纯模仿的 PLUTO、纯生成的 Diffusion 形成三足),在 NAVSIM 这类非反应式闭环 benchmark 上尤其有效。
Diffusion Planner —— 自驾版扩散与联合去噪 ⭐⭐¶
论文信息:Yinan Zheng, Ruiming Liang, Kexin Zheng 等(清华大学 AIR / 张弢、李升波组等),Diffusion-Based Planning for Autonomous Driving with Flexible Guidance,ICLR 2025(Oral),arXiv:2501.15564。代码:
ZhengYinan-AIR/Diffusion-Planner。
核心观察与整体方案。 把核心论文 B(Diffusion Policy)的"动作序列去噪"范式**搬到自动驾驶轨迹**,并做了一个关键升级:不只去噪自车轨迹,而是把自车轨迹和周围 agent 轨迹联合去噪。这一步让扩散同时建模"我怎么走"和"他们怎么走"的耦合——天然是时空 + 博弈联合(呼应 T5 多智能体与即将到来的博弈专题)。
方法要点(与 Diffusion Policy 的差异)。 - 去噪对象:Diffusion Policy 去噪机械臂动作;Diffusion Planner 去噪 \((x_t,y_t)\) 时空轨迹,且**联合**自车 + 他车(同一架构内联合建模 prediction 与 planning)。 - 架构:采用 DiT(Diffusion Transformer) 骨架,融合"带噪的未来轨迹"与"条件信息";条件为 BEV/agent 历史/地图/导航(对应 Diffusion Policy 的视觉观测条件)。 - flexible guidance:学习的是轨迹 score function 的梯度,并用 classifier guidance 在推理时灵活注入行为偏好(如不同驾驶风格),无需重训——这是它"flexible guidance"命名的由来,也是本章"生成-投影"模板的扩散化身。 - 少步推理:扩散采样优化到约 20Hz 实时,缓解 Diffusion Policy 的"推理慢"局限。
关键数据。 在大规模真实闭环基准 nuPlan 上达到学习派 SOTA,直接使用模型输出(无需任何 rule-based 后处理)即可媲美甚至超越规则派方法;叠加一个已有的后处理模块后,进一步在所有基线中取得 SOTA。这一点很关键——它与 UniAD/早期模仿派"必须靠规则兜底"形成对照(精确分数见原论文 Table 1)。
更深一层:联合去噪为什么是"隐式博弈"。 普通做法是只去噪自车轨迹,建模条件分布 \(p(\tau_{ego}\mid O)\)。Diffusion Planner 改为联合去噪自车 + 所有他车的轨迹,建模**联合分布** \(p(\tau_{ego}, \tau_1,\dots,\tau_N\mid O)\)。关键在于:去噪网络内部用 attention 让所有 agent 的轨迹**在每一步去噪中相互影响**——自车的轨迹会"看"他车正在去噪成什么样,他车也会"看"自车。最终生成的一组轨迹是**相互协调、交互一致**的(自车的让行假设了他车的抢行,反之亦然)。
本质洞察:这就是**隐式博弈**——它没有显式求解纳什均衡(不像博弈规划专题那样解一个博弈),但通过联合建模 + 注意力交互,生成的联合轨迹**近似是"相互最优响应"的**。这是扩散范式与博弈范式的天然接口:联合去噪用生成的方式逼近了博弈均衡。这也正是它"时空 + 博弈联合"定位的由来(呼应博弈规划专题)。
约束引导去噪(生成-投影模板的扩散版)。 自驾轨迹必须满足动力学和碰撞约束,但纯去噪不保证。Diffusion Planner 类方法常用**约束引导**——在去噪的每一步,除了去噪网络给的方向,额外加一个**约束梯度**(把轨迹往"满足动力学/不碰撞"的方向推),类似 classifier guidance。这正是全章反复出现的"生成-投影"模板在扩散里的体现:去噪生成 + 每步约束投影。
论文没告诉你的 / 局限。 ① 联合去噪的计算量随 agent 数增长(联合维度变大);② 约束引导的权重(约束梯度 vs 去噪梯度的平衡)是关键超参,太强会破坏多模态、太弱约束不满足;③ 仍是扩散,即便少步采样,推理也比一次回归慢;④ 联合分布的训练需要所有 agent 的轨迹标注。
定位。 Diffusion Policy 在自驾的落地 + 升级(联合去噪 + flexible classifier guidance)。它把"扩散多模态""闭环规划""隐式博弈"三者结合,并证明扩散派**无需 rule-based 兜底即可在 nuPlan 闭环媲美/超越规则派**——这与 UniAD 的碰撞后优化、PLUTO 的对比学习路线形成第三条答案。它是 G4 扩散线在自驾的代表,也是通向博弈规划专题的桥梁。
EMMA —— 大模型驾驶 ⭐⭐¶
论文信息:Waymo,EMMA: End-to-End Multimodal Model for Autonomous Driving,arXiv 2024-10,基于 Gemini。开源复现:
taco-group/OpenEMMA。
核心观察与整体方案。 回应 PLUTO 的**局限三**(任务专用模型对开放世界长尾、需常识推理的场景力不从心)。EMMA 的激进做法:直接用多模态大语言模型(MLLM)做驾驶——把相机图像和导航指令喂给 Gemini,让它以**文本/坐标**的形式直接输出规划轨迹和可解释的推理链。驾驶被重新表述为一个多模态的"视觉 + 语言 → 轨迹"生成任务。
方法要点(与核心论文的差异)。 - 范式:UniAD/PLUTO 是专用网络;EMMA 是**通用大模型 + 驾驶微调**,借用大模型的世界知识与常识推理。 - 输出:轨迹以文本化的坐标序列输出(语言模型的自然形式),并能同时输出推理解释(可解释性的新形态)。 - 代价:大模型推理慢、成本高、实时性是大挑战;幻觉与可靠性是新问题。
关键数据。 在多个驾驶任务上展示了 MLLM 直接规划的可行性,是**首个工业级 MLLM 端到端驾驶尝试**(具体指标「需核验」)。
更深一层:大模型怎么"开车"。 EMMA 把驾驶重新表述为一个**视觉问答 / 文本生成**任务:输入是相机图像 + 导航指令(文本,如"在下一路口右转"),输出是**文本化的轨迹坐标序列**(如把未来轨迹点写成一串数字 token),并且可以同时输出**推理链(chain-of-thought)**——先用文字描述场景("前方有行人正在过马路")、识别关键物体、做出推理("应减速让行")、再给出轨迹。整个过程复用大模型已有的视觉-语言能力,只用驾驶数据做微调。
为什么大模型驾驶有吸引力:① 世界知识——预训练大模型认识各种罕见物体、理解常识(知道救护车要让行、知道"学校区域"要慢行)、甚至能读懂标志牌上的文字,这些是专用网络要从零学的;② 泛化——对没专门训练过的长尾场景,大模型可能凭常识做出合理反应(zero/few-shot);③ 可解释——输出的推理链是一种全新的可解释性形态(专用网络给不出"为什么这么开"的文字解释)。这正是它回应 PLUTO 局限三(任务专用、长尾乏力)的逻辑。
论文没告诉你的 / 局限。 ① 精确几何弱——语言模型不擅长精确数值/3D 距离,输出的坐标可能不够精准(这是 MLLM 做规划的根本短板);② 推理慢、成本高——大模型自回归生成轨迹,延迟远超专用网络,实时性是致命问题;③ 幻觉——可能"一本正经"输出不合理轨迹或错误推理;④ 安全无保证——比专用网络更不透明,必须配后验校验 + 投影兜底(见故障 5)。taco-group/OpenEMMA 用开源 MLLM(如 LLaVA 系)复现了 EMMA 的思路,便于研究但能力弱于 Gemini 版。
定位。 PLUTO 局限三的回应,也是 G6 大模型驾驶的代表——用大模型的常识能力应对长尾。它把端到端推到了一个全新的范式(语言模型即规划器),开辟了可解释性的新形态,但精确感知、实时性、幻觉、安全都远未解决——研究价值远大于落地价值。
安全过滤:端到端规划的兜底架构(Autoware 2025+)¶
三篇核心论文反复暴露同一个未解问题——神经网络规划器不保证安全(UniAD 靠碰撞后优化、Diffusion 不保证硬约束、PLUTO 无形式化保证)。工业界的应对,是在学习式生成器外面套一层**显式的"生成-验证"管线**。Autoware 2025+ 的新规划架构是这一思路的代表:
diffusion_planner → 生成 K 条候选时空轨迹(学习式,多模态)
▼
trajectory_optimizer → 微调候选,使其满足运动学/平滑
▼
traffic_rule_filter → 滤掉违反交通规则(闯红灯、压实线)的候选
▼
safety_filter → 碰撞检测 + 动力学可行性,滤掉不安全候选
▼
ranker → 按代价对存活候选排序,选最优
▼
adapter → 格式转换输出给控制
▼
(兜底)rule-based planner → 若所有候选都被滤掉,回退到规则规划器
本质洞察(贯穿全章的"生成-验证"模板):这套架构和 UniAD 的"学习回归 + 碰撞后优化"、Diffusion Planner 的"去噪 + 约束投影"是**同一个模板的不同粒度**——用学习模型负责"生成高质量、多模态的候选",用显式规则/优化负责"验证与兜底安全"。学习管创意,规则管底线。这是目前让学习式规划器敢上路的唯一务实答案:不指望神经网络自己保证安全,而是用一个可验证的外壳兜住它。
🔍 一个看似矛盾、实则不矛盾的点(务必厘清):本章非核心群里说过,Diffusion Planner 这篇**论文**的卖点恰恰是"无需 rule-based refinement 就能在 nuPlan 闭环媲美/超越规则派"。那为什么 Autoware 的**工业架构**里,
diffusion_planner后面还要挂一长串safety_filter/ 兜底规则?两者并不打架,区别在于**主张层级不同**: - 论文层面:要证明的是"扩散生成器**本身**已足够强,不靠规则后处理也能拿 SOTA"——这是对**方法能力**的论断。 - 工业层面:要保证的是"绝不出事"——即便生成器 99.9% 的输出都安全,那 0.1% 也必须被一个**可验证、可追责**的外壳挡住。工业不接受"统计上很安全",只接受"有兜底保证"。所以:论文证明"可以不依赖兜底",工业选择"仍然加上兜底"——前者是能力上限的探索,后者是安全下限的保守。这恰恰再次印证全章主题:哪怕生成器再强,只要它是神经网络、不可形式化验证(深入三),工业就不会撤掉那层规则兜底。"生成-验证"不是因为生成器弱,而是因为安全需要可证明的底线。
⚠️ 思维陷阱(呼应大纲思考题):safety_filter 的松紧是个两难。太松→放过不安全候选;太紧→大部分候选被滤掉,系统频繁回退到 rule-based planner,学习模块形同虚设。如何设计 filter 阈值、能否让阈值也可学习,是这套架构的开放调参问题。
综合对比 / 设计空间全景分析¶
三篇核心 + 四篇非核心讲完,现在做系统性综合——不是罗列优缺点,而是定义维度横向对比,并给出选型决策流程。
多维度对比表¶
| 方法 | 场景表示 | 输出形式 | 多模态 | 安全保证 | 训练范式 | 实时性 | 评估方式 | 落地方向 |
|---|---|---|---|---|---|---|---|---|
| UniAD | 密集 BEV + occ | 轨迹点回归 | 单模态 | 碰撞后优化 | 多任务模仿 | 中 | 开环(nuScenes) | 自驾 |
| VAD/VADv2 | 矢量化 | 轨迹/概率分布 | VADv2 多模态 | 几何约束 | 模仿 | 快 | 开环 | 自驾 |
| Diffusion Policy | 视觉观测 | 动作序列去噪 | 天然多模态 | 无(需投影) | 扩散 | 慢(多步) | 仿真+真机 | 机械臂 |
| Diffusion Planner | BEV/agent | 时空轨迹去噪(联合) | 天然多模态 | classifier guidance(无需规则兜底) | 扩散(DiT) | ~20Hz | 闭环(nuPlan) | 自驾 |
| PLUTO | 矢量 token | 轨迹 + 判别 | 部分(可采样) | 无形式化保证 | 模仿+对比 | 快 | 闭环(nuPlan) | 自驾 |
| Hydra-MDP | BEV | 多头评分选轨迹 | 候选集 | 多 metric 教师 | 多教师蒸馏 | 中 | NAVSIM | 自驾 |
| EMMA | 图像+语言 | 文本化坐标 | 大模型采样 | 无(不成熟) | 大模型微调 | 慢 | 多任务 | 自驾(前沿) |
读表的几个关键对照:
- 多模态怎么来:扩散靠去噪随机起点(Diffusion Policy/Planner)、概率规划靠分布输出(VADv2)、大模型靠采样(EMMA)、Hydra 靠候选集——四条不同技术路线解决同一个"别把多峰平均"的问题。
- 安全怎么保:没有任何一个纯学习方法给出**形式化**保证。务实方案分两类——一类靠"生成-验证"外壳(UniAD 的碰撞后优化、Autoware 的安全滤波兜底、Hydra 的多教师约束),另一类如 Diffusion Planner 用 classifier guidance 把安全偏好注入生成过程本身、力求不依赖外部规则兜底。但即便后者,仍无形式化的"绝不撞"证明。
- 评估的成色:开环(nuScenes)易刷分但不代表能开(见 PLUTO 陷阱 1);闭环(nuPlan)才是硬考场。PLUTO/Diffusion Planner 的闭环成绩含金量最高。
选型决策流程图¶
你的规划任务……
│
├─ 需要常识推理 / 应对开放世界长尾?
│ └─ 是 → 大模型驾驶(EMMA 路线)【代价:慢、贵、不成熟,研究为主】
│
├─ 决策天然多模态(路口博弈、多解操作)?
│ ├─ 是 + 可接受多步推理 → 扩散(Diffusion Policy/Planner)
│ └─ 是 + 要求快 → 概率规划(VADv2)或候选集(Hydra-MDP)
│
├─ 要在闭环 / 真车上稳定运行?
│ └─ 是 → 模仿+对比+增强(PLUTO)或带安全滤波的扩散(Diffusion Planner+Autoware)
│ 必须配"生成-验证"安全外壳
│
├─ 算力 / 实时性紧张?
│ └─ 是 → 矢量化(VAD)优先,避免密集 BEV 的 O(N²)
│
└─ 想要可解释的中间表示 + 端到端目标一致?
└─ UniAD 的 planning-oriented query 架构
一句话选型直觉:要快选矢量化(VAD),要稳上闭环选模仿+对比(PLUTO),要多模态选扩散(Diffusion Planner),要常识看大模型(EMMA),要可解释中间表示选 query 架构(UniAD)——而无论选哪个,安全都得靠外面那层"生成-验证"兜底。
范式总结与研究启发¶
七篇论文讲完,跳出单篇,看整片森林——这一节要回答的不是"每篇做了什么",而是"这批工作合起来,本质上在解决什么问题、用什么统一视角能理解全部"。
本方向的核心范式¶
把全章压缩成三句话,就是端到端/扩散式时空规划的核心范式:
范式一:拆掉接口,让梯度贯通——以终为始。 经典栈用人类先验把端到端问题切成感知/预测/规划,每道接口都是信息瓶颈、每个模块的目标都不是"把车开好"。端到端范式(UniAD 为代表)反向操作——用 query 这样的高维接口替代"压扁"的中间结果,让规划梯度一路反传到感知,使整个系统**朝最终目标联合优化**。代价是可解释性与可验证性下降。
范式二:把生成拆成去噪步——用简单步骤逼近复杂分布。 直接建模"观测→多模态轨迹"的复杂分布很难,扩散范式(Diffusion Policy/Planner)把它拆成一串简单的高斯去噪步,每步只回归噪声。多模态从随机起点天然涌现。这与 T3 的迭代优化(把非凸拆成一串凸子问题)在哲学上同构——化整为零、迭代逼近。
范式三:这两条路都绕过了 PVD,回到"直接产时空轨迹"。 这是本章与前五章最深的连接:T1 的 PVD(先路径后速度)是为了让**人手设计的优化器能实时求解**而做的妥协;当求解器换成神经网络(离线训练承担计算、在线只做前向),这个妥协不再必要——所以端到端/扩散方法**直接输出 \((x(t),y(t))\)**,路径和速度浑然一体。
统一视角(全章最重要的一句):本章所有方法的共同点,是**用海量数据 + 离线训练,把经典栈在线求解不动的"完整时空轨迹优化"问题,转化为一次神经网络前向**。它们用训练时的算力,赎回了 PVD 当年为实时性付出的最优性代价。但这笔交易留下一个至今未还的债——神经网络规划器无法形式化保证安全。于是工业界的务实答案统一收敛到"生成-验证":让学习模型负责生成高质量、多模态的候选,让显式规则/优化负责验证与兜底。学习管创意,规则管底线——这是本章七篇论文、连同 Autoware 安全架构,反复印证的同一个模板。
三大范式横向对照(一张表收束全章)¶
把本章三条技术路线在同一组维度上对照,它们对"同一个时空规划问题"给出了三种不同的攻法:
| 维度 | 模仿派(UniAD/PLUTO/VAD) | 扩散派(Diffusion Policy/Planner) | 大模型派(EMMA) |
|---|---|---|---|
| 核心动作 | 拆接口让梯度贯通、模仿专家 | 把生成拆成去噪步 | 借大模型常识做生成 |
| 多模态来源 | 概率词表/候选集(需额外设计) | 随机噪声起点(天然) | 大模型采样(天然但不可控) |
| 安全策略 | 碰撞后优化 / 对比学习 / 安全滤波 | classifier guidance / 滤波 | 后验校验 + 投影(强制) |
| 实时性 | 快(一次前向) | 中(少步去噪,~20Hz) | 慢(自回归生成) |
| 最强战绩 | PLUTO 闭环超规则派 | Diffusion Planner 无需规则兜底 SOTA | 长尾常识可行性 demo |
| 最大软肋 | 多模态需硬造、单一专家天花板 | 推理慢、硬约束不保证 | 精确几何弱、幻觉、慢 |
| 成熟度 | 高(已上闭环) | 中高(闭环验证中) | 低(研究为主) |
端到端模仿栈 与 扩散生成栈:逐环节同构¶
两条主线看似不同,逐环节比对会发现它们是**同一骨架的两种填法**——这是理解全章的最后一块拼图:
模仿/端到端栈 扩散生成栈
(UniAD 式) (Diffusion Planner 式)
感知 ┌────────────────┐ ┌────────────────┐
编码 │ BEV / 矢量化 │ 同 │ BEV / agent 编码 │ ← 都要把场景编码成条件
│ → 场景条件 O │ 构 │ → 场景条件 O │
└───────┬────────┘ └───────┬────────┘
生成 ┌───────▼────────┐ ┌───────▼────────┐
轨迹 │ query 回归 │ 替 │ 从噪声去噪 │ ← 同样产出时空轨迹 (x_t,y_t)
│ (确定/概率) │ 换 │ (天然多模态) │ 只是"怎么生成"不同
└───────┬────────┘ └───────┬────────┘
安全 ┌───────▼────────┐ ┌───────▼────────┐
兜底 │ 碰撞后优化 │ 同 │ classifier 引导 │ ← 都把安全/约束作用到生成上
│ (生成后投影) │ 构 │ (生成中投影) │ 事后 vs 每步,殊途同归
└───────┬────────┘ └───────┬────────┘
▼ ▼
时空轨迹 τ 时空轨迹 τ
本质洞察(全章收束):两栈的差别,只在中间"生成轨迹"那一环——模仿派用 query 回归、扩散派用去噪。感知编码(前)和安全兜底(后)两环,两栈**结构同构**。这解释了为什么 Diffusion Planner 能直接复用自驾的 BEV 编码和安全验证思路,只把规划头换成扩散——因为前后两环本就共享。看穿这个同构,你就不再把"端到端"和"扩散"当成两个领域,而是同一条"感知→生成→验证"流水线的两种生成器选择。 而无论选哪种生成器,第一环(编码)和第三环(验证)都不变——后者正是"生成-验证"范式之所以普适的结构性原因。
跨方向迁移¶
这套范式能迁移到机器人的其他方向(呼应总论的"跨方向共享"定位):
| 迁移目标 | 怎么迁移 | 为什么可行 | 预期挑战 |
|---|---|---|---|
| 机械臂操作 | Diffusion Policy 本就是机械臂方法;UniAD 的 query 接口可用于多物体操作场景 | 操作天然多模态(多种抓取/路径),扩散直接适用 | 接触动力学、高频控制对推理速度要求高 |
| 无人机轨迹 | 把扩散的去噪对象换成 3D 时空轨迹 \((x,y,z,t)\),条件换成动态障碍走廊 | 无人机轨迹生成已有 MINCO 等优化基线,可作扩散的对照与投影约束 | 动力学约束硬(推力/姿态),需"去噪+投影" |
| 多智能体协调 | UniAD 的 agent query / Diffusion Planner 的联合去噪天然处理多 agent | query 数量 = agent 数量,联合去噪 = 时空+博弈联合(接 T5/博弈专题) | \(O(N^2)\) 注意力随 agent 数爆炸(VAD 矢量化是解法) |
| 任意模仿任务 | PLUTO 的"造负样本+对比 loss"可加到任何模仿学习上 | 对比学习是通用的"教模型识别好坏"机制,与领域无关 | 负样本构造质量决定成败,需领域知识 |
组合创新头脑风暴¶
把本章的创新与本专题其他章节/方法组合,几个值得探索的方向(仅记录种子,不深入可行性分析):
| 组合方案 | 预期效果 | 可行性 | 最大风险 |
|---|---|---|---|
| UniAD query 接口 + 扩散多模态解码头 | 兼得"信息保真"与"多模态"——ego query 作条件,扩散出多条时空轨迹 | 高(已是 Diffusion Planner 雏形) | 推理速度,需少步采样 |
| 扩散生成 + T3 的 CILQR 投影 | 去噪每步后投影到动力学可行集,硬约束满足 + 多模态 | 中 | 投影破坏扩散分布、迭代成本 |
| PLUTO 对比学习 + Diffusion Policy | 让扩散策略也学"什么是坏轨迹",提升闭环鲁棒性 | 中 | 扩散 + 对比的训练稳定性 |
| Hydra 多教师 + 扩散 | 多个 metric 教师指导去噪方向,安全性内生 | 中 | 多教师信号冲突的平衡 |
| EMMA 大模型常识 + 经典栈安全滤波 | 大模型出高层决策,经典栈+滤波保证底层安全 | 中(产业界正在尝试) | 大模型延迟、决策-执行接口 |
完整算法流程¶
把全章的两条主线各用伪代码串一遍,标注对应代码入口(示意,行号需核实)。
主线一:模块化端到端栈(UniAD 式,planning-oriented)
输入:多视角相机图像序列、导航指令
1. BEV 编码:imgs → BEVFormer → BEV 特征 B # mmdet3d_plugin/.../bev_encoder
2. 感知-预测-规划,query 贯通:
track_query = TrackFormer(B, prev_track_query) # 跨帧传播=端到端跟踪
map_query = MapFormer(B) # 在线建图
agent_fut = MotionFormer(track_query, map_query, B) # 多智能体预测
occ = OccFormer(track_query, B) # 未来占据
ego_traj = Planner(ego_query, B, occ, agent_fut) # 直接回归 (x_t,y_t)
3. 安全后处理:ego_traj = collision_opt(ego_traj, occ) # 基于占据的可微投影
输出:自车时空轨迹 τ = [(x_1,y_1),…,(x_T,y_T)]
(训练:六任务联合 loss,规划梯度反传至感知)
主线二:扩散式生成栈(Diffusion Planner + 安全滤波,生成-验证)
输入:BEV/agent 历史/地图,导航
【离线训练】
for batch: a0=expert_traj; ε~N(0,I); k~U(0,K)
ak = √ᾱ_k·a0 + √(1-ᾱ_k)·ε # 前向加噪
loss = ||ε - ε_θ(ak, k, cond)||² # 学去噪
【在线推理 + 验证】
cond = encode(obs)
for j in 1..M: # 采样 M 条候选
τ_j = sample_DDIM(ε_θ, cond, n_steps=少步) # 少步去噪出一条时空轨迹
τ_set = {τ_1,…,τ_M} # 多模态候选集
τ_set = trajectory_optimizer(τ_set) # 运动学微调
τ_set = traffic_rule_filter(τ_set) # 滤交规违例
τ_set = safety_filter(τ_set) # 滤碰撞/不可行
τ* = ranker(τ_set) or rule_based_planner() # 排序选优 / 兜底
输出:τ*
两条主线的共同骨架——学习生成 + 显式安全——正是范式总结里"生成-验证"的代码级体现。
复现指南¶
针对三篇核心论文给出复现路径。命令与环境**已对照各官方仓库核实**(PLUTO/UniAD 的脚本与依赖来自其 GitHub README),但具体版本号仍可能随仓库更新,动手前请再核对当前 README。
环境配置¶
| 仓库 | 关键依赖(已核实) | 数据集 | 算力门槛 |
|---|---|---|---|
OpenDriveLab/UniAD |
PyTorch + mmcv/mmdet/mmdet3d(版本强耦合,最大坑)、CUDA。UniAD 2.0 已迁移到 mmdet3d 1.0.0rc6 + torch 2.0.1+cu118 | nuScenes(mini 可先跑通);2.0 起整合 nuPlan/NAVSIM | 多卡训练;推理单卡可 |
real-stanford/diffusion_policy |
PyTorch、diffusers、robomimic/gym 环境 | PushT / robomimic(自带下载) | 单卡可训练玩具任务 |
jchengai/pluto |
conda python=3.9 + motional/nuplan-devkit(pip install -e .)+ 仓库 setup_env.sh |
nuPlan(需申请下载,较大) | 闭环仿真较吃资源 |
运行命令(已核实,仍以仓库 README 为准)¶
# Diffusion Policy —— 最易上手,建议从这里开始
python train.py --config-name=train_diffusion_unet_lowdim task=pusht_lowdim
python eval.py --checkpoint <ckpt> --output_dir <dir> # 可视化去噪过程
# UniAD —— 先在 nuScenes mini 跑推理/评估,别一上来训练
bash tools/uniad_dist_eval.sh <config> <ckpt> <n_gpu>
# PLUTO —— 闭环仿真(官方脚本;先装好 nuplan-devkit 与 setup_env.sh)
sh ./script/run_pluto_planner.sh pluto_planner nuplan_mini \
mini_demo_scenario pluto_1M_aux_cil.ckpt /dir_to_save_result_video
# ↑ pluto_1M_aux_cil.ckpt 中 aux=辅助损失、cil=对比模仿学习,印证三大创新
预期结果¶
- Diffusion Policy / PushT:可视化能看到轨迹从噪声逐步收敛;成功率应接近论文报告量级。把 DDPM 100 步换 DDIM 10 步,质量略降但快很多。
- UniAD / nuScenes:官方报告 planning 平均碰撞率 0.31%、motion 0.71m minADE、occ 63.4% IoU;可视化看到感知→预测→规划的端到端输出。注意这是开环指标(见批判性再审视)。
- PLUTO / nuPlan:闭环得分应接近论文报告、超过规则派基线 PDM(这是 PLUTO 的核心结论);注意区分 reactive(R) / non-reactive(NR) 设置,二者难度差异大。
常见复现问题¶
- UniAD 的 mmdet3d 版本地狱:mmcv/mmdet/mmdet3d 三者版本必须精确匹配,错一个就编译失败或运行报错——严格按 README 锁版本,别用最新版。
- Diffusion Policy 推理用错权重:必须用 EMA 权重推理,否则成功率大跌(见 Diffusion Policy 陷阱 3)。
- PLUTO 的 nuplan-devkit 接口:坐标系(global/ego)、时间戳对齐、地图 API 调用是高频坑——先用直行场景验证接口(见 PLUTO 陷阱 4)。
- GPU 确定性:扩散采样、注意力的非确定性算子会让结果不可复现——需要时固定随机种子并开启确定性模式(会变慢)。
复现难度对照与推荐路径¶
三篇核心论文复现难度差异很大,强烈建议按下表从易到难推进,别一上来就啃最难的 nuPlan 闭环:
| 复现项 | 难度 | 主要门槛 | 单卡可行性 | 建议顺序 |
|---|---|---|---|---|
| Diffusion Policy / PushT | ⭐⭐ | 环境干净、数据自带 | ✅ 单卡即可 | 第 1 步(建立扩散直觉) |
| UniAD / nuScenes 推理 | ⭐⭐⭐ | mmdet3d 版本耦合 | ✅ 推理单卡 | 第 2 步(先推理不训练) |
| UniAD / nuScenes 两阶段训练 | ⭐⭐⭐⭐ | 50GB 显存、两阶段流程 | ❌ 需多卡 | 第 3 步(有多卡再做) |
| PLUTO / nuPlan 闭环 | ⭐⭐⭐⭐⭐ | nuplan-devkit + 闭环仿真 | ❌ 较吃资源 | 第 4 步(最后挑战) |
推荐路径的逻辑:先用 Diffusion Policy 在玩具任务上**把扩散去噪的全流程跑通、可视化**(最低成本建立直觉);再跑 UniAD 推理(不训练,体会端到端 query 流);想深入再做 UniAD 两阶段训练(需多卡);最后挑战 PLUTO 的 nuPlan 闭环(流程最复杂、最接近真实评估)。这条路径让你**每一步都站在上一步的直觉上**,而不是同时被算法、环境、数据三座大山压垮。这也呼应学习路径建议里的"动手"环节。
深入专题区(进阶选读)¶
这一区的定位与读法:到这里,本章的主线(七篇论文 + 设计空间 + 范式总结 + 复现指南)已经完整。下面是一组**进阶深入专题**——它们不在主线的因果链上,而是对主线中反复出现的关键问题做"打穿到底"的展开。每个专题独立成篇,可按需选读、不必顺序通读:
- 深入一·扩散推理加速:扩散派能否上车的命门(承接 Diffusion Policy/Planner 的"推理慢"局限)。
- 深入二·模仿学习两大病:分布偏移与因果混淆的机理(承接 PLUTO 的"闭环为何难")。
- 深入三·端到端为何难验证:贯穿全章的"安全债"的根源(承接"生成-验证"范式)。
- 深入四·BEV 表示 / 深入五·注意力统一:端到端栈的两块共同地基(承接 UniAD 的架构)。
- 深入六·评估基准演进 / 深入七·数据引擎:理解"SOTA 几分成色"与"端到端护城河"的两把尺子。
- 末附 批判性再审视(三篇核心论文的边界)、trick 锦集、方法分类学、前沿开放问题、论文到产品 gap——从"懂方法"上升到"会判断、知边界"。
主线读者读到此处已可收尾(跳至文末"本章小结"与"本章完结");想深入某个问题的读者,按上面索引直达对应专题即可。
深入一:扩散模型的推理加速(100 步 → 10 步)¶
Diffusion Policy 和 Diffusion Planner 反复提到的"推理慢"局限,值得单独讲透——它是扩散式规划能否上车的命门,也是大纲思考题的直接落点。
问题根源。 原始 DDPM 采样需要 \(K\approx 100\) 步去噪,每一步都是一次完整的网络前向。100 次前向意味着推理延迟是单次前向的 100 倍——对要求 10 Hz 以上的实时规划,这是致命的。加速的核心目标:用尽量少的去噪步,得到尽量接近的轨迹质量。
五条加速路线(按思路而非时间排列):
| 路线 | 核心思想 | 典型步数 | 代价 |
|---|---|---|---|
| DDIM | 把随机采样改成**确定性**采样,允许跳步(非马尔可夫) | ~10–50 | 几乎无损,最常用的第一招 |
| 高阶 ODE 求解器(DPM-Solver 类) | 把反向过程看成概率流 ODE,用高阶数值解法少步求解 | ~10–20 | 实现略复杂 |
| Consistency Models | 训练模型直接从任意噪声级别**一步**映射到干净样本 | 1–few | 需专门训练,质量略降 |
| Flow Matching / Rectified Flow | 学一条**尽量直**的概率流,直线少步即可 | few | 新范式,2024+ 在规划中兴起 |
| 渐进蒸馏(progressive distillation) | 把 \(N\) 步教师蒸馏成 \(N/2\) 步学生,反复折半 | 逐步减半 | 多轮蒸馏成本 |
本质洞察:DDPM 100 步慢,是因为它走了一条**弯曲**的概率流,必须小步逼近。加速的所有路线,本质上都是在回答同一个问题——能否把这条弯路改直,或者直接学一个"抄近道"的映射? DDIM 跳步、Consistency 一步到位、Flow Matching 学直线,是这个问题的三种答案。
对规划的意义。 实时规划倾向于 DDIM/少步 ODE(无需重训、几乎无损)作为第一选择;追求极致实时(高频控制)才上 Consistency/Flow Matching。这也是 Diffusion Planner 相比 Diffusion Policy 的关键工程升级——少步采样让扩散从机械臂的低频控制走向自驾的实时规划。
深入二:模仿学习的两大病——因果混淆与分布偏移¶
PLUTO 一节点出了闭环难的根因,这里把两大病的**机理**讲透——它们是一切模仿学习方法(不止自驾)的共同软肋。
病一:分布偏移(covariate shift)。 行为克隆(BC)在专家轨迹上训练,模型只见过"专家走过的状态"。但闭环中模型一旦有微小偏差,车就进入**专家从未到过的状态**,模型在这些状态上没被训练过、输出不可靠、偏差进一步放大——这是一个**正反馈的雪球**。
反事实:如果训练分布和测试分布完全一致(模型永远不偏离专家),BC 就没问题。病根恰恰是闭环让**测试分布由模型自己的行为决定**,从而偏离训练分布。DAgger 的解法是在线收集"模型偏离后专家如何纠正"的数据,把偏离状态补进训练集;PLUTO 的数据增强是它的**离线近似**——主动合成偏离状态 + 专家纠错目标。
病二:因果混淆(causal confusion)。 模型可能学到**伪相关**而非真因果。经典例子:模型发现"前车刹车灯亮"几乎总是伴随"自车刹车",于是学了"刹车灯→刹车"——但真因果是"前方有危险→刹车",刹车灯只是危险的一个伴随信号。
反直觉现象:因果混淆有个违反直觉的特性——给模型更多输入信息,可能让它表现更差。因为更多信息 = 更多潜在的捷径特征可学,模型更容易抓住一个伪相关而非费力学真因果。这与"信息越多越好"的直觉相反,是模仿学习研究里的重要发现。
两病与闭环的关系:分布偏移让误差累积,因果混淆让模型在情境变化时失效——闭环恰恰同时触发两者(车会偏离、情境会变)。这就是为什么"开环好闭环差"是模仿学习的常态,也是 PLUTO 的成绩为什么珍贵。
深入三:为什么端到端规划难以形式化验证¶
这是贯穿全章的"未还的债",也是端到端上路的最大障碍——值得专门交代清楚,它解释了为什么"生成-验证"安全外壳不是临时方案而是必需品。
经典栈为什么"可验证"。 Apollo 的 QP 速度规划(T1/T4)有显式的约束 \(a_{min}\le a\le a_{max}\)、ST 边界、碰撞约束——你可以**逐条检查**输出是否满足,甚至证明在某些假设下一定满足。规则和约束是人写的、可读的、可推理的。
神经网络为什么"难验证"。 一个端到端规划器是高维非线性的黑盒映射 \(f_\theta:\text{观测}\to\text{轨迹}\)。"对所有可能输入,输出都不撞"这种**全局性质**,无法通过测试穷举(输入空间无限),也极难形式化证明:
- 形式化验证工具(Reluplex / Marabou 等基于 SMT/MILP 的神经网络验证器)目前只能验证**小网络**的**局部**性质(如"输入在某邻域内,输出不超界"),面对 UniAD/扩散这种规模的网络无能为力。
- **可达性分析**对非线性网络 + 长时域轨迹,状态空间爆炸。
本质洞察:经典栈的安全性来自**约束是显式的、可检查的**;端到端的"安全性"藏在**百万参数的权重里,不可读、不可证**。这不是工程没做好,而是**方法层面的根本困难**——把决策逻辑从人写的规则换成学出来的权重,就同时换掉了"可验证性"。
务实替代(这就是为什么需要"生成-验证"):既然没法证明网络本身安全,工业界的答案是**不依赖网络的安全性**——在网络外面套一层可验证的外壳:
- 运行时监控(runtime monitoring):实时检查网络输出是否违反安全条件,违反就干预。
- 安全滤波 / 兜底(safety filter + fallback):就是 Autoware 那套——滤掉不安全候选,全滤掉就回退规则规划器。
- 可达性安全层 / 控制屏障函数(CBF):用显式的安全集约束最终输出(与不确定性/博弈专题相关)。
这就闭环回到了全章的统一范式:学习管创意,规则管底线。安全验证的未解,正是"生成-验证"成为务实标配的根本原因。
批判性再审视:三篇核心论文的边界¶
论文解读不止"讲清楚论文说了什么",更要"教你识别论文的边界"——哪些声称在什么前提下成立、哪些需要打折扣、实验有什么盲区。下面对三篇核心论文做批判性审视,每篇问四个问题:核心声称是什么 / 在什么前提下成立 / 哪里要打折扣 / 实验的盲区。
UniAD 的边界¶
- 核心声称:planning-oriented 的联合架构,每个上游任务都对规划有正贡献。
- 成立前提:在 nuScenes **开环**评估、多任务联合训练充分的前提下成立。
- 要打折扣的地方:⚠️ 这是本章最重要的批判——两篇后续工作把 nuScenes 开环规划基准的问题摆上了台面:AD-MLP(《Rethinking the Open-Loop Evaluation of End-to-End Autonomous Driving in nuScenes》)证明,一个**只吃自车历史状态、完全不看任何图像/激光**的纯 MLP,就能在 nuScenes 取得与感知系方法相当的规划成绩;BEV-Planner(Zhiqi Li 等,《Is Ego Status All You Need for Open-Loop End-to-End Autonomous Driving?》,CVPR 2024,arXiv:2312.03031)进一步分析指出,nuScenes 约 75% 是直线驾驶、corner case 严重不足,使得含 ego status(尤其自车速度)的端到端模型**过度依赖自车运动状态外推**、欠利用感知信息,且 L2 误差本身强烈受车速影响。这意味着 UniAD 在 nuScenes 上漂亮的规划 L2 与 0.31% 碰撞率,有多少来自真正的端到端感知-规划能力、有多少来自自车运动学惯性外推,是存疑的。
- 公正补充:这一批判针对的是**评估基准**而非 UniAD 的架构本身——UniAD 的 planning-oriented 思想价值不因基准缺陷而否定,但它在该基准上的**数字成色**需要打折。这也正是后续工作(含 UniAD 团队自己)转向 nuPlan/NAVSIM 闭环的直接原因。
- 实验盲区:缺乏闭环评估;消融证明"去掉某任务规划变差",但没有充分排除"变差是否只是训练不充分"的混淆。
教学价值:UniAD 是 Best Paper,但它的开环指标在后续被证明可能"虚高"。这教给你一个一般教训——评估基准的有效性本身需要被审视。一个方法在有缺陷的基准上 SOTA,不代表它真的解决了问题。这也正是 PLUTO 转向闭环的深层原因。
Diffusion Policy 的边界¶
- 核心声称:动作扩散天然多模态,在多个操作任务上大幅超越显式策略。
- 成立前提:在**真有多模态结构**的任务、且能接受多步推理延迟的前提下成立。
- 要打折扣的地方:"扩散一定比回归好"被夸大——单模态、低维、强实时任务上,扩散的多步推理拖慢系统却无收益(见 Diffusion Policy 陷阱 4)。论文的对比基线在多模态任务上吃亏,部分提升来自"任务恰好适合扩散"。
- 实验盲区:真机实验任务相对受控(桌面操作),未充分验证高动态、强接触、长时域任务;推理延迟对真实高频控制的影响讨论不足。
PLUTO 的边界¶
- 核心声称:纯模仿学习首次在 nuPlan 闭环超越规则派。
- 成立前提:在 nuPlan 特定 benchmark(如 Test14/Val14)、特定 reactive 设置下成立。
- 要打折扣的地方:① "超越规则派"的**结论强度取决于规则派基线的强度**——若对照的规则派不够强,结论会被高估;② 仍是模仿,天花板受专家数据质量与覆盖限制;③ nuPlan 的场景分布与真实长尾仍有差距。
- 实验盲区:泛化到 nuPlan 之外、真实路测长尾场景的能力未证;对极端罕见场景(专家从未演示)的表现是软肋。
三篇综合的批判性结论:这三篇都是各自方向的里程碑,但**没有一篇解决了"安全可证"和"长尾泛化"这两个根本问题**。它们推进的是"在特定基准上更好",而非"在开放世界可靠"。读前沿论文时,永远区分这两件事——基准上的 SOTA ≠ 真实世界的可用。
深入四:BEV 表示——端到端感知规划的共同地基¶
UniAD、VAD、Hydra-MDP 都建立在 BEV(Bird's-Eye-View,鸟瞰图) 表示之上。它是端到端栈的"地基",值得专门讲清。
什么是 BEV。 把多个相机的**透视图像**(每个相机看到一个视角)统一变换到一个**俯视的车体坐标系**——就像在车顶上空往下看的一张图。在这张俯视图上,每个像素对应地面上一个 \((x,y)\) 位置。
为什么端到端规划偏爱 BEV。 三个原因:
- 规划在 BEV 空间最自然:车在地面平面上运动,BEV 直接就是规划所需的 \((x,y)\) 平面,输出轨迹点天然落在 BEV 坐标里。
- 多传感器融合方便:相机、激光、毫米波都可以投影到同一个 BEV 网格,融合是"在同一张图上叠加"。
- 时序融合方便:历史帧的 BEV 用自车运动(ego-motion)warp 到当前帧坐标,就能对齐叠加——这正是 UniAD 陷阱 4 讲的对齐问题。
怎么从图像得到 BEV(两条主流路线)。
| 路线 | 思想 | 代表 |
|---|---|---|
| LSS(Lift-Splat-Shoot) | 给每个图像像素预测一个**深度分布**,把特征"提升"到 3D,再"拍扁"到 BEV 网格 | BEVDet 等 |
| BEVFormer(注意力) | 在 BEV 网格上放一组 BEV query,让它们通过**空间 cross-attention** 去图像里"采样"对应特征 | UniAD 用的就是这条 |
本质洞察:BEV 把"多个 2D 透视视角"的难题,转化为"一个统一的俯视场景表示"。它的代价是**高度信息被压缩**(俯视图丢了垂直维度细节)和**远处稀疏**(远处地面在图像里像素少,BEV 上分辨率低)。VAD 的矢量化某种程度上是对"密集 BEV 网格冗余"的回应——既然规划只需要少数实例,何必维护整张密集网格。
深入五:注意力机制如何统一了端到端规划¶
读完三篇核心论文,你会发现一个共同点——它们几乎都是 Transformer,都在用 attention。这不是巧合。这一节给一个统一视角:整个端到端规划栈,本质上是"一堆 query 在不同特征上做 attention"。
一种语言,三种用法。 attention 的 query/key/value 机制,在端到端栈里被复用为三种功能:
| 功能 | attention 形式 | 例子 |
|---|---|---|
| 信息提取 | query attend 特征图(cross-attn) | BEV query attend 图像(BEVFormer)、agent query attend BEV |
| 信息聚合/交互 | query 之间 attend(self-attn) | agent-agent 交互(MotionFormer)、agent token 交互(PLUTO) |
| 条件注入 | 生成 token attend 条件(cross-attn) | 扩散去噪 token attend 观测(Diffusion Policy Transformer 版) |
演进的一条线:
DETR:object query attend 图像 → "这里有什么目标"
▼
UniAD:track query(跟踪)/ motion query(预测)/ ego query(规划)
——每种 query 负责一个任务,在 BEV 和彼此间 attend
▼
PLUTO:agent / map / ego 都编码成 token,统一在 Transformer 里交互
▼
EMMA:连"token"都不自己设计了——直接用大语言模型的 token 空间
本质洞察:端到端规划从"为每个任务设计专用网络",收敛到"万物皆 token,交互皆 attention"。query 是"问题",key/value 是"知识库",attention 是"带着问题去知识库里检索并加权汇总"。理解了这个统一视角,你看任何一篇新的端到端规划论文,都能快速定位——它的 query 是什么、attend 什么、交互什么。这是读这个方向论文的"万能解码器"。
为什么是 Transformer:① attention 天然处理**变长输入**(agent 数量可变);② 天然建模**任意两个元素的关系**(agent 间交互、agent 与 map);③ query 接口天然支持"信息不压扁"(UniAD 的核心)。这三点恰好都是规划所需——所以 Transformer 成了端到端规划的通用骨架。代价是 \(O(N^2)\) 复杂度(UniAD 局限一、VAD 的优化对象)。
trick 锦集:本章值得偷师的工程技巧¶
论文解读教学的独特价值,在于揭示"论文理论"与"代码实现"之间的间隙——而 trick 就藏在这个间隙里。下面把全章散落的高价值 trick 集中归纳,每个按"动机→发现→原理→可迁移性"展开。这些技巧可迁移到你自己的任何学习式规控项目。
Trick 1:EMA 权重(扩散训练的稳定器)
- 动机:扩散训练 loss 在不同噪声级别间方差大,单步权重抖动剧烈。
- 发现:diffusion_policy 代码默认开 EMAModel(decay≈0.9999),论文几乎没强调。
- 原理:对训练轨迹上的权重做指数平滑,等价于隐式模型集成,抹平震荡。
- 可迁移性:所有扩散/生成模型训练、自监督学习(BYOL target network)通用。
Trick 2:BEV 时序对齐用 ego-motion warp - 动机:BEV 时序融合要把历史帧特征对齐到当前帧,否则运动物体"拖影"。 - 发现:BEVFormer/UniAD 代码用帧间相对位姿 warp 历史 BEV。 - 原理:历史 BEV 在历史车体系下,用 ego-motion(平移+旋转)变换到当前车体系才能叠加。 - 可迁移性:任何需要时序融合的 BEV/栅格表示(占据预测、地图构建)。
Trick 3:碰撞代价的软化(soft collision cost) - 动机:碰撞约束若是硬阈值,梯度不连续,轨迹优化抖动。 - 发现:UniAD 碰撞后优化把 occupancy 碰撞做成软代价(论文未细说)。 - 原理:用平滑函数(如指数/sigmoid)把"占据"软化为连续代价,梯度平滑可优化。 - 可迁移性:所有把约束转成可微代价的"投影"步骤(生成-投影模板)。
Trick 4:对比学习的温度系数 τ - 动机:对比 loss 中相似度的尺度影响正负样本的区分难度。 - 发现:PLUTO 的 CIL 用温度 τ 缩放余弦相似度(具体值需核实)。 - 原理:τ 小 → 放大相似度差异、聚焦难负样本;τ 大 → 平滑、训练更稳。 - 可迁移性:所有对比学习(SimCLR、InfoNCE 类)通用的关键超参。
Trick 5:少步采样(DDIM)的子序列选择 - 动机:DDPM 100 步太慢,要少步又不崩。 - 发现:DDIM 允许从 100 步里挑一个子序列(如 10 步)确定性采样。 - 原理:DDIM 的非马尔可夫确定性更新允许跳步,子序列均匀或按 SNR 选取。 - 可迁移性:所有扩散模型推理加速的第一招,几乎无损(深入一)。
Trick 6:数据增强合成偏离状态(DAgger 的离线近似) - 动机:模仿学习闭环漂移,因模型没见过偏离专家的状态。 - 发现:PLUTO 对自车初始状态做扰动(横移/转向/变速)增强。 - 原理:主动制造"偏离 + 专家纠错目标",等价于离线版 DAgger,让模型学会从偏离中恢复。 - 可迁移性:所有模仿学习(自驾、机械臂、导航)缓解分布偏移的通用手段。
共同主题:这 6 个 trick 里,没有一个是"算法创新",全是"让算法从论文上能跑变成实际能用"的工程智慧。论文不写它们(嫌琐碎),但它们决定复现成败。记住它们,比记住任何一个网络结构都更有迁移价值。
综合练习(跨论文)¶
前面每篇论文有自己的练习,这里是**跨论文**的综合题,检验你是否真的把整章串起来了。
-
(范式对比·必做) 用一段话解释:UniAD 的"碰撞后优化"、Diffusion Planner 的"去噪+约束投影"、Autoware 的"safety_filter",三者为什么是同一个"生成-验证"模板的不同形态?它们各自的"生成"和"验证"分别由什么承担?
-
(多模态溯源·必做) 本章有四种实现"多模态"的技术路线:扩散去噪(Diffusion Policy)、概率规划(VADv2)、候选集(Hydra-MDP)、大模型采样(EMMA)。请逐一说明每种的多模态"从哪来",并讨论:哪种最可控?哪种最灵活?哪种推理最快?
-
(开环-闭环·必做) UniAD 在 nuScenes 开环 SOTA,但后续工作批判该基准存在惯性外推问题;PLUTO 转向 nuPlan 闭环。请解释:为什么开环 L2 低不代表能开好?设计一个实验,验证"某模型的开环成绩有多少来自惯性外推"。(提示:参考 AD-MLP 的思路——只喂自车历史状态、不看感知。)
-
(迁移设计·选做) 把本章的方法迁移到 T5 的多智能体场景:用 Diffusion Planner 的联合去噪同时生成 N 个智能体的轨迹。相比 T5 的 CBS/ORCA,这种"生成式去冲突"有什么优势和风险?\(O(N^2)\) 的注意力如何 scale 到大规模集群?
-
(批判性思考·选做) 假设你是一家自驾公司的技术负责人,要在"UniAD 式端到端"和"经典栈 + 学习模块"之间做技术路线选择。结合本章的安全验证难题(深入三)和生成-验证范式,写出你的决策和理由。哪些场景你敢用纯端到端?哪些必须保留经典栈兜底?
参考思路要点(这些题没有唯一答案,下面给抓手而非标准答案):
- 生成 vs 验证拆解:三者的"生成"都是学习模型(UniAD 回归 / Diffusion 去噪 / Autoware 的 diffusion_planner),"验证"都是显式手段(占据碰撞代价 / classifier 引导 / 规则+碰撞滤波)。关键是看出"学习管多模态创意、显式管安全底线"这条共线。
- 四路多模态对比:可控性 Hydra(候选集可枚举)> VADv2(词表)> 扩散(随机但分布可学)> EMMA(最不可控);灵活性反过来 EMMA > 扩散 > VADv2 > Hydra;速度 VADv2/Hydra(一次前向)> 扩散(少步)> EMMA(自回归最慢)。
- 惯性外推实验:训练一个只吃自车历史状态、屏蔽所有感知输入的模型(即 AD-MLP/Ego-MLP),比较它与完整模型的开环 L2——差距越小,说明基准越被惯性主导。再在含 corner case 的闭环上对比,差距会拉开。
- 生成式去冲突的权衡:优势是一次生成所有 agent 的协调轨迹(隐式博弈、无需迭代约束);风险是无 CBS 那样的完备性/最优性保证、\(O(N^2)\) 注意力随集群规模爆炸。scale 思路:稀疏注意力、分组、或只对邻近 agent 联合。
- 路线决策抓手:结构化高速/物流园区(场景收敛、长尾少)可较激进用端到端;开放城区、长尾密集、安全要求极高的场景必须经典栈兜底。核心判据是"该场景的长尾风险能否被验证外壳兜住"——能则放开生成,不能则保守。
这 5 题刻意覆盖"范式共性、技术对比、实验设计、迁移、决策"五种思维。能把它们答顺,你对本章的掌握就从"知道每篇做什么"升级到了"会用这套框架思考新问题"。
附:一个 B 型精读示范——如何用三栏式 + 歧义审计读一篇论文¶
A 型练习是"跑通复现",B 型练习是"深度精读"。这里用 UniAD 的碰撞后优化为例,完整示范一次 B 型精读的思维流程,供你套用到任何论文。
第 0 步:先做歧义审计,定位"要重点读"的节。 通读论文方法节,对每个组件标清晰度。很快发现:BEV 编码、query 接口(SPECIFIED,论文讲得清)不必死磕;而**碰撞后优化(UNSPECIFIED——论文一笔带过)** 是必须去读代码的地方。歧义审计帮你把精力放在刀刃上。
第 1 步:论文原文——它到底说了什么。 回到论文,逐字读碰撞优化那几句。发现:论文只说"利用未来占据进行碰撞规避优化",没给迭代次数、没给步长、没给碰撞代价的形式。把这句原文摘出来,标注"信息严重不足"。
第 2 步:用人话重讲——补上论文跳过的直觉。 论文跳过了"为什么需要这一步"。自己补:纯学习回归的轨迹不保证不撞,所以要用一个显式的碰撞代价把轨迹"推"离障碍。这是"软学习先验 + 硬安全约束"的缝合。先把动机讲明白,再看代码怎么实现。
第 3 步:代码走读——挖出论文没给的一切。 去 planning_head 读碰撞优化的实现。重点找三样论文没给的东西:迭代次数 N_ITER、步长 LR、碰撞代价的具体形式(是硬阈值还是软化?)。每找到一个,记下 file:line 和数值,标注"论文未给,代码 line X 提取"。
第 4 步:差异分析——论文和代码一致吗? 对照论文公式(如果有)和代码计算。发现差异就判断:是代码修正了论文?论文简化了实现?还是 bug?比如发现碰撞代价做了软化(论文没提)——这是论文为简洁省略的工程细节,归 UNSPECIFIED。
第 5 步:提炼 trick + 科研启发。 碰撞后优化的"软化"和"可微投影"是可迁移的 trick(trick 3)。同时记录启发:能否用学习的安全头替代手工碰撞代价?(UniAD 科研启发表里就有这一条。)
这套五步流程(歧义审计→原文→人话→代码→差异→提炼)就是论文解读教学的"三栏式"在你脑子里的运行方式。 把它套到任何一篇前沿规划论文,你都能从"读不懂的公式化论文"里恢复出"完整可掌握的教学内容"——这正是本章 7 篇论文示范的方法本身。
深入六:评估基准的演进与陷阱¶
本章方法用了四套不同的评估体系(nuScenes / nuPlan / NAVSIM / CARLA),它们测的东西、含金量、陷阱各不相同。看不懂评估,就看不懂"谁真的更好"——这一节把它们讲清。
四套评估体系对照。
| 基准 | 类型 | 测什么 | 核心指标 | 主要陷阱 |
|---|---|---|---|---|
| nuScenes | 开环(真实数据回放) | 预测轨迹与 GT 的偏差 | 规划 L2、碰撞率 | 惯性外推泄漏——仅凭自车历史状态就能刷低 L2 |
| nuPlan | 闭环(数据驱动仿真) | 车真按输出走的综合表现 | 闭环得分(含进度/舒适/合规) | reactive/non-reactive 差异大;devkit 接口复杂 |
| NAVSIM | 伪闭环(非反应式) | 用真实数据近似闭环,避免完整仿真成本 | PDMS(多维度综合分) | 非反应式——背景车不对你反应,仍有简化 |
| CARLA | 全闭环(纯仿真) | 完全可控场景下的闭环驾驶 | 路线完成率、违规数 | sim2real gap——仿真表现不等于真实 |
演进的逻辑:越往后越真实,也越贵越难。
nuScenes 开环 —— 易用、便宜,但惯性外推让指标虚高(深入三/批判性再审视)
▼ 发现"开环不可信"
nuPlan 闭环 —— 让车真走,误差累积,更真实,但仿真成本高、接口复杂
▼ 完整闭环太贵
NAVSIM 伪闭环 —— 用真实数据近似闭环,平衡成本与真实性
▼ 想要完全可控 + 极端场景
CARLA 全仿真 —— 可造任意场景,但 sim2real gap
本质洞察:评估基准的演进,本质是领域在为"开环指标骗了我们"还债。nuScenes 开环的惯性外推问题暴露后,领域集体转向闭环(nuPlan)和伪闭环(NAVSIM)。选基准就是选你相信什么——要便宜易用用 nuScenes(但别尽信 L2),要真实可信用 nuPlan 闭环,要极端场景用 CARLA。读论文时第一件事是看它在哪个基准上、用什么指标——这决定了它的 SOTA 有几分成色。
深入七:端到端的数据引擎与 scaling¶
经典栈(T1–T4)的能力来自**工程师设计的代价函数和约束**;端到端/扩散方法的能力来自**数据**。这是一个根本的范式转移,也是端到端落地的隐形护城河——值得专门讲。
端到端方法吃数据,且性能随数据规模增长。 与经典栈"调参到位就封顶"不同,端到端方法的性能往往随训练数据量增长而持续提升(类似大语言模型的 scaling)。这意味着:
- 数据量是竞争力:谁有更多、更多样的驾驶数据,谁的端到端模型就更强。这是 Tesla、Waymo 等拥有海量车队数据的公司的核心优势——数据护城河。
- 长尾数据的价值:常见场景的数据边际价值递减,罕见场景(长尾)的数据最珍贵。一次罕见的危险切入、一个奇怪的路口,比一万次普通直行更有训练价值。
数据飞轮(data flywheel)。 端到端落地的关键机制:
模型部署越广 → 遇到的难例越多 → 数据越丰富 → 模型越强 → 部署更广。飞轮一旦转起来,数据优势自我放大——这是端到端相比经典栈的结构性优势。
本质洞察(端到端 vs 经典栈的最终分野):经典栈的改进靠**工程师的智慧**(设计更好的代价、约束、求解器),改进速度受限于人。端到端的改进靠**数据飞轮**(更多数据自动提升性能),改进速度受限于数据规模。长期看,数据飞轮可能跑赢人工调参——这正是产业界押注端到端的根本逻辑。但飞轮转起来之前,端到端的安全性、可验证性(深入三)仍是拦路虎,所以现阶段是"经典栈兜底 + 端到端逐步接管"的混合态。
端到端规划方法分类学¶
读完七篇论文,用一个系统分类把它们装进一张认知地图——这是认知工具 E(系统分类)的应用。按四个正交维度分类本章所有方法:
维度一:场景表示
维度二:学习信号(监督从哪来)
模仿专家 ── 人类驾驶轨迹(UniAD / PLUTO / VAD)
扩散去噪 ── 噪声→数据的去噪目标(Diffusion Policy / Planner)
多教师蒸馏 ── 多个 metric 教师评分(Hydra-MDP)
大模型微调 ── 预训练大模型 + 驾驶数据(EMMA)
对比辅助 ── 在模仿上加判别好坏(PLUTO 的 CIL)
维度三:输出形式
维度四:安全保证方式
学习先验 ── 全靠网络学(最弱,无方法纯靠它)
碰撞后优化 ── 学习 + 可微投影(UniAD)
外层安全滤波 ── 生成 + 显式验证兜底(Diffusion Planner + Autoware)
多约束蒸馏 ── 安全 metric 内生(Hydra-MDP)
这张分类地图怎么用:拿到任何一篇新论文,在四个维度上各定一个位——表示是密集还是稀疏?信号是模仿还是扩散还是蒸馏?输出单模态还是多模态?安全靠投影还是滤波?四个坐标一定,你就知道它在生态里的位置、和谁可比、创新点在哪。分类学是读论文的"坐标系"。
前沿与开放问题¶
本章方法虽是 2024–2026 的前沿,但远未"解决"自动驾驶规划。以下 8 个开放问题,是这个方向最值得投入的研究空间——每个给出**现状 → 为什么难 → 可能方向**。
1. 安全验证(最核心、最难) - 现状:神经网络规划器无法形式化证明"绝不撞"(深入三);务实方案是外层安全滤波兜底。 - 为什么难:高维非线性黑盒,输入空间无限,全局性质不可穷举、难证明。 - 可能方向:运行时监控 + 控制屏障函数(CBF)安全层;可达性安全包络;把安全约束做进生成过程(约束引导去噪)。这与不确定性规划专题深度相关。
2. 长尾泛化 - 现状:方法在常见场景表现好,罕见场景(专家没演示过的)是软肋。 - 为什么难:长尾数据稀缺,模型对未见分布外推不可靠。 - 可能方向:数据飞轮挖掘难例(深入七);大模型的常识泛化(EMMA 路线);仿真生成极端场景。
3. 闭环训练(不只是闭环评估) - 现状:本章方法几乎都是**开环训练、闭环评估**——训练时用专家轨迹监督,不在闭环里训练。 - 为什么难:闭环训练需要可微仿真器或 RL,前者难造、后者样本效率低且不稳。 - 可能方向:可微闭环仿真;离线 RL;PLUTO 的数据增强是"离线近似闭环"的一种妥协,但不是真闭环训练。
4. 可解释性 - 现状:端到端决策是黑盒;UniAD 的中间任务监督提供了部分可解释性,纯生成/大模型更不透明。 - 为什么难:决策逻辑藏在权重里,不可读。 - 可能方向:EMMA 输出推理链是一种新形态;注意力可视化;中间表示的语义对齐。
5. 实时性 - 现状:扩散多步推理慢、大模型推理更慢,与高频规划矛盾。 - 为什么难:表达力/质量与速度的根本权衡。 - 可能方向:扩散加速(深入一,DDIM/Consistency/Flow Matching);大模型蒸馏/量化;分层(大模型低频决策 + 轻量高频执行)。
6. 多模态评估 - 现状:怎么评价一个多模态规划器的好坏?单条 L2 不够——它只测一个模式。 - 为什么难:要同时衡量**采样质量**(每条都合理)、多样性(覆盖不同模式)、覆盖(包含真实模式),缺乏公认指标。 - 可能方向:min-over-K 指标、分布距离度量、模式覆盖率——这是扩散式规划评估的开放难题。
7. 仿真到现实(sim2real) - 现状:CARLA 等仿真训练/评估与真实道路有 gap。 - 为什么难:仿真的传感器噪声、动力学、交通行为与真实不同。 - 可能方向:域随机化、真实数据驱动仿真(nuPlan/NAVSIM 思路)、混合训练。
8. 端到端与模块化的最终边界 - 现状:混合态——端到端生成 + 经典栈验证兜底(生成-验证)。 - 为什么难:纯端到端的安全性/可验证性未解,纯模块化的信息瓶颈/目标割裂也在。 - 可能方向:这可能不是"谁取代谁",而是**边界的动态移动**——随着数据飞轮和安全验证技术进步,端到端逐步接管更多,经典栈退守到安全兜底。最终形态仍是开放问题。
选题建议:8 个问题里,安全验证(1)和闭环训练(3) 是最硬核、最有结构性价值的方向;多模态评估(6) 是相对小切口但被忽视、容易出成果的方向;长尾泛化(2)和实时性(5) 是产业界最关心、最易验证价值的方向。
学习路径建议与常见学习误区¶
推荐学习顺序(不是按本章行文顺序,而是按认知难度):
第 1 步:Diffusion Policy 的扩散数学(核心 B)
—— 先在最干净的设定(机械臂、无复杂场景)里理解"去噪生成"
▼
第 2 步:UniAD 的端到端架构(核心 A)
—— 理解 query 接口、planning-oriented、BEV(深入四)、注意力(深入五)
▼
第 3 步:PLUTO 的闭环与模仿学习两大病(核心 C + 深入二)
—— 理解为什么闭环难,这是评估一切方法的标尺
▼
第 4 步:设计空间 + 范式总结 + 安全验证(深入三)
—— 从"懂方法"上升到"会选型、知边界"
▼
第 5 步:动手——三个 A 型复现(PushT → UniAD 推理 → PLUTO 闭环)
—— 在复现中亲历歧义审计表里的所有坑
五个常见学习误区:
| 误区 | 后果 | 纠正 |
|---|---|---|
| 只读论文不读代码 | 错过 trick 锦集里的全部工程智慧(这才是论文解读的独特价值) | 核心论文必读代码,对照歧义审计表 |
| 跳过扩散数学,只记"扩散=生成" | 遇到 prediction_type/schedule 问题完全无从下手 | 推导一遍前向/反向/训练目标(核心 B) |
| 信开环指标,忽视闭环 | 误判方法成熟度,做出错误技术选型 | 永远以闭环为准(深入三、批判性再审视) |
| 以为端到端已成熟可量产 | 低估安全验证、长尾、实时性的难度 | 理解 8 个开放问题,尤其安全验证 |
| 把七篇论文当孤立知识点背 | 抓不住技术演进的逻辑 | 沿"局限→下一篇动机"的因果链理解(技术树全景) |
从论文到产品:工业落地的 gap¶
本章方法在 benchmark 上 SOTA,但**至今没有大规模纯端到端量产**(除少数如 Tesla FSD 的部分端到端)。论文与产品之间隔着一道宽阔的 gap,理解它能让你对方法成熟度有清醒判断:
| gap 维度 | 论文世界 | 产品世界 |
|---|---|---|
| 场景 | benchmark 的有限场景 | 真实道路的无限长尾 |
| 安全 | 碰撞率指标 | 必须接近零事故 + 可追责 + 可验证 |
| 实时 | 离线评估可慢 | 必须 10Hz+ 实时、车规级算力 |
| 数据 | 固定数据集 | 数据飞轮持续运转 |
| 法规 | 无约束 | 必须满足法规、可解释、可审计 |
| 兜底 | 假设方法 work | 必须有失效兜底(生成-验证) |
清醒的判断:本章七篇论文是**优秀的研究**,推进了"在基准上更好";但"在基准上 SOTA"与"在真实世界可靠量产"之间,隔着安全验证、长尾、实时、法规这四道难关(前沿问题 1/2/5 + 法规)。这就是为什么产业界现阶段普遍采用**混合方案**——用端到端/扩散做生成引擎,用经典栈 + 安全滤波做可验证的兜底外壳。学习管创意,规则管底线——这句贯穿全章的话,正是论文与产品之间那道 gap 的当前解。
收尾区(主线在此汇合)¶
深入专题区到此结束。无论你是一路精读下来、还是从主线直接跳转到此,下面的收尾区都是**所有读者的共同终点**:先用"常见误解汇总"扫雷,再用"本章小结"的术语表与知识点总表做体系化回顾,然后是"歧义审计汇总"(复现避坑总清单)、"延伸阅读"(继续深造的地图)、"本章与后续章节的关系"(在课程图谱中定位)、"故障排查手册"(动手时的急救包),最后以"一页纸速查"和"本章完结"收束。
本章常见误解汇总¶
| 常见误解 | 正确理解 |
|---|---|
| 端到端 = 一个黑盒网络从像素直接到控制 | UniAD 保留了检测/跟踪/建图等**中间任务监督**,是"模块化但梯度贯通",并非无中间表示的黑盒 |
| 下游模块吃的是检测框 | 吃的是 query(高维实例表示),检测框只用于算 loss、不下传——信息不被压扁 |
| 扩散模型一定比回归好 | 只有**真有多模态结构**的任务才划算;单模态/强实时场景,回归或单步生成可能更优(代价是扩散推理慢) |
| 去噪步 \(k\) 就是动作/轨迹的时间步 \(t\) | 两个完全不同的维度:上标 \(k\)=去噪迭代步(标量条件),下标 \(t\)=轨迹内的时间索引(序列维度) |
| 开环 L2 低 = 能上路 | 闭环才算数;开环不累积误差,闭环累积。且即便闭环好,神经网络仍**无形式化安全保证** |
| 扩散生成的轨迹天然安全 | 扩散**不保证**动力学/碰撞约束,必须配"去噪+投影"或外层安全滤波 |
| 多模态靠堆多个输出头 | 扩散靠**随机噪声起点**天然多模态、概率规划(VADv2)靠输出**分布**、Hydra 靠候选集——机制各不同 |
| PLUTO 超越规则派靠强化学习 | PLUTO 是**纯模仿 + 对比学习 + 数据增强**,不用 RL、不用在线交互 |
| 大模型驾驶(EMMA)已经成熟可落地 | 是前沿探索,**实时性、成本、幻觉/可靠性**都未解决,研究价值大于落地价值 |
| safety_filter 越严越安全 | 太严会滤掉绝大多数候选、频繁回退规则规划器,学习模块形同虚设——松紧需权衡 |
本章小结¶
学完自检(与开篇前置自测呼应)¶
读完全章,回头检验你是否真的拿下了核心——下面 7 题对应"本章目标"的 7 条,答得上才算学透:
- 端到端相对模块化栈的**两个根本动机**是什么?为什么所有方法都**天然时空联合**?(→ 背景与动机)
- UniAD 的下游模块吃的是 query 还是检测框?**碰撞后优化**为什么是关键 trick?两阶段训练为什么不能跳?(→ 核心 A + 组件⑦)
- 默写扩散的**前向加噪闭式**与**训练目标**;解释多模态为何源于随机起点;说清**预测噪声与学 score 的等价**。(→ 核心 B + 组件②补充)
- 开环与闭环的**本质区别**?PLUTO 的三件套各自如何缩小开环-闭环鸿沟?(→ 核心 C)
- 在 7 个方法里,要"快""稳上闭环""多模态""可解释中间表示"分别选谁?(→ 设计空间全景)
- 端到端规划的**核心未解难题**是什么?为什么"生成-验证"是当前务实答案、且工业即便用强生成器也不撤兜底?(→ 深入三 + 安全过滤)
- 给你一篇没读过的前沿规划论文,你能用**三栏式 + 歧义审计 + 研究视角**把它拆解吗?(→ B 型精读示范)
若 1/3/4/6 答不顺,回对应节再过一遍——它们是本章的"承重墙"。2/5/7 是应用题,答不全可在做练习与复现时补齐。
术语速查表¶
| 术语(中/英) | 一句话定义 |
|---|---|
| planning-oriented | UniAD 的架构哲学:让所有中间任务都服务于规划这一最终目标 |
| query 接口 | 用高维可学习向量在模块间传递实例信息,替代"压扁"的检测框 |
| BEVFormer | 用时空注意力把多视角图像聚合到 BEV 特征的编码器 |
| TrackFormer / MotionFormer / OccFormer | UniAD 中分别做检测跟踪 / 运动预测 / 占据预测的模块 |
| occupancy(占据) | 未来时刻空间被占用的栅格表示,UniAD 用它做碰撞后优化 |
| DDPM | 去噪扩散概率模型:前向加噪 + 反向去噪学噪声 |
| 前向 / 反向过程 | 前向:给数据逐步加噪至纯噪声;反向:学网络逐步去噪 |
| 去噪步 \(k\) | 扩散的迭代步(0–K),区别于轨迹内的时间步 \(t\) |
| receding horizon | 预测一段、执行一截、滚动重规划(同 MPC 滚动时域) |
| FiLM / cross-attention | 把观测条件注入去噪网络的两种方式(CNN 版 / Transformer 版) |
| 开环 / 闭环评估 | 开环用真实历史回放不累积误差;闭环让输出反馈成输入、误差累积 |
| 因果混淆 | 模型学到伪相关(刹车灯→刹车)而非真因果 |
| 分布偏移 | 训练分布(专家)与测试分布(模型自造状态)不一致,致误差雪球 |
| 对比模仿学习 CIL | 在模仿基础上造负样本 + 对比 loss,教模型识别好坏轨迹 |
| 纵横感知(lon-lat aware) | 对轨迹的纵向(快慢)与横向(左右)分量分别建模 |
| 多教师知识蒸馏 | Hydra-MDP:多个 metric 教师分别指导学生不同评估维度 |
| 联合去噪 | Diffusion Planner:对自车 + 他车轨迹一起去噪,时空+博弈联合 |
| 生成-验证 / 生成-投影 | 学习模型生成候选 + 显式规则/优化验证兜底的通用安全模板 |
| 安全滤波(safety filter) | 对候选轨迹做碰撞/可行性检查,滤掉不安全的,全滤则回退规则 |
| MLLM 驾驶 | EMMA:用多模态大语言模型直接输出规划轨迹 |
| score 函数 | \(\nabla_\tau\log p(\tau)\),对数概率的梯度;扩散里"预测噪声 \(\epsilon\)"与"预测 score"等价(差一个系数) |
| classifier guidance | 在 score 上叠加约束/条件的梯度,引导生成偏向某目标;Diffusion Planner 的 flexible guidance 机制 |
| DiT(Diffusion Transformer) | 用 Transformer 做去噪骨干的扩散架构,Diffusion Planner 采用 |
| 概率流 ODE | 由 score 导出的确定性反向过程,少步数值求解即可采样(DDIM/DPM-Solver 的根基) |
| 两阶段训练 | UniAD 先训感知(track+map 6ep)再端到端联合全模块(20ep),更稳更省显存 |
| 歧义审计四级 | SPECIFIED / PARTIAL / UNSPECIFIED / CONFLICT,标注论文-代码清晰度 |
知识点总表¶
| 编号 | 知识点 | 核心要点 | 对应节 | 难度 |
|---|---|---|---|---|
| 6.1 | 端到端的动机 | 信息瓶颈 + 目标不一致;天然时空联合,绕过 PVD | 背景 | ⭐⭐ |
| 6.2 | UniAD planning-oriented | query 贯通、梯度反传感知、碰撞后优化 | 核心 A | ⭐⭐⭐ |
| 6.3 | query 接口 | 高维实例表示替代检测框,信息不压扁 | 核心 A | ⭐⭐⭐ |
| 6.4 | 扩散前向/反向 | 加噪闭式 + 学去噪;多模态源于随机起点 | 核心 B | ⭐⭐⭐ |
| 6.5 | 去噪步 vs 时间步 | 两个维度,最易混淆 | 核心 B | ⭐⭐ |
| 6.6 | receding horizon | 预测-执行-滚动,同 MPC | 核心 B | ⭐⭐ |
| 6.7 | 闭环为何难 | 误差累积 + 分布偏移 + 因果混淆 | 核心 C | ⭐⭐⭐ |
| 6.8 | 对比模仿学习 | 造负样本教模型识别好坏,缩小开环-闭环鸿沟 | 核心 C | ⭐⭐⭐ |
| 6.9 | 矢量化 | VAD 用稀疏矢量替代密集 BEV,提速 | 非核心 | ⭐⭐ |
| 6.10 | 多教师蒸馏 | Hydra 多 metric 教师突破单一专家天花板 | 非核心 | ⭐⭐ |
| 6.11 | 联合去噪 | Diffusion Planner 自车+他车一起去噪 | 非核心 | ⭐⭐⭐ |
| 6.12 | 大模型驾驶 | EMMA 用 MLLM 常识应对长尾 | 非核心 | ⭐⭐ |
| 6.13 | 扩散加速 | DDIM/Consistency/Flow,100→10 步 | 深入一 | ⭐⭐⭐ |
| 6.14 | 安全验证难题 | 神经网络不可形式化验证,故需生成-验证外壳 | 深入三 | ⭐⭐⭐⭐ |
| 6.15 | 生成-验证范式 | 学习管创意、规则管底线,全章统一模板 | 安全/范式 | ⭐⭐⭐ |
| 6.16 | 噪声-score 等价 | 预测 \(\epsilon\) ≡ 学 score,打通 DDPM/score/guidance | 核心 B 组件②补充 | ⭐⭐⭐⭐ |
| 6.17 | UniAD 两阶段训练 | 先感知后端到端,解 CONFLICT、定复现成败 | 核心 A 组件⑦ | ⭐⭐⭐ |
| 6.18 | 两栈同构 | 端到端/扩散仅"生成"一环不同,编码与验证两环同构 | 范式总结 | ⭐⭐⭐ |
歧义审计汇总表¶
下表汇总全章在三篇核心论文中标注的所有审计项——即"别尽信论文、要去读代码"的清单。每项都在正文对应段落有展开(见"正文位置"列)。本轮已通过联网核实把其中一项(UniAD occ-planner 联合训练)从 CONFLICT? 升级为 SPECIFIED;其余 PARTIAL/UNSPECIFIED 项的精确数值仍需 clone 源码逐行确认,复现时以实际仓库为准。
| 论文 | 审计项 | 级别 | 论文怎么说 | 代码/真相(需核实) | 正文位置 | 复现建议 |
|---|---|---|---|---|---|---|
| UniAD | 碰撞后优化迭代步数 N_ITER、步长 LR |
UNSPECIFIED | 未给出 | 代码常数 | 核心 A 组件⑥ | 从 planning_head 提取,做敏感性实验 |
| UniAD | 碰撞代价的具体形式(occupancy 阈值/软化) | PARTIAL | 一笔带过 | 代码逻辑 | 核心 A 组件⑥ | 太硬轨迹抖、太软推不开,重点调 |
| UniAD | occupancy 与 planner 是否端到端联合训练 | ✅已解决→SPECIFIED | 含糊 | 已核实:Stage 2 全模块联合训练 | 核心 A 组件⑦ | 走完两阶段、Stage 1 权重初始化 Stage 2 |
| UniAD | track query 跨帧传播细节 | PARTIAL | 描述性 | 需读 track_head |
映射表 | 端到端跟踪的关键,细读源码 |
| UniAD | MotionFormer 三类交互的具体掩码 | PARTIAL | 概念性 | 需读 motion_head |
映射表 | 注意力掩码影响交互建模 |
| Diffusion Policy | 去噪网络预测目标(ε / sample) | CONFLICT? | 多种参数化 | 看 prediction_type |
陷阱 1 | 训练目标与采样更新式必须配套 |
| Diffusion Policy | 执行步数 \(T_a\) | UNSPECIFIED | 图示 | 代码/config | 组件③ | \(T_a\) 太大反应慢、太小丢一致性 |
| Diffusion Policy | 噪声 schedule 选择 | PARTIAL | 附录 | noise_scheduler |
论文没告诉你的 | 训练/推理 schedule 必须一致 |
| Diffusion Policy | EMA decay 系数 | PARTIAL | 提及但易忽视 | 代码默认 ≈0.9999 | 论文没告诉你的 | 推理必须用 EMA 权重 |
| PLUTO | 负样本如何生成(扰动类型/幅度) | PARTIAL | 描述性 | 需读 contrastive 模块 | 论文没告诉你的 | 负样本质量决定 CIL 成败 |
| PLUTO | 数据增强的扰动幅度分布 | PARTIAL | 提及 | 代码/config | 论文没告诉你的 | 太小没效果、太大引入不现实状态 |
| PLUTO | 对比 loss 权重 λ 与温度 τ | PARTIAL | 给范围 | 代码具体值 | 组件② | 平衡模仿与判别,调参敏感 |
| PLUTO | nuPlan 闭环 reactive/non-reactive 设置 | PARTIAL | 实验节 | 评估脚本 | 论文没告诉你的 | 背景车是否反应,难度差异大 |
怎么用这张表复现:拿任意一篇核心论文动手前,先看它在表里的行——标 UNSPECIFIED 的,论文里找不到、只能从代码挖;标 PARTIAL 的,论文给了方向但数值要从 config 抠;标 CONFLICT? 的,论文和代码可能不一致、必须亲自核对。把这些项一一落实,复现成功率会高得多。
延伸阅读¶
按"前置(先读)/ 后续(再读)/ 工具与 benchmark"三类组织,标注难度(⭐ 入门 ~ ⭐⭐⭐⭐ 进阶)。
怎么用这份书单:不必全读。**复现导向**的读者,前置只需补 DDPM + DETR + 你要复现那篇的直接前作,其余用到再查;**研究导向**的读者,建议把"评估批判"三篇先读透——它们能让你对任何 SOTA 数字保持清醒,是进入这个方向最该先建立的判断力。前置论文是"读本章的地基",后续工作是"离开本章的路标",评估批判是"识别真假 SOTA 的尺子",按你的目标取用。
前置论文(理解本章的基础,建议先读)¶
| 论文 | 与本章的关系 | 难度 |
|---|---|---|
| DETR(Carion et al., ECCV 2020) | object query 的起源——UniAD/PLUTO 的 query 接口都源于此 | ⭐⭐⭐ |
| BEVFormer(Li et al., ECCV 2022) | UniAD 的 BEV 编码骨架,时空注意力聚合多视角 | ⭐⭐⭐ |
| DDPM(Ho et al., NeurIPS 2020) | 扩散模型的奠基,Diffusion Policy 的数学基础 | ⭐⭐⭐ |
| Score-based SDE(Song et al., ICLR 2021) | score 视角的扩散,打通"预测噪声≡学 score"(组件②补充) | ⭐⭐⭐⭐ |
| DDIM / DPM-Solver(Song'21 / Lu'22) | 少步采样加速的根基(深入一) | ⭐⭐⭐⭐ |
| Diffuser(Janner et al., ICML 2022) | 扩散用于规划/轨迹的源头,Diffusion Policy 的近亲(本章🔹前驱) | ⭐⭐⭐ |
| FiLM(Perez et al., AAAI 2018) | 特征仿射调制,Diffusion Policy CNN 版的条件注入方式(组件②) | ⭐⭐ |
| InfoNCE / SimCLR(Oord'18 / Chen'20) | 对比学习与温度系数,PLUTO 的 CIL 数学基础(组件②) | ⭐⭐⭐ |
| ChauffeurNet(Bansal et al., RSS 2019) | 模仿学习驾驶的开端(G1),UniAD 要超越的对象 | ⭐⭐ |
| DAgger(Ross et al., AISTATS 2011) | 分布偏移的经典解法,PLUTO 数据增强的思想源(深入二) | ⭐⭐⭐ |
后续工作(看完本章再读,追踪前沿)¶
| 论文/方向 | 在本章基础上做了什么 | 难度 |
|---|---|---|
| VADv2 / GenAD / SparseDrive | 矢量化端到端的后续,效率与性能进一步优化 | ⭐⭐⭐ |
| DriveVLM / LMDrive / OpenEMMA | 大模型驾驶(G6)的更多探索与开源复现 | ⭐⭐⭐⭐ |
| Consistency Models / Rectified Flow | 扩散加速的前沿(深入一的延伸),few-step 生成 | ⭐⭐⭐⭐ |
| Diffusion Planner(Zheng et al., ICLR 2025 Oral, arXiv:2501.15564) | 自驾扩散的联合去噪 + flexible classifier guidance,已在本章非核心群详述 | ⭐⭐⭐⭐ |
| 闭环模仿学习后续(PlanTF / PLUTO 系) | PlanTF(Cheng et al.,《Rethinking Imitation-based Planner》)揭示 nuPlan 上的 shortcut learning 与 imitation gap,是 PLUTO 的前作与基线 | ⭐⭐⭐ |
评估批判(理解"SOTA 几分成色"必读)¶
| 论文 | 核心论点 | 难度 |
|---|---|---|
| BEV-Planner:《Is Ego Status All You Need for Open-Loop End-to-End Autonomous Driving?》(Zhiqi Li et al., 南大+NVIDIA, CVPR 2024, arXiv:2312.03031) | nuScenes ~75% 直线、ego status 主导,开环 L2 指标被自车运动外推"污染" | ⭐⭐⭐ |
| AD-MLP:《Rethinking the Open-Loop Evaluation of End-to-End Autonomous Driving in nuScenes》 | 纯 MLP 只吃自车状态、不看感知即可媲美感知系方法,坐实开环基准缺陷 | ⭐⭐⭐ |
| PDM:《Parting with Misconceptions about Learning-based Vehicle Motion Planning》(Dauner et al., CoRL 2023) | nuPlan 上最强规则/混合基线(PLUTO/Diffusion Planner 要超越的对象),闭环 CLS≈92 | ⭐⭐⭐ |
工具与 Benchmark(动手必备)¶
| 名称 | 用途 | 难度 |
|---|---|---|
| nuScenes | UniAD/VAD 的开环评估数据集 | ⭐⭐ |
| nuPlan | PLUTO/Diffusion Planner 的闭环评估平台(含 devkit) | ⭐⭐⭐⭐ |
| NAVSIM | Hydra-MDP 的评估 benchmark,非反应式闭环 | ⭐⭐⭐ |
| diffusers(HuggingFace) | 扩散模型的标准库,调度器/采样器现成 | ⭐⭐ |
| mmdetection3d | UniAD 的依赖框架(版本强耦合,注意坑) | ⭐⭐⭐ |
工具选择对应你的复现目标:先用 diffusers + nuScenes 入门(成本最低),要做真实闭环再上 nuPlan(含 devkit,门槛最高)。这条由易到难的工具路径,与前面"复现难度对照"推荐的论文复现顺序一致。
本章与后续章节的关系¶
T6 是"时空联合规划"专题的**收官章**。它在整个专题与相邻专题中的位置:
回望本专题(T1→T6 的完整弧线)。 这条线讲的是同一个问题——"空间和时间如何联合决策"——在三种范式下的演进:
T1-T3 经典优化与搜索:人手设计代价/约束/求解器
T1 Frenet/ST 图(解耦基线)→ T2 时空走廊(第一步联合)→ T3 连续优化(时间作变量)
T4-T5 工业落地与多智能体:
T4 Apollo/Autoware(工业取舍)→ T5 MAPF(多智能体时空去冲突)
T6 学习生成:让网络从数据学时空轨迹
绕过 PVD,直接产 (x(t),y(t)),但留下安全验证债 → 生成-验证
本章没有取代前五章,而是与它们形成"生成-验证"的互补。 这是最重要的收尾认知:T6 的学习方法负责"生成高质量、多模态的候选",但**它无法形式化保证安全**(深入三);而 T3 的优化、T4 的工业约束、T1 的 ST 图碰撞检测,恰恰是"验证与兜底"的可靠工具。学习不是经典栈的掘墓人,而是它的上游创意引擎——Autoware 的 diffusion_planner + safety_filter 架构就是 T6(生成)+ T1/T3/T4(验证)的字面拼装。
通向相邻横切专题。 据总论,时空联合规划是横切专题三,与另外两个专题深度交织:
| 相邻专题 | 与 T6 的连接点 | 具体桥梁 |
|---|---|---|
| 专题二·博弈规划(他人是有目标的决策者) | Diffusion Planner 的**联合去噪**(自车+他车一起生成)本质是一种隐式博弈;UniAD 的 MotionFormer **agent-agent 交互**是交互建模的起点 | 联合去噪 → 显式博弈求解;交互注意力 → 博弈均衡 |
| 专题一·不确定性规划(模型/感知不确定性) | 扩散的**多模态输出**是对"未来不确定"的一种生成式表示;安全验证难题指向**鲁棒性与运行时保证** | 多模态分布 → 不确定性量化;安全滤波 → 鲁棒/CBF 安全层 |
一句话定位:学完 T6,你掌握了时空规划的"学习生成"范式,并理解了它与经典栈的互补边界。下一步若想让"他车预测"从交互建模升级为真正的博弈求解,进入**博弈规划**;若想把"多模态"从生成升级为严格的不确定性量化与安全保证,进入**不确定性规划**。三个横切专题在"动态交互环境下的决策"这一点上最终汇合。
前置技能在本章的回收。 呼应总论"SLAM → 时空联合规划技能迁移表",看看你的老本行在本章哪里派上用场:
| 你已有的技能(来自 SLAM / 前置方向) | 在本章 T6 的落点 |
|---|---|
| A*/图搜索、QP/NLP 优化 | 安全验证外壳里的 trajectory_optimizer / 碰撞后优化(生成-验证的"验证"半边) |
| 因子图 / 概率推理 | 理解扩散的概率建模、score 函数、多模态分布 |
| ROS2 / 工程框架 | Autoware 安全架构、nuplan-devkit 闭环接口 |
| Frenet \((s,l)\) 解耦(T1) | PLUTO 的纵横感知(用网络结构解耦语义,与坐标解耦同源) |
| MPC 滚动时域(T3/T4) | Diffusion Policy 的 receding-horizon 执行 |
| 多智能体去冲突(T5) | Diffusion Planner 的联合去噪、UniAD 的 agent 交互 |
这张表的意思是:T6 的"学习生成"不是要你丢掉前面的功夫,而是给你的经典工具箱接上一个更强的"创意前端"。你在 SLAM 和 T1–T5 积累的搜索、优化、概率、工程能力,恰好是给学习式规划器做"验证与兜底"所需的全部——这也是为什么读完本章你不是"换了一套技术栈",而是"在原有栈上长出了新的一层"。
🔧 故障排查手册¶
复现本章方法时最容易遇到的 6 类故障。每条给出**症状 → 可能原因(按概率排序)→ 排查步骤 → 解决**。
故障 1:扩散推理输出轨迹发散 / 乱码¶
- 症状:Diffusion Policy/Planner 推理出的轨迹是噪声、不收敛,或明显不合理。
- 可能原因:① 推理用了非 EMA 权重;② 训练/推理噪声 schedule 不一致;③
prediction_type(预测 ε vs sample)与采样更新式不匹配;④ DDIM 子序列设置错误。 - 排查步骤:先确认加载的是 EMA 权重 → 打印训练与推理的 schedule 比对 → 检查
noise_scheduler.prediction_type与step()是否配套 → 可视化逐步去噪过程,看是哪一步开始发散。 - 解决:强制 EMA 权重推理;训练/推理 schedule 严格一致;参数化与更新式同步(见 Diffusion Policy 陷阱 1、3)。
故障 2:UniAD 复现精度远低于论文¶
- 症状:跑通了但规划 L2 / 检测 mAP 明显差于论文报告。
- 可能原因:① mmcv/mmdet/mmdet3d 版本不匹配(最高频);② 碰撞后优化参数没对(
N_ITER/LRUNSPECIFIED);③ BEV 时序融合的自车位姿对齐错误;④ 预训练权重/数据预处理与官方不一致。 - 排查步骤:先严格核对三件套版本(按 README 锁版本)→ 用静止场景验证 BEV 历史特征对齐是否重合 → 从源码提取碰撞优化超参 → 对比数据预处理 pipeline。
- 解决:锁定依赖版本是第一要务;BEV 对齐用 ego-motion 正确 warp(见 UniAD 陷阱 4);碰撞优化参数从代码提取(见 UniAD 陷阱 2)。
故障 3:PLUTO 闭环漂移 / 压线急刹¶
- 症状:开环 L2 正常,但 nuPlan 闭环里车漂移、压线、频繁急刹。
- 可能原因:① 数据增强没开或幅度不对;② 对比学习负样本质量差,CIL 没起作用;③ 坐标系(global/ego)转换错误;④ reactive 设置下背景车交互让分布偏移更严重。
- 排查步骤:确认数据增强生效(看训练日志)→ 检查负样本是否"像样但确实坏" → 用直行场景验证坐标转换 → 对比 reactive/non-reactive 下的表现差异。
- 解决:开启并调好数据增强;从代码核对负样本构造(见 PLUTO 陷阱 2);严格按接口约定转坐标(见 PLUTO 陷阱 4)。切记:开环正常不代表闭环正常(陷阱 1)。
故障 4:nuPlan / nuplan-devkit 接口报错或仿真失败¶
- 症状:闭环仿真启动失败、轨迹方向错乱、时间戳报错、地图 API 调用异常。
- 可能原因:① nuplan-devkit 版本与 PLUTO 期望不符;② observation/trajectory 的坐标系或时间约定理解错;③ 地图数据路径/格式问题;④ 仿真配置(场景过滤、metric)设置错。
- 排查步骤:核对 devkit 版本 → 阅读
pluto_planner的接口约定 → 用最简单的直行场景跑通最小闭环 → 逐步加复杂度。 - 解决:锁定 devkit 版本;先用 toy 场景验证接口正确再上全量;坐标/时间严格按 nuPlan 约定。
故障 5:大模型驾驶(EMMA 类)输出不合理 / 幻觉¶
- 症状:MLLM 输出的轨迹坐标越界、不连续、或"一本正经地胡说"(幻觉)。
- 可能原因:① 大模型对坐标/物理缺乏精确感(语言模型的固有短板);② 输出格式解析错误;③ 缺乏约束解码,模型自由生成不可行轨迹;④ 提示/上下文不足。
- 排查步骤:检查输出格式解析 → 加坐标范围/连续性的后验校验 → 评估是否需要约束解码或后处理投影。
- 解决:对大模型输出**永远做后验安全校验 + 投影到可行域**(回到生成-验证模板);这也是为什么 EMMA 类方法实战必须配经典栈兜底(深入三、安全过滤架构)。
故障 6:UniAD 两阶段训练不收敛 / Stage 2 直接崩¶
- 症状:跳过 Stage 1 直接端到端训练时 loss 震荡不降、显存溢出(~50GB);或 Stage 2 加载初始化后规划/占据指标始终对不上论文。
- 可能原因:① 跳过了 Stage 1 感知预训练,地基不稳导致上层任务学不动(组件⑦);② Stage 2 没有用 Stage 1 的
uniad_base_track_map.pth初始化;③ 显存不足被迫减 batch/帧数(BEV queue_length 默认 5)破坏时序融合;④ 未按官方说明处理loss_past_traj等损失项的开关。 - 排查步骤:确认是否走完两阶段 → 检查 Stage 2 的 init checkpoint 路径 → 核对 BEV 帧数与 batch 配置 → 比对官方 stage1/stage2 config 的 loss 项设置。
- 解决:严格走两阶段——先训 track+map(~6 epoch)拿到
uniad_base_track_map.pth,再用它初始化 Stage 2 端到端训练(~20 epoch);显存不足优先用官方推荐的多卡(≥8 GPU)而非粗暴减帧(见组件⑦与复现指南)。
排查的总原则:本章方法的故障,十之八九不在"算法本身",而在**版本耦合、隐藏超参(歧义审计表里的项)、坐标/时间约定、开环-闭环混淆、训练阶段/初始化**这五类工程细节上。遇到问题先查这五类,再怀疑算法。
全章一页纸速查¶
把整章浓缩成一页,供快速回忆:
七篇论文一句话 - UniAD:感知-预测-规划用 query 贯通、以规划为导向,梯度反传到感知。 - Diffusion Policy:把动作生成当去噪过程,天然多模态,训练稳定。 - PLUTO:纵横感知 + 对比学习 + 数据增强,模仿学习首次闭环超越规则派。 - VAD/VADv2:矢量化场景提速;VADv2 概率规划解多模态。 - Hydra-MDP:多 metric 教师蒸馏,突破单一专家天花板。 - Diffusion Planner:自车+他车联合去噪,时空+博弈联合。 - EMMA:多模态大模型直接输出规划,用常识应对长尾。
核心范式三句话 - 端到端:拆掉接口让梯度贯通,以终为始(代价:可解释性/可验证性)。 - 扩散:把复杂分布的生成拆成一串简单去噪步(多模态源于随机起点)。 - 两者都绕过 PVD,直接产时空轨迹(用离线训练赎回实时性妥协)。
一条安全铁律 - 神经网络规划器无法形式化保证安全 → 务实答案是"生成-验证":学习管创意,规则管底线。
本章完结¶
回到开篇那条在脑子里跑过的经典流水线——相机到感知到预测到规划到控制,一条手工设计、模块串联、每道接口都损失信息的流水线。本章做的,是把这条流水线**重新想象**了一遍:
UniAD 拆掉了模块间的"压扁"接口,让信息以 query 的形态流到规划、让梯度从规划流回感知;Diffusion Policy 把"预测一条轨迹"重新表述为"从噪声里去噪出一条轨迹",让多模态自然涌现;PLUTO 把战场从开环搬到闭环,第一次证明模仿学习能在真实的考场上超越规则派。三条主线,连同矢量化(VAD)、多教师(Hydra)、联合去噪(Diffusion Planner)、大模型(EMMA),共同把时空规划从"人手设计的优化"推向了"数据驱动的生成"。
但本章最重要的认知,不是这些方法多强,而是它们**共同的边界**:没有一个学习方法解决了安全可证与长尾泛化这两个根本问题。于是全章七篇论文、连同工业界的安全滤波架构,最终都收敛到同一个务实答案——生成-验证:让学习模型负责生成高质量、多模态的候选,让经典栈(正是本专题 T1–T5 教你的那些显式优化与搜索)负责验证与兜底。学习不是经典栈的掘墓人,而是它的上游创意引擎。
这也正是"时空联合规划"专题以本章收官的深意——从 T1 的 PVD 解耦,到 T2/T3 的联合搜索与优化,到 T4/T5 的工业落地与多智能体,再到 T6 的学习生成,你走完了"空间与时间如何联合决策"在三种范式下的完整演进。经典与学习不是对立的两端,而是"生成-验证"框架的两半。
向前,还有两个横切专题在等你:当你想让"他车预测"从交互建模升级为真正的博弈求解,去**博弈规划**;当你想把"多模态"从生成升级为严格的不确定性量化与安全保证,去**不确定性规划**。三个专题,终将在"动态交互环境下的安全决策"这一点上汇合。
本章完 —— 你已掌握端到端与扩散式时空规划的核心范式、七篇代表论文的方法与边界,以及用论文解读方法(三栏式 / 映射表 / 歧义审计 / 研究视角)独立精读前沿论文的能力。下一步,动手跑通三个 A 型复现(建议顺序:Diffusion Policy → UniAD 推理 → UniAD 训练 → PLUTO 闭环),在代码里亲历那些"论文没告诉你的"。
版本说明:本文档的**论文事实层**(标题、作者、会议/年份、arXiv 编号、核心结论、关键实验数字、仓库地址与顶层结构)已通过联网检索官方来源(arXiv、官方 GitHub、会议主页)核实,并据此把一项原 CONFLICT(UniAD occ-planner 联合训练)升级为 SPECIFIED;**代码走读层**仍为基于公开实现的示意性走读——文件/模块名为真实仓库名,但具体行号未逐行核对。进一步 clone 源码 + 通读论文全文后,可将代码走读精修到逐行级、补齐精确页码并最终判定剩余 PARTIAL/CONFLICT 项。本章在论文事实层已达可信,工程实现层为示意——阅读代码走读时请始终记住这一区分。
📚 本章为「时空联合规划」横切专题 T6(收官章)。配套:T1 Frenet/ST 图 · T2 时空走廊 · T3 时空轨迹优化 · T4 Apollo/Autoware · T5 多智能体协调。下一步推荐:博弈规划专题 / 不确定性规划专题。