想象你走进一家正在改造的中餐馆后厨。老式厨房里,洗菜工、切菜工、灶台师傅各忙各的,彼此只靠小纸条传话——“三号桌要糖醋排骨,切好的肉在左边第三个盆里”。纸条越传越丢字,口味越来越跑偏。这正是传统模块化自动驾驶的日常:感知、预测、规划三个工序各干各的,中间靠人工定义的“小纸条”(中间表示)交接信息。而端到端规划的代表 UniAD 和 VAD,带来了“总厨制”的后厨:一位总厨统一调度所有工序,所有环节都为最终上菜(规划决策)服务;VAD 还发明了“关键食材清单”(向量化场景表示),不再傻盯着整面墙的监控找菜,而是只关心和做菜有关的几样东西。这篇文章就带你从厨房故事出发,看懂端到端规划的核心设计。
对于 AI 从业者,理解 UniAD/VAD 的端到端规划思路,能帮你从“调单个模型”跃迁到“设计整个系统”,是成为自动驾驶算法工程师、数据闭环工程师的必修一课。
目录
可视化演示
展示UniAD/VAD端到端规划框架的感知-预测-规划统一流程、多任务联合训练架构,以及VAD向量化场景表示的效率优势。
本节配有交互动效(进入视口后自动加载,约 3KB)。
端到端规划流程 感知模块(PCR):从传感器数据提取环境信息,包括车道线、车辆、行人 预测模块(PRD):推理周围交通参与者的未来轨迹 pipeline = perception → prediction → planning → control
模块化端到端:从流水线到总厨
老式后厨是典型的流水线:洗菜工把菜洗好,写张纸条“三号桌的排骨已备好”,切菜工照着纸条切,灶台师傅凭纸条下锅。每个人都把上一手传来的信息“翻译”一遍,纸条越传越丢字,味道越跑越远。这正是传统模块化自动驾驶的日常:感知、预测、规划三个工序各干各的,中间全靠人工设计的中游产物——目标框、轨迹假设、高精地图——也就是那张“小纸条”。
纸条的致命伤有两个。一是丢字(信息有损):感知漏掉一个行人,预测和规划根本无从知晓,后厨没人知道今天真正要做什么菜。二是纸条格式是“死规定”(不可微):想改菜单,必须全链路手工改通知单,无法让整条流水线一起跟着新目标优化。于是业界提出端到端规划:把流水线改造成共享一口锅,所有工序的“小纸条”换成一个公共的可学习特征空间,感知、预测、规划一起用总损失反向传播。
UniAD 这类“模块化端到端”是两者的折中:仍然保留检测、跟踪、建图、运动预测这些显式任务(相当于保留切菜、配菜工序),但让它们共享同一个骨干网络、参与同一个损失函数,全栈可学习:
就像总厨给每个岗位发同一份菜谱、按同一套标准打分,模块化端到端不再让各个环节“各干各的拿到单子就做”,而是让整条厨线朝着同一个目标一起打磨。
- 总损失 L_total整个端到端网络所有任务损失加权后的总和,代表“整桌菜”的综合考核成绩。
- 权重系数 λ每个任务的相对重要性,需要人工设计或用自适应方法学习,决定哪个工序“嗓门更大”。
- 各项任务损失检测、建图、运动预测各自衡量网络输出与真值之间的差距,对应各道工序的单独评分。
- 规划损失 L_plan最终决策轨迹与目标轨迹的偏差,是全桌菜最后能否上齐的关键一环。
UniAD统一框架:总厨一把抓
总厨的厉害之处是“眼观六路”:一边看食材,心里已经盘算好下一个动作。传统流水线的问题恰恰是信息单向流动,后厨没人知道“总目标”是什么。UniAD 的答案,是让所有环节共享同一个“灶台”(BEV 鸟瞰特征),并给总厨配了一个“意图小助手”——规划查询向量(plan query),它代表“我(自车)接下来想怎么走”,主动去询问场景里的每个元素。
这个“问”就是注意力机制:自车的规划查询(Q)与场景编码出的键值(K、V)做加权聚合,权重越大,说明那个障碍物越“碍事”,规划越要绕开它。UniAD 在一个网络里同时输出跟踪、建图、运动预测、占据预测和最终轨迹,中间任务全部显式可学习——像总厨的学徒们各有分工,但都听同一人指挥:
总厨的妙处不在每个动作最漂亮,而在整桌菜能协调上桌;UniAD 的强项也不在每个子任务最顶尖,而是共享特征让规划“看得全、问得准”。
- 规划查询 Q_ego一个代表自车及驾驶意图的可学习向量,相当于总厨心里的“拟菜单”。
- 场景键值 K、V由共享骨干从传感器输入编码出的场景特征,键负责匹配“问什么”,值负责给出“答案内容”。
- 注意力聚合计算查询与每个场景元素的匹配度并对值加权求和,让规划集中关注真正关键的目标。
VAD向量化表示:关键食材清单
后厨墙上挂了一整面监控屏,每一帧都有几百万个像素,但 99% 是墙、地、锅、碗——这才是真正的算力浪费。传统 BEV 感知把整片鸟瞰图栅格化,就像把监控画面全部存下来再逐格分析;VAD 则掏出一张“关键食材清单”,只记录车、车道线、红绿灯这些和驾驶决策直接相关的语义元素。
清单上的每一条对应一个向量:自车一个向量、每辆他车一个向量、每条车道线一个向量……场景从“一整张大图”变成“一小撮带含义的条目”,稀疏、结构化、语义直接。规划器只需对几十个向量做注意力,而不是对几十万像素做卷积,因此计算和内存开销大幅下降,实时性显著提升:
正如最好的总厨不会盯着整面监控墙找一块姜,VAD 让规划器只关心“清单上”的事——把宝贵的车载算力留给真正的决策,而不是浪费在无意义的背景像素上。
- 向量化场景 S_vec整个驾驶场景的稀疏集合表示,替代稠密栅格,相当于从监控画面换成清单。
- 集合与大括号把所有语义元素装进一个集合,元素间无序、互相独立,只保留“有哪些关键物”。
- 各语义元素 v自车、车辆、车道、红绿灯等分别对应的特征向量,上标编号区分同类中的不同个体(如第 M 辆他车、第 K 个信号灯)。
- 向量维度 C每个元素用 C 维实数向量承载语义,维度越高信息越丰富,算力也相应增加。
规划中心设计:一切以上菜为中心
总厨的最高原则是“准时上齐一桌好菜”,切得再漂亮的萝卜花也只是为了那桌菜服务。Planning-centric(以规划为中心)就是这个意思:整个模型的设计都绕着“最终要输出的自车轨迹”转,而不是让感知、预测各自为政、追求自己的指标最优。
在 UniAD 和 VAD 中,规划查询位于网络的“决策层”:它接收所有上游特征,输出未来数秒的行驶轨迹坐标。前端的检测、建图、运动预测都不是终点,而是为规划提供“菜料”——谁挡路、路怎么走、对方要干嘛,最终都汇成一句话:我这道菜该怎么下锅。规划损失通常由两部分组成:模仿项让预测轨迹贴近真值(学习人类怎么开),安全项惩罚侵入障碍物安全半径的轨迹点:
一个只为“上菜”服务的厨房,每个环节都清楚自己在整桌菜里的位置;一个以规划为中心的端到端框架,每一层特征也都朝着“安全到达”这个最终目标优化。
- 模仿项预测轨迹与专家真值轨迹逐点求差的平方和,压着模型去模仿人类驾驶行为,相当于“学老厨师的手艺”。
- 安全项对侵入障碍物安全半径的轨迹点施加惩罚,距离越近惩罚越大。
- 权重 λ_safe安全项在整个规划损失中的分量,量产场景往往调得较高,因为“不能撞”比“学得像”更重要。
多任务联合训练:一锅同炒的配合
总厨要训练学徒:配菜、掌勺、摆盘如果各练各的,配菜追求丝越细越好,掌勺追求火越旺越好,整桌菜反而会砸。多任务联合训练的精髓正是“同锅同灶一起练”:所有任务共享同一个骨干网络,让它们互相借力——检测帮规划认识障碍物,运动预测帮规划预判下一步,规划的误差信号反过来又提升前端特征的表达能力。
技术上看,总损失就是各任务损失加权求和,一次反向传播同时更新共享骨干。但现实并不轻松:不同任务损失量纲不同——检测算的是框之间的像素距离,分类算的是交叉熵,规划算的是轨迹坐标差——直接加在一起,会出现“嗓门大的任务盖住其他任务”的现象。为此工程师们采用权重调整、梯度裁剪、基于不确定性的自动加权等策略:
总厨会根据当天菜单调整谁先下锅、谁多练一会儿——多任务联合训练的本质,就是不断平衡“每个任务的声音大小”,让感知、预测、规划在同一口锅里和谐出锅。
- 总梯度 ∇L整个网络参数更新的方向,是所有任务“意见”的总和。
- 求和式从第 1 个到第 N 个任务梯度逐一累加,N 是任务总数。
- 加权梯度每个任务梯度乘上自己的权重 λ,权重大则这个任务对骨干的“改造意愿”更强。
- 正权重约束所有权重必须为正,保证每个任务都参与训练,而不是被某个任务完全压制。
适用性与局限:总厨也有边界
总厨再厉害,也离不开三样东西:好食材(高质量数据)、食安标准(安全兜底)、灶台火力(算力)。端到端规划在结构化的城市道路和高速场景表现出色——车道线清晰、交通参与者规整,正是“总厨制厨房”最舒适的舞台。但它的边界同样明显。
局限主要在三处。一是数据依赖:长尾场景(极端天气、突发事故、罕见加塞)样本稀少,模型容易“没见过这道菜”,只能瞎做;二是算力:Transformer 与多任务联合推理对车载芯片压力大,VAD 的向量化正是为了缓解这一点而生;三是可解释性与安全验证:端到端模型像总厨的直觉,一旦出了问题很难复盘“是哪一步判断错了”。因此工程上常用安全裕度来把关——统计整条轨迹与所有障碍物的最小距离,是否始终大于安全阈值:
想引用“总厨制”,别忘了标准后厨还有一条铁律——再好的手艺也要有验收标准和备用预案。这正是端到端规划走向量产前必须补的课:数据要够,算力要足,安全更要兜底。
- 安全概率 R_safe整条规划轨迹满足安全条件的概率,越高代表系统越可靠。
- 双重最小值先对每个时刻找最近的障碍物(对 i 取最小),再对整段时间找最危险的一刻(对 t 取最小)。
- 安全阈值与最小安全间距比较,判断是否始终没有“贴脸”驾驶。
AI 应用场景
城市 NOA 量产车端的实时规划部署
阶段:模型推理与部署优化
解决的问题:传统稠密 BEV 栅格在车端算力受限时延迟高,端到端规划器常常“想好了但来不及做”。VAD 把场景浓缩成几十个向量,规划器只对关键语义元素做注意力,算力开销大幅下降,让“看清路况再决策”变得实时可行。
具体案例:某车企在 Orin 平台部署 VAD 风格规划器,只保留数十个物体框与车道矢量参与自车轨迹的注意力交互,端到端延迟从 120ms 降到 40ms,城市 NOA 的加塞、变道场景响应明显更从容。
数据闭环中的影子模式模型迭代
阶段:数据采集与模型训练
解决的问题:模块化系统问题定位难,感知错了怪感知、预测错了怪预测,难以统一优化。UniAD 这类模块化端到端框架可以在云端用大规模真实轨迹多任务联合训练,让感知、预测、规划一起迭代,问题归因更清晰。
具体案例:自动驾驶车队回传脱敏数据,数据闭环工程师在云端用 UniAD 风格框架联合训练规划头,再利用仿真对比新旧版本的碰撞率与接管率,只有安全裕度达标的模型才进入影子模式灰度测试。
安全仿真验证与长尾场景挖掘
阶段:安全验证与仿真测试
解决的问题:端到端模型可解释性弱,直接上路验证风险大。可在仿真中注入向量化边界场景(鬼探头、强行加塞、施工改道),专门测试规划器的安全损失约束是否真的兜住了底线。
具体案例:测试团队在闭环仿真里对规划器施加极端切入场景,统计最小安全间距低于阈值的频次,输出“安全裕度热力图”,作为调整碰撞损失权重的依据,也作为法规合规的证明材料。
Python 演示
"""端到端规划最小演示:向量化场景 + 可微安全损失的迭代轨迹规划"""import numpy as np class VectorizedScene: """向量化场景表示:只保留稀疏的物体框,丢弃整幅图像""" def __init__(self, obstacles): # 每个障碍物: (x, y, 半宽, 半高) self.obstacles = np.array(obstacles, dtype=float) def clearance(self, xs, ys): """计算轨迹每个点到最近障碍物的距离""" best = np.full(len(xs), float("inf")) for ox, oy, hw, hh in self.obstacles: dx = np.maximum(np.abs(xs - ox) - hw, 0.0) dy = np.maximum(np.abs(ys - oy) - hh, 0.0) dist = np.sqrt(dx * dx + dy * dy) best = np.minimum(best, dist) return best def plan(scene, lane_y=5.0, safe_r=1.6, steps=80, lr=0.6): """从车道中线出发,迭代优化出一条平滑且远离障碍的轨迹""" xs = np.arange(10.0, 70.0, 1.0) y = np.full_like(xs, lane_y) for _ in range(steps): grad_col = np.zeros_like(y) for ox, oy, hw, hh in scene.obstacles: dx = np.maximum(np.abs(xs - ox) - hw, 0.0) dy = np.maximum(np.abs(y - oy) - hh, 0.0) d = np.sqrt(dx * dx + dy * dy) + 1e-6 push = np.where(d < safe_r, (y - oy) / d * (safe_r - d) / safe_r, 0.0) grad_col += push grad_lap = np.zeros_like(y) grad_lap[1:-1] = 2 * y[1:-1] - y[:-2] - y[2:] y += lr * grad_col # 被障碍物推离 y -= lr * 0.02 * (y - lane_y) # 被参考线拉回 y -= lr * 0.3 * grad_lap # 二阶差分平滑 y = np.clip(y, 0.5, 9.5) return xs, y if __name__ == "__main__": scene = VectorizedScene([ (25.0, 3.0, 1.2, 0.9), (40.0, 7.0, 1.2, 0.9), (55.0, 4.0, 1.2, 0.9), ]) xs, y = plan(scene) nearest = scene.clearance(xs, y) print("路径点数:", len(xs)) print("x :", xs.astype(int).tolist()) print("y :", np.round(y, 2).tolist()) print("最小安全间距: %.2f" % float(nearest.min()))
class VectorizedScene对应 VAD 的向量化场景表示,只存关键物体的框,不存整幅图像self.obstacles = np.array(obstacles, dtype=float)把障碍物整理成数组,像“关键食材清单”上的条目def clearance计算每个路点与最近障碍物的距离,是安全损失发挥作用的基础push = np.where(d < safe_r, (y - oy) / d * (safe_r - d) / safe_r, 0.0)轨迹点侵入安全半径时,产生一个指向远离障碍物方向的“推力”梯度y += lr * grad_col沿着“被推开”的方向更新轨迹,模拟端到端规划器用可微损失迭代更新参数y -= lr * 0.02 * (y - lane_y)模仿专家轨迹的损失,把轨迹拉回车道中线y -= lr * 0.3 * grad_lap二阶差分平滑项,避免轨迹剧烈抖动
常见误区
误区端到端嘛,不就是输入图像直接输出方向盘?中间过程全部不可见,也完全不需要设计任何中间任务。
正解UniAD 这类“模块化端到端”恰恰相反:检测、跟踪、建图、运动预测、占据预测都是显式可学习的中间任务,只是它们共享同一个骨干、参与同一个损失函数。就像总厨统一调度,但配菜、切菜、摆盘的工序仍然存在,每道工序还有明确的“厨艺考核”(损失函数)。这不是黑箱,而是把分包制的后厨改成了统一指挥。
为何常见:听名字“端到端”容易联想到“输入到输出一步到位”,忽略了结构化中间任务在稳定训练和可解释性上的重要作用。
误区VAD 把场景表示变小了,应该就是把图像降采样一下,画质差点、算力省点吧?
正解向量化不是降分辨率,而是一种语义抽象:从稠密栅格变成稀疏元素集合——自车一个向量、他车一个向量、车道线一个向量。它丢弃的是海量无意义的背景像素,保留的是决策相关的语义信息。就像从“整面墙的监控画面”变成“关键食材清单”,不是画面变糊了,而是表达方式换了。
为何常见:把“稀疏”想当然地理解成“更糊”,混淆了栅格分辨率与结构化表示这两个完全不同的概念。
误区公式里写着 L = λ₁L₁ + λ₂L₂ + ……,那训练不就是把所有损失加起来反向传播吗?
正解直接相加会因为量纲不同、梯度冲突,导致“嗓门大”的任务淹没其他任务——检测损失数值大就主导训练,规划损失再重要也学不动。工程上需要精心设计权重、梯度裁剪,甚至用不确定性做自适应加权。就像让配菜、掌勺一起训练,不能各喊各的,总厨得按菜谱给每个人分配发言时间。
为何常见:只看到损失函数是“加法”的形式,忽略了背后权重调参和梯度平衡的复杂工程实践。
误区端到端模型是数据喂出来的,只要采集的数据够多,模型总能把车开得比人好,绝对安全。
正解数据驱动的模型对长尾场景仍有盲区——极端天气、罕见事故、从未见过的路况,都可能让模型“没见过这道菜”。所以 UniAD/VAD 都会显式加入碰撞惩罚、安全距离约束,量产还会叠加规则兜底。就像总厨再熟练,遇上没见过的食材也要靠食安标准把关,不能只靠手感。
为何常见:行业宣传中“数据飞轮”的说法容易给人“数据越多越万能”的错觉,忽略了安全是系统工程而非单纯的数据堆砌。
误区以规划为中心,应该就是把规划模块放在模型最后一层输出,位置对了就行。
正解Planning-centric 的核心不是模块位置,而是“设计哲学”:所有特征表示、所有中间任务,都以最终规划目标为中心来组织和监督。前端任务不是各自追求指标最优,而是为决策服务。就像厨房里所有工序都为最终上菜服务,而不是每道工序都追求自己切得最好看——换位置解决不了问题,换目标才是关键。
为何常见:把“中心”望文生义成“流程顺序”,忽略了它实际讲的是一种全局的目标组织方式。
面试题
Q1. 传统模块化自动驾驶的“中间表示瓶颈”主要指什么?
- A.摄像头分辨率不够
- B.模块传递有损不可微← 正确答案
- C.规划器运行速度慢
- D.缺少高精地图数据
答案:B。模块化流水线靠人工设计的中间表示传递信息,接口不可微、信息有损,感知误差会一路放大到规划。这就像后厨传纸条丢字,不是摄像头或速度的问题,而是“沟通方式”本身有缺陷。
Q2. UniAD 中“统一”主要指什么?
- A.只用一种传感器
- B.联合优化所有任务← 正确答案
- C.全车共用一套模型
- D.不再需要任何标注
答案:B。UniAD 的统一在于感知、预测、规划等任务共享骨干网络并在一个损失函数下联合优化,像总厨统一调度所有工序。它并不排斥多传感器,也不等于不需要标注。
Q3. VAD 用向量化场景表示相比稠密 BEV 栅格的核心优势是?
- A.画面分辨率更高
- B.稀疏高效聚焦语义← 正确答案
- C.完全不需要注意力
- D.无需任何训练数据
答案:B。向量化表示把场景浓缩成若干语义向量,只保留决策相关的关键元素,算力和内存大幅下降,同时仍然依赖注意力机制与训练数据。就像用清单找菜比盯整面监控屏更快,而不是画面更清晰。
Q4. UniAD 中显式设计了哪些中间任务?(多选)
- A.三维目标检测跟踪← 正确答案
- B.在线高清地图构建← 正确答案
- C.未来运动轨迹预测← 正确答案
- D.红绿灯配时估计
答案:ABC。UniAD 包含检测跟踪、建图、运动预测和占据预测等显式中间任务,但红绿灯配时估计不在其标准任务集合中。这些中间任务像总厨的学徒分工,既保留结构,又共享特征。
Q5. "Planning-centric"框架的核心设计理念是什么?
- A.感知必须做到最精确
- B.围绕规划组织所有表征← 正确答案
- C.规划器放在最后即可
- D.只优化碰撞安全损失
答案:B。规划中心不是位置问题,而是让所有特征和任务都以最终规划轨迹为目标来组织。感知再精确,若不是为决策服务,对整桌菜也没有意义——就像萝卜花再漂亮,也要服务于上菜。
Q6. 端到端多任务联合训练中常见的挑战有哪些?(多选)
- A.任务损失量纲差异冲突← 正确答案
- B.各任务权重需要调平衡← 正确答案
- C.中间任务给规划约束← 正确答案
- D.任务数量越多总是越好
答案:ABC。不同任务损失量纲不同会导致梯度冲突,需要精细调权重甚至自适应加权;中间任务确实能为规划提供结构化约束。但任务并非越多越好,冗余或冲突的任务会拖累收敛。
Q7. VAD 中“锚点向量”最适合用哪个生活类比?
- A.一张照片里的所有像素
- B.购物清单上的关键条目← 正确答案
- C.一幅完整的城市地图
- D.全部传感器的原始读数
答案:B。锚点向量只记录驾驶决策相关的语义元素——车、车道线、信号灯——就像购物清单只记要买的菜,而不是把整家超市拍下来。它是结构化抽象,不是原始数据的堆叠。
Q8. 端到端规划器中,通常显式加入哪类损失来保证安全?
- A.交叉熵分类损失
- B.碰撞惩罚安全距离← 正确答案
- C.权重的L2正则化
- D.对比学习损失
答案:B。规划损失中会加入碰撞惩罚项:轨迹点侵入障碍物安全半径就受罚,距离越近惩罚越大。这就像食安标准,不管总厨手艺多好,都不能让菜带着风险上桌。
Q9. 关于端到端自动驾驶的局限,正确的说法有哪些?(多选)
- A.依赖大规模高质量数据← 正确答案
- B.车载算力资源消耗大← 正确答案
- C.可解释性仍需加强← 正确答案
- D.已解决长尾极端场景
答案:ABC。端到端模型需要海量高质量数据覆盖长尾场景,Transformer 多任务推理对车载算力要求高,且黑箱特性让问题复盘困难。长尾场景恰恰是尚未解决的短板,而不是已经攻克。
Q10. 模块化端到端(UniAD)与纯黑箱端到端的关键区别是什么?
- A.是否使用深度学习模型
- B.是否保留显式中间任务← 正确答案
- C.是否使用车载摄像头
- D.是否需要人工标注
答案:B。UniAD 保留了检测、跟踪、建图、运动预测等显式可学习的中间任务,让训练更稳定、归因更清晰;纯黑箱端到端则直接映射输入到控制。两者都用深度学习与摄像头,也都需要标注指导训练——区别在于是否保留可解释的中间结构。