做自动驾驶有一段时间的人,大概率都会有同样的感触:感知模块可以靠堆数据、堆模型快速出效果,控制模块能从经典控制理论里找到成熟方案,唯独中间那层决策——系统接下来到底要做什么操作——是最难用标准答案去衡量的。很多项目在决策上翻车,不是因为算法论文读得少,而是因为决策本质上不是一个纯算法问题,它更像是判断力、风险观和工程纪律的综合体。这篇内容想结合我自己的观察和实践,聊聊自动驾驶决策算法的几个核心维度:决策模块在整个系统里承担什么、主流技术路线各有什么价值与局限、以及从仿真到实车的过程中那些只有真正跑过系统才会踩到的坑。适合正在做或准备做决策/规控方向的同学参考,也想让对自动驾驶感兴趣的朋友理解这个领域真正的难点在哪里。
1. 先搞清楚:决策模块在整个自动驾驶系统里到底负责什么
1.1 感知-预测-决策-规划-控制,决策卡在最关键的中间环节
先框定边界。一套典型的L2+到L4自动驾驶系统,按数据流可以粗略分成六个环节:环境感知、目标预测、全局路径规划、行为决策、运动规划、控制执行。环境感知负责检测障碍物、车道线、交通标志,目标预测负责推测其他交通参与者未来几秒可能的位置分布,全局路径规划负责从出发点到目的地的大致路线,行为决策负责回答"面对当前局面我们该做什么",运动规划负责把行为决策翻译成一条具体的、带时间戳的时空轨迹,控制执行最后负责让底盘跟随这条轨迹。
决策模块的位置很有意思,它恰好卡在"理解世界"和"操作车辆"的正中间。感知和预测回答"现在发生了什么、接下来可能发生什么",决策回答"这种局面下该怎么办",运动规划回答"怎么办得更具体、更顺滑"。这里有个很容易被低估的事实:决策一旦选错行为模式,后面的规划和控制再精细也救不回来。举一个很典型的例子:决策层判断当前车道可以继续巡航,但前方其实有一个静止的施工锥桶被感知漏掉了,此时规划层算出的轨迹再平滑,也改变不了即将撞上去的结果。反过来,决策层决定在无保护左转路口让行,规划层却给出一条贴着对向车流的激进轨迹,控制层就会收到互相矛盾的指令,车身动作变得特别奇怪。
所以我一向认为,决策模块在系统里是一个"一票否决"性质的部件。感知的精度可以靠版本迭代慢慢涨,控制的响应可以靠标定参数调整,但决策错误往往不是数值大小的问题,而是行为模式直接选错的问题,轻则让乘坐体验出现突兀的顿挫,重则直接触发接管甚至事故。理解了这一点,就会明白为什么业界花在决策算法上的心思,远比外人看到的多。
1.2 为什么感知精度上来了,决策依然是最大的短板
过去几年感知技术肉眼可见地进步,基于大模型的检测、鸟瞰视角的BEV感知,把"看见"这件事做得越来越可靠。但"看见"不等于"看懂","看懂"也不等于"会做决定"。一个很有意思的现象是:感知误检通常可以通过加数据、调阈值快速下降,决策失误却很难用同样的思路修复,因为"决策准确率"这个指标本身就不存在。
感知有清晰的ground truth,一个检测框是否正确,标注员可以判断。决策没有绝对的对错。同样是面对一辆压线骑行的电动车,保守的决策是减速避让,高效的决策是保持车速、小幅借道通过,两个决策在不同风险评估偏好下都称得上"正确"。这种主观性让决策算法的评估、调参、迭代都比感知困难得多。再加上决策层的输入往往是感知和预测的融合结果,感知目标框一抖、预测分支概率一跳,决策就得跟着应变,真出了问题,很难定位是感知引入的、预测引入的,还是决策逻辑本身判断错了。
另一个现实约束是时延。感知可以接受几百毫秒的计算延迟来换取精度,决策不行。车辆以30m/s行驶时,100毫秒对应3米位移,这个距离在近距离交互场景里可能就是"安全"和"事故"的分界线。决策必须在很短的时间窗口内输出稳定行为指令,这让很多理论上很漂亮、但计算量巨大的决策方法在工程上难以直接落地。后面我会详细展开各条技术路线,你会发现它们各自的短板大都和这两个问题有关:要么是建模太理想,要么是算力撑不住。
2. 三条技术主线:规则、优化与学习,各自解决了什么、放弃了什么
决策算法没有银弹,业内实际采用的技术路线大致可以分为三类:基于规则、基于优化、基于学习。这三类路线的底层假设完全不同,适用场景差异也很大,我更愿意把它们看成互补的组合手段,而不是你死我活的竞争关系。
2.1 规则派:状态机与行为树,用工程确定性换场景覆盖面
基于规则的决策是历史最悠久、量产落地最多的一类方案,核心思想是把驾驶场景拆解成有限个离散状态或行为,再用条件判断完成状态切换。最经典的两个实现是有限状态机和行为树。比如定义一个状态集合{起步、直行跟车、变道、超车、让行、靠边停车、紧急制动},再根据前车距离、相对速度、车道占用情况、导航指令等条件,触发状态与状态之间的转移。
规则派的好处非常直观:可解释、可调试、安全边界可控。每条规则都是工程师显式写下来的,出了问题可以精确定位到是哪一个条件判断触发的,这在量产安全分析和事故复盘里是巨大优势。我见过有团队用状态机把高速巡航场景的决策逻辑写得井井有条,配合完善的转移条件保护机制,跑起来非常稳定,乘坐体验也很平顺。
但规则派有个绕不开的敌人:场景组合爆炸。现实驾驶不是一组有限状态能穷举的。每个状态内部还有子状态,状态之间还有优先级冲突和互斥约束。一个城市路口就可能组合出几十种交互局面——直行、左转、右转、行人闯红灯、对向车大转弯、非机动车窜出——全用规则写,规则数量会飞快膨胀到上千条。维护成本高不说,最怕的是规则之间互相矛盾,或者遗漏了某条组合路径导致决策进了死胡同。这也是纯规则方案在低速园区、封闭港区很成熟,一到复杂城市开放道路就力不从心的根本原因。
2.2 优化派:MDP/POMDP与博弈论,用数学完备性换可解性
优化派的基本思想是:决策本质是在不确定环境中选择长期收益最大的行为,那就把它建模成数学优化问题。最经典的框架是马尔可夫决策过程和部分可观测马尔可夫决策过程(POMDP)。POMDP比MDP多考虑了一层"系统状态不可完全观测"的约束,用一个信念状态表示对当前世界的概率认知,再求解一个能使长期累积期望收益最优的策略。
理论上POMDP非常优雅,它把感知的不确定性、预测的不确定性全部装进同一个数学框架里,决策不再是对某一个确定世界状态的响应,而是对"世界可能处于哪些状态、每个状态概率多大"的响应。但实践里它有两大难题难以逾越。一个是"维度爆炸":真实驾驶场景的状态空间大得离谱,信念状态的维度随之膨胀,精确求解根本不可行,只能做各种近似。另一个是收益函数本身很难设计,奖励该偏向效率还是安全?不同路口的忍耐时间权重怎么定?这些本质上是风险偏好问题,不是数学能替我们回答的。所以工程中常见的做法是把POMDP做各种降维和简化假设,只在有限的交互热点场景里使用。
博弈论是优化派的另一个分支。它把自车和其他车辆都看作理性的决策主体,问题就变成一个动态博弈,用纳什均衡这类概念描述交互结果。学术上这个方向吸引力特别强,尤其能解释"双向博弈":比如汇入车道时你到底该加速还是减速,取决于旁车是否让你;别人让了你,你加速汇入就皆大欢喜,别人不让你还硬挤,就可能碰撞。但博弈论方法有很高的计算开销,还依赖"对方完全理性"的强假设,真实驾驶者并不理性,大量行为是情绪和习惯驱动的。我见过一些团队只在无保护左转、匝道汇入这类具体的交互场景里用博弈思想做局部决策,效果不错,但要推广到全场景,还有很长的路。
2.3 学习派:模仿学习与强化学习,用数据泛化换安全可证性
学习派是近几年讨论最多、争议也最大的一类。模仿学习的思路是采集大量人类驾驶数据,训练模型学习"人类在这种局面下会怎么开";强化学习的思路是让决策智能体在仿真环境里不断试错,通过奖励信号自己摸索出策略;再激进一些的是端到端方案,直接用一个深度网络把从感知到控制的整个决策链路打通。
模仿学习的优势在于,它能自然学到人类驾驶中大量隐含规则和微妙交互,不用工程师手动定义场景规则。劣势则是,它学到的往往是训练数据覆盖范围内的"平均行为",对长尾危险场景理解不足,模型的可解释性又差,一旦学出不安全策略,很难定位是哪部分数据、哪层网络导致的。强化学习则面临两个更尖锐的现实问题。第一是仿真到实车的迁移鸿沟:仿真环境里传感器是干净的、动力学是简化的、交通流是礼貌的,练出来的策略到了真实世界很容易表现崩坏。第二是奖励函数设计中的"奖励黑客"现象:智能体会发现人类完全想不到的捷径去刷高分,而不是真正学会安全驾驶——这种问题在决策这种高风险场景里尤其致命。
我的整体判断是,学习派目前更适合充当系统的"策略优化器",在某个具体行为子任务上(比如变道时机选择、路口通行节奏)辅助规则框架,而不是整体替代。量产级系统里更常见、也更靠谱的形态是"规则兜底+学习优化"的混合架构。三条路线放在一起对比会更清楚:
| 技术路线 | 核心优势 | 核心短板 | 典型落地场景 |
|---|---|---|---|
| 规则派 | 可解释、可调试、边界可控 | 规则爆炸、场景覆盖难 | 高速巡航、园区低速 |
| 优化派 | 理论完备、全局最优 | 算力开销大、建模假设强 | 有限交互场景、离线策略计算 |
| 学习派 | 数据驱动、泛化能力强 | 可解释性差、安全难证明 | 行为子任务、策略微调 |
| 混合架构 | 优势互补、整体稳妥 | 系统复杂度高 | 量产复杂城市道路 |
3. 三个绕不开的硬骨头:交互博弈、不确定性传导与安全兜底
无论选哪条技术路线,决策算法都必须正面应对三个共性的难点。这些难点不是换一个算法就能绕开的,它们内生于"在真实世界里开车"这件事本身。
3.1 道路不是单机游戏:双向交互下的博弈决策
自动驾驶真正头疼的不是单车运动学,而是多车之间互相观察、互相影响。最典型的例子是双向两车道的借道超车:你想超越前方慢车,必须借用对向车道,这个操作是否安全,完全取决于对向车道来车的驾驶意图——它在加速、减速还是保持?问题在于,对方驾驶员也在观察你的动作:你打了转向灯、车轮往左偏了一点点,他都会据此判断你准备超车,并调整自己的应对。这就是一个双向交互博弈,你基于对他的预测做决策,他也基于对你的预测做决策。
这种"我知道你知道我在做什么"的递归推理,在学术上被称为层次博弈或level-k推理。理论上它可以无限递归下去,但工程上必须在有限时间内截断这个递归深度。实际落地时,很多团队的做法是维护一整套"对目标车辆意图的假设集":大概率是保持车道直行,中等概率是减速让我,小概率是没有注意到我继续加速。决策时不仅针对概率最大的假设做规划,还要同时为低概率的危险假设准备应对预案——比如一旦对方不让我,我的最大制动能不能在碰撞前停住,有没有空间放弃超车缩回原车道。这个思路比"预测出唯一一条轨迹然后绕着走"要稳健得多,因为单条轨迹预测一旦出错,基于它的决策就会跟着出错,连纠错的机会都没有。
3.2 不确定性会一路传导:从感知噪声到决策风险
第二个硬骨头是不确定性的级联放大。感知输出的目标框带噪声,分类置信度不是百分之百,预测模块给出的轨迹往往有多条分支和对应概率,这些不确定性会沿着数据链路一层层传导到决策层。如果决策层把这些输入当成确定数值来处理——比如笃定"目标车3秒后会到达位置X"——而实际上目标车的速度估计只偏差了10%,那么3秒后的位置误差就可能达到半个到整个车身长度,此时决策层做出的任何"正确"判断都建立在错误地基上。
所以成熟的决策系统通常不是对单条预测轨迹做反应,而是对预测分布做反应。工程上的常见做法是,把目标位置的不确定性展开成多种假设场景,分别评估每种场景下的碰撞风险,再按概率加权决定最终行为。举一个具体的直觉例子:前车有3%的概率会急刹。决策层即便大概率选择保持巡航,也必须保证"前车急刹"这个假设下存在来得及执行的避让方案——要么有足够的纵向距离在舒适减速度内刹停,要么旁边车道有空间可以变道。这种思路本质上是一种鲁棒决策:决策不是在找"最优",而是在找"大多数场景下足够好、最坏场景下也不至于万劫不复"的方案。这是决策算法和普通最优控制算法最本质的区别之一。
3.3 安全不能靠运气:形式化安全模型与兜底设计
第三个硬骨头是安全性的形式化保证。自动驾驶出一次严重事故就是大事,决策算法必须能回答:到底有没有一套机制,保证系统在任何情况下都不主动越过安全底线?业界最著名的探索之一是责任敏感安全模型(RSS,Responsibility Sensitive Safety)。它的核心思想是给各种驾驶场景定义一套可证明安全的规则。比如纵向跟车时,自车与前车的距离必须足够覆盖"前车突然以最大减速刹停、自车在感知时延和反应时延之后再全力制动"的整个过程;横向变道时,需要保证与旁车的横向间隙足以应对对方突然切入。
我们可以简单估算一下纵向安全距离的数量级。假设系统从感知到制动完全建立的总反应时间为1.2秒,自车速度为72km/h即20m/s,最大制动减速度为7m/s²,那么反应时间内车辆走过约24米,全力制动阶段还需要约28.6米,加起来大约53米,再留出2到3米的安全裕量,前车速度为零的场景下,自车与前车距离超过55米以上才是严格意义上的"零责任安全距离"。这个数字看起来很大,但它恰恰说明,高速场景要允许更高的车速,牺牲的就是跟车距离和通行效率,安全、效率、舒适三者永远在互相拉扯。
RSS这类形式化安全模型的最大价值,是给决策算法套上一层"无论上层怎么想,最终行为都不能制造危险"的保险丝。它的短板也同样明显:规则定义依赖对场景的精细抽象,现实中大量模糊场景——交替通行、行人犹豫、不规则路口——很难用几条公式完整覆盖;而且"判定对方是否违规"同样依赖感知结果,感知一错,安全规则的输入就错了,输出自然也会错。因此实际量产系统里,这类形式化方法通常是作为决策输出的安全过滤器,而不是决策的全部逻辑。
4. 从仿真到实车的实战经验:架构怎么搭、坑怎么踩
前面讲的都是方法论,这一节说点更接地气的经验。决策算法在文档和仿真里"看起来没问题"很容易,到了车上能稳定不出幺蛾子则是另一回事。我这些年推过决策系统从仿真到实车的落地,踩过的坑不少,挑几个有代表性的聊聊。
4.1 仿真跑了很多里程,实车为什么还是"慌"
仿真测试如今做得越来越逼真,很多团队会宣称决策算法在仿真里跑了多少万公里、通过了多少标准场景测试。但实车一上路,问题仍层出不穷,原因主要有三个。
第一是仿真里的传感器太"干净"。真实世界里感知结果充满噪声、漏检和误检,如果仿真不显式注入信号级或目标级的噪声,决策算法就永远在一个"完美的世界"里做判断。一旦上了实车,面对忽大忽小的目标框、时有时无的车道线、偶尔跳变的相对速度,算法表现崩坏是必然的,不是偶然的。我建议团队在做仿真评测时,一定要自带一套"感知污染层",把漏检率、误检率、测距噪声按实车统计值注入进去,这样仿真结果才勉强有点参考价值。
第二是仿真里的交通流太"礼貌"。很多开源仿真器的背景车辆行为保守、规矩、严格守车道线,而真实交通里充满了不打灯变道、贴着车头并线、电动车逆行窜行这类"不讲武德"的参与者。决策算法如果只在礼貌环境里训练和验证,遇到真实交通流就会陷入"这个场景我从来没学过"的窘境。
第三是仿真评测指标本身有误导性。一个"平均接管里程"很高但"极端场景表现很差"的系统,在仿真分数上可能非常好看,可恰恰是那一小撮极端场景才是实车安全的决定性因素。所以我越来越倾向于把仿真当作"回归测试"而不是"可靠性证明":仿真的价值在于验证新改动没有破坏已有的能力,而不是用它证明系统已经足够安全。真正可靠性的论证,永远来自结构化场景测试、实车验证和安全机制的完备性。
4.2 实车测试里反复出现的三类决策失败
实车测试中,我见过最多的决策失败大概集中在三类。
第一类是"犹豫不决"。典型场景是主路汇入,车辆在"加速汇入"和"停车等待"之间反复横跳,车流稍微一变就改主意,造成一种让后车完全看不懂的诡异运动。这类问题多半出在决策的时间一致性上——上一周期判断可以汇入,下一周期因为目标车的预测状态微变,又改成等待。根治的办法是给决策模块加入滞回机制和最小决策保持时间:状态切换一旦发生,至少保持几百毫秒到一秒,除非出现紧急情况,否则不允许快速翻转。这个机制看起来简单,对实车体验的改善却是立竿见影的。
第二类是"过度保守"。决策算法为了安全,把所有潜在风险都当成确定的实际风险处理。结果就是遇到一辆路边停着打双闪的施工车,也要等对向车道完全清空才敢绕行,后面堵了一长串车。过度保守在测试报告里不算扣分项,但会严重消耗用户对系统的信任,因为大家会觉得这个车"笨"。处理过度保守的关键,是给场景分类引入风险等级区分,而不是一刀切地放大所有不确定性。
第三类是责任归属混乱的人车混行场景。比如一个目标车辆和一个行人相距很近,决策模块不知道该以谁为主要交互对象,于是做出一个让谁都匪夷所思的位移。这类场景不存在标准答案,只能靠决策系统在交互优先级上做非常精细的层次化处理,并且在不同目标风险叠加时,明确输出一种"谁优先、谁让行"的显式策略,而不是在连续空间里模糊地挣扎。
4.3 一套经过实战检验的分层混合决策架构
踩了这么多坑之后,我个人现在比较推荐一套"分层+混合"的决策架构,它不见得是最前沿的,但确实是稳健性和可落地性的折中方案。
最底层是安全过滤器,用RSS风格的规则或等价的形式化检查,对上层输出的每一个行为指令做自主安全校验。校验不通过就直接降级为保守策略,极端情况触发安全停车。这一层是整车的"保险丝",宁可误触发,不可漏触发。往上是一层行为决策,主体用规则状态机实现,负责跟车、巡航、变道这些常规行为的切换与维护,强调稳定性和可解释性,这一层决定了系统90%时间里的驾驶质感。再往上是场景决策层,专门处理状态机搞不定的复杂交互,比如无保护左转、匝道汇入、施工区改道,这里可以根据场景特征选用强化学习策略、POMDP近似解或者博弈论局部求解器。最上层是全局策略层,根据导航信息和宏观交通态势调整个体驾驶风格,比如拥堵路段更积极地跟车防插队,接近学校区域整体降低车速阈值。
这套架构最核心的设计思想是"把鸡蛋放在多个篮子里":不同算法只在自己擅长的层级工作,再由底层的安全过滤器统一兜底。它的代价是系统复杂度明显上升,模块间交互和调试工作量都不小。另外我要特别强调一条工程纪律:所有层级输出的行为指令,都必须携带"时间戳+置信度"一起向下传递。实车一旦出问题,这套带时间戳的日志能帮你快速还原判断链路,定位是哪一层错了、是因为什么输入错了,而不是对着黑盒模型猜。
5. 最后聊几个我个人认为值得长期投入的方向
文章不做什么大而全的总结,只分享几个我在实际项目里越来越觉得值得投入的方向,也算给同行们一个参考。
第一个是预测和决策的联合优化。传统架构里预测模块先独立输出目标轨迹,决策模块再基于轨迹做判断,这种串联结构会放大中间误差。如果能让预测模块感知决策意图,输出"条件预测"——比如"如果自车保持加速,对方更可能让行;如果自车减速,对方更可能抢行"——决策质量会有明显提升。联合求解的计算开销确实大,但从效果看,代价是值得的。
第二个是"可验证的学习"。纯学习策略再强,不能证明它在规定场景包内不违反安全约束,我就不敢把它放上车。现在做约束强化学习、可验证策略的团队越来越多,这个方向一旦成熟,对量产的意义比单纯提高模型精度要大得多,因为它解决的是信任问题。
第三个是多人多车交互能力的沉淀。眼下大多数系统的交互策略都是面向单一交互对象设计的,但真实交通是多个目标同时在博弈,路口老司机处理的就是这种多人博弈。把这个做好,需要的不只是算法创新,还有对大量真实交互数据的结构化沉淀和场景化标注体系,这个方向没有捷径,只能靠长期积累。
我自己兜兜转转做了几年自动驾驶决策,最大的体会是:这个领域没有一劳永逸的银弹,但每一步扎实的工程化积累都不会白费。规则、优化、学习三条路线与其说是竞争关系,不如说是在不同场景、不同约束下互相补充的组合手段。决策算法最终要应对的,不是单车算法的复杂度,而是整个真实世界的多样性和不确定性。这个目标很难,但正因为难,才值得一直做下去。