碰到过这样的场景吗?晚高峰的高架桥上,旁边车道的车突然亮起转向灯,开始往你这条车道挤。你要是踩油门顶上去,它就是碰了个全责但你也跟着耽误时间;你要是松一脚油让进去,后面可能又要被连续插三辆车。这种模糊又紧迫的博弈,每天都在发生。站在自动驾驶决策算法的视角来看,这个瞬间要处理的问题远不止"要不要让"这么简单——它需要判断对方司机的意图、预测两车的相对速度变化、权衡安全距离与通行效率,还得在几百毫秒内给出一条不突兀又不出错的轨迹。这种能力,恰恰是当前自动驾驶系统里最难补齐的一块拼图。
很多人把目光放在感知上,觉得摄像头和激光雷达堆上去,车就能看清世界了。但看得清不等于想得对。感知错了,后端还可以靠时间序列滤波、多传感器融合去兜底;决策错了,车就已经朝着错误的方向开了。本文不打算罗列各家方案,而是想结合我这些年实际调试决策模块的经历,聊聊决策算法到底在解决什么问题、主流的几套思路各有什么脾气、以及真正让决策算法从实验室跑到公开道路时,那些没人写在文档里的坑。
1. 决策模块到底卡在哪:它不是感知的延伸,是一个独立难题
1.1 从传感器到方向盘:决策处在链路的哪个位置
一套自动驾驶系统,从数据流的角度看大致可以分成四层:环境感知层(传感器感知与融合、目标检测跟踪)、状态认知层(高精定位、地图匹配、意图预测)、决策规划层(行为决策、轨迹规划、速度规划)和底层控制层(方向盘角度、油门刹车的执行)。
很多人习惯把决策和规划绑在一起叫"决策规划模块",但它们其实是两回事。规划是在给定一个明确行为意图之后,计算一条满足运动学约束、避障约束和舒适性约束的轨迹;决策则是回答"下一步该干什么"——是跟车还是变道、是让行还是抢行、是刹停还是滑行通过。决策错了,规划再精巧也没有意义。比如前车减速时,你决策层判断成"前车正常加速",规划层就算把轨迹算得再平滑,结果也是追尾。
我在实际工作中遇到过不少刚入行的同事,拿到决策任务时第一反应是"把感知做得更准,决策问题不就解决了吗"。这个想法在简单场景下确实成立,因为感知精度提高可以直接降低决策的不确定性。但到了复杂交互场景,比如无保护左转、匝道汇入、人车混行路口,感知再准也只能告诉你"有一辆车在对面直行",至于它会不会加速、让不让,感知模块给不出答案。这时候问题已经从"对象是什么"变成了"接下来怎么博弈",这完全超出感知的范畴了。
1.2 场景组合爆炸:为什么决策不能靠穷举规则写死
决策难的第一个原因,是场景的排列组合远超人类的枚举能力。举个简单的例子:同样是"左转"这个行为,需要考虑的维度包括我方车速、对向直行车流间隙、路口是否有行人闯灯、左侧是否有遮挡视线的违停车、后车跟车距离是否允许减速、天气是否导致路面湿滑滑……每一个维度再叠加一个取值区间,场景数量就是指数级增长。
有个比较直观的估算方式:只考虑道路结构(直路、弯道、路口、匝道、环岛)、交通参与者类型(车、人、自行车、动物、锥桶)、运动状态(静止、匀速、加速、减速、变道、临停)和天气时段(白天、夜晚、雨、雪)这四个维度,每个维度取最常见的十几个取值,组合数已经超过十万种。而这十万种还只是静态组合,不包含时间上的时序关系——前车在3秒后会不会急刹、行人会不会突然横穿,这些牵涉到预测的问题会把状态空间再次放大几个数量级。
这也是为什么最早一批做决策算法的人普遍选择"有限状态机"路线。把系统定义成跟车、巡航、变道、超车、靠边停车等有限个状态,再定义状态之间的转移条件。这个思路在小范围封闭园区或者固定线路的L2级辅助驾驶里非常好使,逻辑清晰、便于调试和向安全部门解释。但只要你把场景扩大一些,状态机的缺陷就立刻暴露出来:状态之间出现模糊地带、条件互相矛盾、新增场景需要改旧规则,改着改着整个状态机变成一团拆不动的意大利面。
1.3 决策输不起:与感知层完全不同的容错逻辑
感知模块出错,比如把一个静止障碍物识别成移动目标,后果虽然严重,但下游还有可能通过跟踪算法、运动状态估计把这些误检拉回来。决策模块出错,没有下一层去兜底,错误直接体现在车的实际行为上。这导致决策算法的测试逻辑与感知完全不同——感知可以用标注数据的准确率来评估,决策必须放到连续的实际驾驶情境里去验证,而真实世界的驾驶情境是不可穷尽的。
这意味着决策算法的开发节奏天然比感知慢。感知模型可以每天迭代、每天在测试集上刷新指标,决策算法却常常花了两周调好的策略,放到一个没见过的路口场景里就直接翻车。这种"局部优秀、全局失灵"的挫败感,我至今记忆犹新。
2. 四派主流路线:规则、概率、模仿与端到端的取舍
2.1 规则与状态机:能解释,但天花板很低
前面提到有限状态机,其实它是一大类"手写规则"路线的代表。这套路线的本质,是把驾驶知识由工程师显式地编写成"如果-那么"的逻辑链。优点是显而易见的:行为可解释、便于逐条审查、不需要海量驾驶数据,而且系统里几乎不存在玄学问题,出bug可以在几个小时内定位。所以直到今天,量产L2辅助驾驶里的ACC自适应巡航、LKA车道保持,核心决策部分仍然大量使用结构化规则,只不过会在规则之上叠加一些概率推断来增强适应性。
缺点是前面说的组合爆炸。工程上为了缓解这个问题做了很多妥协,比如把决策任务拆分到不同功能域(纵向一个模块、横向一个模块),再通过仲裁器统一调度。但仲裁逻辑本身又会引入新的复杂度,尤其是当纵向决策和横向决策出现冲突时——前车减速同时旁边车道又有车,纵向说要急刹,横向说要变道避让,仲裁器到底听谁的?这类边界case我调试过太多,最后往往只能为它增加一条特判规则,然后特判规则又引发新的边界。
2.2 概率图模型与POMDP:把不确定性搬进数学框架
第二派思路是用概率工具处理不确定性,最典型的代表是部分可观测马尔可夫决策过程(POMDP)。它的核心思想非常优雅:承认自车对其他车辆意图、行人下一步动作是不完全知道的,于是把这种"不知道"形式化为状态里的不确定性,并把决策的目标设定为"在长期期望回报最大的前提下采取动作"。
这一派的优势在于把决策问题变成了一个数学上可定义的优化问题。你不需要猜测某个场景里"谁该让谁",只需要设计好奖励函数,让系统自己权衡。它的代价是计算复杂度极高——精确求解POMDP问题在计算上一般是不可行的,工程落地几乎都要做近似,比如把连续状态空间离散化、只考虑未来有限时间步的滚动优化、或者用蒙特卡洛树搜索去有选择地探索。关于这个具体思路,我下面会单独展开讲,因为它几乎是我见过的最能反映"决策算法思维"的模型,也是我个人项目里用得最多的一派。
2.3 模仿学习:行为自然,但当心"学坏"
第三派是模仿学习,包括行为克隆和逆强化学习。做法很简单:采集大量人类驾驶数据,用一个深度神经网络学习人类驾驶员在给定场景下的操作(方向盘角度、油门开度)。行为克隆的思想近似"抄作业",优点是数据足够多时,学出来的行为非常自然,没有规则系统那种机械感,也不会出现规则边界生硬切换的顿挫。我见过有些团队做出接近人类驾驶风格的变道策略,乘客几乎察觉不到机器在开车。
但它的缺陷同样明显:数据里有什么它就学什么,数据里没遇到过的场景,它的表现完全不可控。更麻烦的是,人类驾驶数据本身包含大量不够安全、不够合规的行为——比如压线变道、跟车过近、过度加塞。模型会把这些行为一起学进去,业内称之为"补偿分布下的人类次优性"问题。你可以通过设计逆强化学习,试图从数据中反推出人类驾驶背后的奖励函数,但奖励函数本身的可辨识性又有限:同样的驾驶轨迹,既可以用"喜欢变道"解释,也可以用"对当前车道烦了"解释。这个歧义问题至今没有被彻底解决。
2.4 端到端:一股争议巨大的新潮流
第四派是最近几年重新热起来的端到端方案。它不再区分感知、决策、规划这些模块,而是直接让视觉输入映射到方向盘和踏板控制信号。从整个系统的架构简洁性来看,这是最优雅的路线,因为它意味着决策不再是一个独立模块,所有智能都由一个大的神经网络模型承载。
但作为一线从业者,我必须提醒:端到端的可解释性几乎为零。你可以通过可视化手段观察网络关注了哪些像素,但你很难回答"为什么它在这里选择变道"。在安全认证和事故分析上,这会成为一把巨大的锁。业内做L4级别商业化运营的团队,几乎没有谁敢把所有决策完全交给一个不可解释的端到端模型,更多是把端到端当作决策规划模块的候选策略之一,用影子模式持续验证,再决定能不能上线。
四派路线各有各的适用场景,我把它们的核心差异整理成了下面这张表格,方便对照理解:
| 决策路线 | 可解释性 | 数据依赖 | 复杂场景泛化能力 | 工程落地难度 | 典型适用阶段 |
|---|---|---|---|---|---|
| 规则/状态机 | 很高 | 低 | 低 | 低 | L2量产、封闭园区 |
| POMDP等概率模型 | 较高 | 中 | 中高 | 高 | L3/L4复杂交互场景 |
| 模仿学习 | 低 | 很高 | 中 | 中 | 行为风格优化 |
| 端到端 | 很低 | 很高 | 高(理论上) | 极高 | 研究前沿、影子模式 |
3. 一个具体思路的拆解:POMDP决策模型是怎么被用到驾驶场景里的
3.1 五个要素一个个对着开车场景去套
POMDP之所以值得认真研究,是因为它提供了一个非常通用的问题描述框架。它由五个要素构成:状态集合、动作集合、观测集合、状态转移函数、观测函数和奖励函数。我一开始学的时候觉得全是数学符号,但后来发现直接对着驾驶场景去套,理解成本会大幅下降。
状态集合描述的是系统内所有可能的状态,包括自车的速度位置、他车的速度位置、他车的驾驶意图(比如他会不会让行)、行人的下一步动作意图。动作集合是决策输出,包括纵向的加速、匀速、减速、刹停和横向的保持、变道。观测集合是传感器能看到的东西,比如相对距离、相对速度、转向灯信号。状态转移函数描述的是在自车执行某个动作后,世界状态以多大概率从一种状态变成另一种状态;观测函数描述的是传感器得到某个观测时,真实世界状态可能是哪些;奖励函数则给每个动作在特定状态下打一个分数,作为决策好坏的评价标准。
看到这里你可能发现了,POMDP的关键在于把"他车意图"当作状态的一部分。这在感知模块里是绝对问不出来的,它属于隐藏状态,只能通过观测不断去推理。举个例子:旁边车道那辆车一直打转向灯,更靠近车道线。在POMDP框架下,自车会维护一个关于"对方意图变道"的概率分布,一开始可能是30%,随着对方车辆横向位置不断靠近车道线,这个概率逐渐上升到60%、80%。决策层根据这个概率去权衡:如果现在就减速让行,即便对方没打算变道,我损失的只是几秒时间;如果保持油门顶上去,一旦对方真的变道,安全余量会急剧下降。两相比较,大概率就会得到"让"这个最优策略。
3.2 奖励函数设计才是真正的战场
在POMDP框架里,真正决定系统"性格"的是奖励函数。安全距离、通行效率、乘坐舒适性、规则遵守程度,都要翻译成一个具体的数学分值。这里最考验经验的地方在于各项之间的权重。
我做过一个很粗糙但很有代表性的实验。把"惩罚追尾风险"的权重设得极高,系统在面对所有场景时的统一反应都是尽早减速、加大跟车距离、放弃一切高风险变道。结果是安全指标非常漂亮,但车变成了一个"路障",在高速上见车就让,在匝道汇入时永远等不到间隙。把它放到真实道路测试里,唯一的评价就是驾驶员受不了,乘客晕车。反过来,把"通行效率"的权重调高,车会变得极其激进,跟前车贴得近、变道果断,偶尔还能做出让安全员吓一跳的高风险穿插。
我踩过的坑是:每次调完权重,都以为只要在仿真里验证就行,结果一到真实道路就发现仿真环境里"礼貌"的对手车和真实驾驶员完全不一样。真实驾驶员不会严格按照仿真模型来反应,你加速他也加速,你减速他反而贴上来,这是一个闭环博弈过程,不是开环预测。后来我总结出来一套比较实用的做法:奖励函数里的安全项要做成非线性的阶梯惩罚,而不是简单线性加权。比如时间碰撞裕量(TTC)大于3秒时,安全项的代价几乎为零;TTC低于3秒后,代价呈指数式上升;TTC跌破1.5秒,直接设为绝对禁忌。这样调出来的系统,在正常场景下不会因为安全项过高而畏首畏尾,在紧急场景里又能毫不犹豫地做出保守决策。
3.3 近似求解是工程常态:把求解问题缩小到算力能扛住的程度
POMDP的精确求解是一个公认的难题,工程上不会有人去追求严格最优解,而是做各种各样的近似。最常见的一种做法是把连续状态空间离散化。因为真实世界的位置、速度是连续值,但你在求解时不可能对连续空间里的每一个点都做概率推演,只能把速度离散成几个区间、横向位置离散成几条车道、意图离散成几个典型选项。
另一个常见做法是滚动时域控制。不从头算到终点,而是每过几百毫秒重新做一次规划,每次只看未来几秒的决策窗口。这样计算复杂度被限制在一个可以接受的范围内。再加入蒙特卡洛树搜索,对当前状态下未来可能的动作序列做随机采样,重点关注那些高概率的转移分支,剪掉低概率的探索分支,进一步提升求解效率。
我实际调试的感受是,这些近似手段的取舍直接影响系统在极限场景下的表现。离散化的粒度太粗,系统就像近视眼看不清远方,等到看清了危险已经太近;粒度太细,计算时间超标,决策输出延迟,车开起来有明显的"思考停顿"。合理的做法是让离散密度跟随风险动态自适应:周围没有车时用粗糙的网格快速给出宏观策略,周围车多或距离近时加密网格,做更细致的推演。
3.4 一个能复现的简化实验思路
如果你想亲自感受一下决策算法的调参魔力,不需要一台自动驾驶实车,可以搭一个简化版的仿真环境:一条双向两车道的直路,自车要从路口左转,对向有一辆直行车,不考虑行人和其他干扰。给对向车的速度设置几种可能性:慢速、匀速、加速。然后给自车定义三个动作:等待、缓慢滑行、正常加速左转。状态只用两个变量表示:对向车距离和自车是否已进入路口。
你先用最简单的状态机写一套规则:对向车距离大于某个阈值就正常加速左转,否则等待。跑几千次随机场景,记录下来成功率。然后改用POMDP,奖励函数里同时考虑通行效率和碰撞风险,再加上对"对向车正在加速"的概率估计。让仿真环境里的对向车,有一部分概率在它接近路口时会突然加速。对比两种方案在"对向车加速"这种意外情况下的表现,你会发现规则方案在阈值附近的处理非常僵硬,要么错过窗口,要么赌概率硬冲;而POMDP方案会表现出某种"试探性"动作——先缓慢向前一小段,观察对向车反应之后再决定是继续走还是刹停。这种试探性在人类驾驶员眼里就是"老司机在路口探头观察"的同款策略,而这正是概率决策模型的精髓所在。
4. 数据、仿真与评测:怎么证明决策算法真的能行
4.1 数据的边界:人类数据、仿真数据与对抗生成
决策算法测试离不开数据,但决策算法需要的数据和感知模型需要的数据不太一样。感知模型要的是带标注的图片点云,决策算法要的是包含完整场景上下文、带时序关系的驾驶情境数据——你得知道前车过去3秒是怎么走的、路口的信号灯是什么状态、周围车辆的相对运动关系。这类数据的获取成本比感知标注数据高得多。
目前主要来源有三个。第一是量产车队回传的真实道路数据,质量最高、最接近部署环境,但覆盖的长尾场景非常有限——你很难指望真实路采数据里刚好包含"前车急刹后行人横穿"这种极小概率事件的完整组合。第二个是仿真数据,在虚拟环境里通过修改参数生成大量可控场景,覆盖面可以比真实数据广,但仿真数据天然存在sim-to-real gap,仿真里生成的"逼真"传感器数据和真实传感器特性之间总有偏差。第三个是对抗生成数据,也就是让一个专门做场景生成的学习器不断去找当前策略的短板,把决策器搞挂的场景优先生成出来。这个方法我觉得是未来最值得投入的方向,因为它直接把数据生成和系统瓶颈绑定在了一起。
4.2 仿真评测的分层思路:从场景库到闭环博弈
仿真分层评测的核心思路是从简单到复杂逐步逼近真实世界。第一层是单场景开环测试,把记录好的真实场景回放给决策模块,看它的输出是否合理。这一层只能发现"输出异常",发现不了"交互博弈问题",因为场景里其他车辆的行为已经被固定写死了,决策器怎么开都不会影响他们的轨迹。第二层是闭环场景测试,模拟环境里的其他车辆会根据自车行为做出反应,这时候你才能真正考察决策器的博弈能力。第三层是大规模随机场景测试,不是人工一个个写场景,而是随机组合天气、障碍物位置、他车速度,对决策器做压力测试。
我个人的经验是,场景库的构建不能只看数量,更要看难度覆盖。有的团队号称有百万级场景库,但九成以上都是轻松通过的普通场景,真正暴露问题的可能只有几千个。做评测要专门建立一套"边界命中率"指标,记录那些深度小于一定值、决策只能非常仓促地应对的场景占比。这套指标比总通过率更能反映决策器的真实水平。
另外,要在仿真里做对抗性测试。你可以设计一个专门"为难对手"的模型,让它扮演一辆贴着自车侧后方快速接近并强行变道的车、一辆在路口故意慢悠悠压着黄灯通过的公交车,还会在自车启动时突然加速鸣喇叭的摩托车驾驶员。决策器必须在这些不太友善的对手面前稳住阵脚。
4.3 评估指标的迷思:接管率不该被神化
关于决策算法"好不好",业内最常见的指标是接管率,也就是安全员平均多久需要干预一次系统。但这个指标在工程管理上存在明显的缺陷。接管率高可能说明系统本身不稳定,也可能说明安全员愿意干预的阈值很低——只要方向盘有一点微小的不舒适就接管。反过来,接管率低也不代表系统真的安全,可能是因为安全员已经被系统"训练"得麻木了,在没有持续发生危险的情况下选择不干预,而一旦发生危险就是已经来不及干预的情况。
我比较推荐用多维度指标来做综合评价:安全指标看最小时间碰撞裕量(MTP)和最小刹车距离,舒适性看加速度变化率(冲击度),通行效率看平均速度与人类驾驶基线的比值,行为合规性看压实线、违章变道次数。这里每一个指标单独看都会说谎,组合一起看才能相对客观地反映系统能力。我在做某次内测报告的时候发现,一个策略的通行效率提升了12%,但乘客晕车概率提升了40%——单独看效率指标会做出错误的上线决定,但把舒适性指标一起拉到台面上,决策就很明显了。
4.4 从离线重放到公共道路:层层递进的验证流程
决策算法从代码到量产,我个人习惯按照"离线回放—仿真闭环—封闭场地—公共道路"四步走,每一步都有不同的目的,不能跳级。
离线回放用真实路采数据快速发现明显的策略逻辑bug,成本最低、可重复性最好。仿真闭环用于调整策略风格和交互博弈参数,可控性强。封闭场地测试是验证极端危险场景的第一道真实屏障:放置一个人形假人模拟行人横穿、用一个气球车模拟急切入的前车、铺设湿滑路面材料验证附着系数。这一步风险可控,因为环境是隔离的,你可以放心地让决策器在极限边缘试探。公共道路测试是最后一步,也是压力最大的一步。通常需要先让决策器以影子模式运行——它只输出决策建议但不下发到执行器,安全员正常驾驶,但工程师可以同步分析影子决策与真实人类操作的差异,去发现那些"系统觉得对的、但老司机觉得有问题"的时刻。
这四步做完,决策算法才称得上具备了上车条件。但我要提醒,别把这一步当成终点。真实世界里的决策系统必须带着一个持续反馈闭环:每一段真实运行的数据都会流入离线评测集,一旦策略更新,马上要用新数据重新回归。
5. 冷静下来想想:热点背后被忽视的问题
5.1 "算法越复杂越好"是个性价比陷阱
每次大模型的热潮涌过来,就会有人觉得决策模块也一定要往最前沿的技术上靠,好像不用上最新的方法就显得技术落后。但从工程实践角度出发,复杂度是需要付出代价的。决策系统的复杂度越高,验证其可靠性的难度就越大,安全认证需要覆盖的场景就越多,解释一个异常行为所需花费的时间也就越长。
这就带来一个工程上的性价比问题:一个用规则和简单概率模型实现的决策器,如果已经能在99%的安全场景里表现良好,剩下1%的极端场景是现有算力、认证能力和数据积累都覆盖不住的,那么花大力气上复杂模型可能并不能实质性地提升安全性,反而会让系统更难维护。在做架构选型的时候,我会更倾向于先选择复杂度适中、可解释性够的方案把系统跑稳,再在有限范围内逐步引入更复杂的技术。复杂算法应该服务于确定性已知的业务瓶颈,而不是服务于"看起来很前沿"的冲动。
5.2 决策算法里藏着的"驾驶人格"
很多人没意识到,一个决策系统的参数组合,本质上定义了一种驾驶人格。安全权重高一点、效率权重低一点,车就变成了一个佛系老司机;反过来就变成了一个喜欢穿插的激进驾驶者。这种人格上的取舍不只是工程问题,它直接关系到用户信任和公共接受度。
我曾经在一次场地测试中对比过两套参数。一套偏保守,在没有任何风险的情况下,也会在三岔路口停车观察两秒钟再走。从安全角度挑不出毛病,但车内乘客会明显感觉"这车怎么这么犹豫",在测试报告里给的反馈是不信任。另一套偏激进,变道果断利落,多数乘客表示"感觉像真人开的",但工程师团队对着数据分析后认为,有几次变道的安全裕量已经逼近底线,一旦对向车反应比预期快半秒就会出问题。
自动驾驶系统太怂了会被吐槽堵路,太莽了会出事故。现实里要找到那个平衡点,需要大量真实道路测试数据来做标定,而且不同城市、不同人群的驾驶风格差异又会把这个问题继续复杂化。
5.3 我比较看好的几个后续方向
说到之后可能更有价值的方向,第一个是可验证的强化学习。也就是在传统强化学习的基础上,给模型加一层形式化验证的约束:模型可以自由探索策略空间,但最终学出来的策略必须满足一组预先定义的安全不变量。这种做法把学习能力和安全保证做了解耦,比纯粹的"学就完了"要可靠得多。
第二个是更细粒度的风险意识建模。现在的决策系统大多用一个概率值来描述风险,但真实驾驶场景中,风险和收益的形态往往不是单点的。某个变道动作在90%情况下只节省两秒,在10%情况下可能增加碰撞概率。这种带长尾特征的风险-收益分布,值得用更细致的模型去表示,而不是简单地在期望值上做取舍。
第三个是跨车协同的博弈决策。当道路上多辆自动驾驶车共享意图信息时,决策问题会从单车的部分可观测博弈变成多车协同的已知信息博弈。这会让很多无谓的保守行为得到缓解——两辆自动驾驶车都不用互相"试探",就知道对方会让还是不让。这个方向在短时间内不会成为主流,但它是决策算法在效率层面实现突破的一个重要可能。
做决策算法这几年,我最大的体会是:安全不是靠某一条完美策略达成的,而是靠多层的容错设计。一个策略在决策层做出A决策,但它的底层规划模块要在A决策不可行时仍有B方案保底,底层控制层在规划异常时还能靠极限刹车保持物理安全。每一层都多留出半秒的冗余,整体系统的安全边际就会宽出不少。
最后一个建议送给想在这个领域长期深耕的朋友:不要太执着于让决策器在任何场景下都做"最优解",试着去关心它在"不完美"的时候是否能保持安全。我后来在仿真环境里会故意给决策器配置一些明显有缺陷的奖励函数参数,看它在次优策略下会不会做出不可逆的危险动作。这个"故意犯错测试"比所有正向测试加起来都更能暴露一个决策系统的真实可靠性。