做决策规划这一行,到今天正好跨过完整的十年。这十年里,我从用上千行规则代码撑着决策树的时代走过来,也从头参与了用优化框架重构规划器的项目,再到近两年带着团队在仿真环境里调强化学习策略。“决策规划”这四个字的含义,在这十年里被彻底改写——十年前它更多指一套状态机和几何曲线,如今它是预测、决策、规划、控制交织的复杂系统,甚至开始被端到端模型重新定义。这篇文章我想把这十年的演进脉络、关键选型逻辑、以及我在工程化过程中踩过的坑,完整地梳理一遍。无论你是刚入行想做决策规划算法,还是已经在做规控模块但想补全历史拼图,这份记录应该都能给你一些参考。
1. 十年起点:规则逻辑与状态机的黄金时代
1.1 决策层的老底子:有限状态机
十年前如果你打开一辆智能车的决策模块,十有八九会看到一个有限状态机(FSM)。所谓决策,本质就是枚举场景:当前是跟车、是静止等待、还是换道、是超车、还是靠边停车,每一个状态对应一套行为参数,状态之间用一组条件和优先级去切换。
我在早期项目里就维护过这样一套状态机,节点大概几十个,切换条件超过两百条。每条条件都是工程师从实车测试和场景分析里总结出来的经验,例如“当前车道前车距离小于三十米且持续一秒,邻车道后方来车相对速度小于某个阈值时,才能发起换道”。这套东西的好处非常明显:可解释、可调试、好预期。出了问题打开状态机图,从哪个状态跳到了哪个状态,一目了然。坏处也很致命:条件之间存在大量隐式耦合,改一条阈值,可能让另一个路口的行为变得奇怪。
那时候团队里最怕的不是开发,是加场景。每发现一个新的十字路口行为不满足预期,就要在状态机里加分支、加嵌套、加优先级。维护到后期,状态图已经复杂到没人敢轻易动它,因为改任何一处都可能引发连锁反应。
1.2 早期的规划器:几何曲线与速度剖面
决策层给出指令后,规划层负责把它变成一条可执行的轨迹。早期的规划器和今天完全不是一个画风,路径规划常用多项式曲线、圆弧拼接、直线圆弧组合这类几何方法,速度规划则多用梯形速度曲线或者S型速度曲线。
当时做换道,我会在目标车道中心线附近采几个横向偏移量,用五次多项式把当前点和目标点拼起来,然后用当前车速和限制加速度去算速度剖面。这种方案在低速、空旷、结构化的场地里表现不错,所以早期的园区车、封闭场景示范项目大多这样工作。
但一进开放道路就露馅。路面曲率变化、横坡、障碍物分布不均,这些几何方法很难把“舒适”和“安全”同时表达清楚。我还记得有一次在园区里做测试,一个小半径弯道加路肩石边缘,多项式曲线硬是拧出了一个让乘客明显前倾的姿态,调参调了整整三天,最后也只是把一个弯道做好了,换个半径又得重来。
1.3 规则方案的天然天花板
现在回头看,规则状态机方案的天花板不是算法本身,而是场景的组合爆炸。真实交通里,路口、车道线模糊、行人横穿、非机动车逆行、施工改道,这些要素叠在一起,用规则去枚举几乎是不可能的。
我算过一笔账:如果状态机只有十个状态,每个状态有五个关键判断条件,理论上的行为组合就已经过万,更不用说每个条件还带连续阈值。到后期,团队真正的瓶颈不是写规则,而是如何证明这些规则在所有组合下不会冲突、不会漏判。这件事靠人肉review做不到,靠穷举测试也做不到。
所以从那时起,行业逐渐意识到:决策规划不能只靠“人写逻辑”,需要一个更能表达复杂约束和不确定性的框架。这个认知,直接推动了接下来五年的技术换代。
2. 中间十年:搜索、采样与优化方法的合流
2.1 架构分层:预测并入主流水线
从规则状态机向现代架构演进的第一个标志性变化,是“预测”正式成为决策规划的上游模块,而不是一个可有可无的附件。早期很多方案根本不预测,默认周围车辆保持当前速度,决策只响应当前帧状态。这个假设在车少的时候还能用,一旦遇到旁车减速让行、对向车抢道、行人犹豫不决,反应就总是慢半拍。
后来的主流架构逐渐固定为:感知、预测、决策、规划、控制,五层串行。预测模块输出周围目标在未来几秒内的可能轨迹,决策模块根据这些轨迹选择行为意图,规划模块在意图约束下搜索并优化出一条可行轨迹。这个分层的本质,是把“不确定的未来”拆成“先评估,再应对”的流水线。
我参与重构的第一个大型项目,做的就是这件事。最大的感触不是算法切换,而是接口设计。预测输出多少条候选轨迹?每条轨迹带什么置信度?决策是直接选一条还是综合多条?这些问题看起来是定义问题,实际上决定了整个系统的上限和可调试性。
2.2 路径规划器从“几何”走向“搜索”
规划层的换代更为剧烈。几何方法逐渐被采样和搜索类方法取代:栅格地图上的A*、Dijkstra成为全局路径规划的标配,局部规划里RRT系列、状态栅格(Lattice)方法开始普及。
这里有个很关键的工程经验:RRT这类随机采样方法在低维空间里有效,但直接用于车辆轨迹规划,必须考虑运动学约束。所以后续出现了混合A*,在状态空间里做栅格化,再结合车辆最小转弯半径做节点扩展。我在一个泊车项目里用过混合A*,它能在狭窄空间里硬找出一条能拐出来的路径,这是几何方法完全做不到的。
不过搜索方法的问题在于解往往不平滑,所以工程上很少直接执行A输出的折线路径。常见做法是把搜索作为“拓扑决策”:先用A或混合A*求出宏观路径,确定走哪条路、绕过哪片区域,再用局部优化生成平滑轨迹。这个“全局搜索做布局,局部优化做平滑”的组合,成了那几年规划器的主流形态。
2.3 轨迹优化:把安全与舒适写进目标函数
如果搜索解决的是“往哪走”,轨迹优化解决的就是“怎么走得舒服又安全”。这到五年前已经成为行业标配:把轨迹生成建模成一个带约束的最优化问题,目标函数里包含加速度、加加速度、横向偏移误差、与障碍物的距离惩罚,约束条件里包含车辆动力学、执行器极限、交通规则。
我记得第一次把轨迹生成从几何插值换成优化框架时,感受完全是降维打击。以前多项式曲线只能保证端点位置和姿态,中间过程是否碰到障碍物要靠采样点一个个检查;优化框架则可以把“离障碍物太近”写成一个惩罚项,让解自动往安全区域偏。更重要的是,安全性约束可以被显式建模,比如横向加速度不能超过某个值、前轮转角不能超过某个极限,这些在几何方法里都很难处理。
但这套方法也有代价:优化问题如果建模不好,很容易陷入局部最优。我遇到过很多次,优化器给出的一条轨迹在代价函数上确实比当前轨迹好,但实际开起来却是在跟一个障碍物“顶牛”。后来才明白,这类问题多半是目标函数里缺乏对“行为意图”的引导——也就是决策层只给了终点约束,没有告诉规划器优先走左侧还是右侧。所以后来越来越多的系统选择让决策层不仅给目标点,还给走廊约束或语义引导,把“决策”和“优化”的边界重新模糊化。
2.4 决策边界模糊:从状态机到约束与博弈
到了这个阶段,决策层本身也在变。原来那种离散的“状态跳转”逐渐被更连续的决策表达取代。比如换道决策,不再是一个布尔值,而是“换道时机”和“换道轨迹”的联合求解;让车决策,也不再是简单避让,而是通过预测与规划反复迭代,形成一个带博弈意味的交互策略。
这背后其实是一个本质认知转变:交通行为不是一个单方决策问题,而是一个多方博弈问题。你打方向灯,后车可能加速也可能减速;你减速让行,行人可能走也可能停。所以决策规划系统必须具备“我预期你预期我”的推演能力。
有些团队用轻量级博弈模型,比如把周围车辆的意图作为隐变量,在规划时做少量前向模拟;有些团队把决策问题转成带约束的优化,用“安全距离走廊”来隐式处理交互。但共同点是,过去那条“决策-规划”的硬边界已经撑不住了,必须把意图与轨迹放在一起考虑。
也是在这个阶段,行业里出现了比较成熟的三代方案对比:
| 方案 | 决策表达 | 规划方式 | 优势 | 主要问题 |
|---|---|---|---|---|
| 规则状态机 | 离散状态 | 几何曲线 | 可解释、易调试 | 场景组合爆炸 |
| 搜索与优化 | 离散+连续混合 | 搜索+数值优化 | 可处理复杂约束 | 局部最优、计算量大 |
| 学习与博弈 | 连续策略/交互模型 | 学习生成或优化 | 适应性强、能处理不确定 | 可解释性差、安全验证难 |
这张表基本概括了我过去几年在不同项目里的体感:并没有一个方案能通吃所有场景,最后的系统形态几乎都是三者混搭。
3. 近五年:学习范式的冲击与现实的融合
3.1 模仿学习成为数据入口
大概从五年前开始,深度学习方法开始大规模涌入决策规划领域。最早产生实际效果的是模仿学习,也叫行为克隆:直接拿人类司机的轨迹数据训练一个模型,输入是感知和地图信息,输出是方向盘转角或目标轨迹。
模仿学习的吸引力非常直观——人类司机就是海量数据的免费标签。我在一个高速巡航项目里试过用模仿学习做换道决策,数据量到几千小时时,模型已经能很好地学习常见的换道时机和加速度曲线,行为风格甚至比一些手调规则更接近真人。
但模仿学习的坑也很深。最大的问题是“分布偏移”:模型训练时见过的大多是常规驾驶数据,一旦遇到训练分布之外的场景,输出就可能变得不可预测。而且人类驾驶数据里充满隐式的交互博弈——你判断对方会让还是不会让——这些很难在行为克隆中学到,因为模型只看到了最终轨迹,没有看到背后的推理过程。
所以我的实操经验是:模仿学习适合用来生成“初始策略”,适合做暖启动,但绝不能直接作为安全关键决策的唯一来源。后面几乎所有项目,模仿学习的输出都会再接一个安全过滤器或优化网络,把不可信的原始输出拉回安全域内。
3.2 强化学习:仿真里跑分,实车上求生
强化学习(RL)在决策规划里的热度这几年一直很高,但落地难度也是肉眼可见。我最早在某个开放场地项目里试过DQN,训练几百轮后在仿真环境里确实能学会避障,但一上实车就崩——仿真里的动力学、传感器噪声、时延都和现实对不上,这个差距就是常说的sim-to-real gap。
后来我们做了两件关键的事才逐渐让RL真正可用。第一是领域随机化:训练时把车辆质量、轮胎摩擦系数、传感器噪声、控制延时都加随机扰动,逼着策略学出对参数变化鲁棒的方案。第二是安全层约束:RL策略输出的目标可以任意,但底层规划必须通过一个硬安全约束检查,比如最小碰撞距离、最大减速度,如果违反就回退到保守策略或直接触发紧急制动。
现在我对RL的定位很清楚:它擅长的是在规则和优化都难写的高维交互场景里,找到一个“足够好”的策略雏形,但产品化的时候,策略外面必须裹上确定性兜底。奖励函数设计更是泥潭,稀疏奖励训练不收敛,密集奖励又容易让策略钻漏洞,比如为了减少加加速度惩罚而贴着障碍物边缘走。这类问题没有银弹,只能靠扎实的仿真评估和逐场景分析去一轮轮调。
3.3 端到端热潮下的冷思考
最近两三年,端到端成了无法回避的话题。所谓端到端,就是从传感器原始输入直接输出控制指令或轨迹,决策和规划不再有明确边界。支持者认为模块化架构存在信息瓶颈,感知压缩损失了太多细节,端到端用一个完整模型可以保留更多信息。
从我自身的经验看,端到端确实有令人兴奋的潜力,但它目前最大的问题不是效果,而是工程可控性。模块化系统里,我可以单独看感知漏检了、预测偏了、规划撞了,每一层都有单独的评价指标和调试手段。端到端出了事故,你很难知道是网络哪一层出了问题,更难以用传统工具去定位。此外,安全验证的方式也会完全不同——模块化系统可以对预测模块做穷举测试,端到端模型做不到这种“单元验证”。
所以现实中的做法越来越趋向于混合架构:感知用端到端模型,提供更丰富的语义信息;决策和规划保留模块化或半模块化结构。决策部分用学习模型生成意图,但轨迹优化和安全检查仍然走确定性的约束求解。这个路线稳妥,也更容易过安全评审,我个人认为未来很长一段时间都将是主流。
3.4 基础模型带来的新变量
最近一两年,大语言模型和多模态基础模型也开始试探性地进入决策规划领域。它们最直接的用法是做“场景理解”和“常识推理”:比如某个路口没有护栏但地面有大量刹车痕迹,普通视觉模型只会当成普通路面,但结合自然语言知识的基础模型可能推断出这里事故频发,需要更保守的决策。
我在一个模拟项目里试过把基础模型当作决策前置模块:用视觉-语言模型输出场景的语义描述,再把这些描述注入传统的规则规划器。效果是喜忧参半的——对常见场景的描述非常贴切,但在少见的长尾场景里,模型可能一本正经地给出错误推理,而且这种错误比感知漏检更难识别。
不过我更关注的是,这类基础模型带来的并不是某个算法突变,而是“先验知识”的注入方式变化。以前人类的交通常识要一条条写成规则,现在可以让模型在训练时从海量文本和视频里隐式学到。这个变化会让决策规划系统更快地适应新场景,但也对验证体系提出了更高要求。
顺便说一句,决策规划这个概念并不只在智能车领域。我做过的调度系统、仓储机器人路径规划、供应链订单决策,背后几乎都经历了从规则到优化再到学习的相似演进。底层的决策逻辑是通用的,只是约束和目标函数不同,所以这套方法论可以迁移到很多行业场景。
4. 工程化演进:让决策规划从论文走向产品
4.1 仿真与场景库:把真实世界搬进实验室
决策规划算法迭代快不快,很大程度上取决于测试体系。十年前的仿真基本是桌面级的小场景,一条直线路、一个障碍物,跑通就算完。后来行业意识到,真正决定系统水平的是长尾场景覆盖率,于是开始系统性地建场景库。
场景库不是简单堆几百段录像,而是要对场景要素做结构化拆解:道路拓扑、车道数、曲率、坡度、天气、光照、交通参与者类型、相对位置、相对速度、意图组合。每个要素的不同取值组合在一起,就形成一个场景谱系。我所在团队的方法,是把真实路采数据先自动挖掘成片段,再通过参数化变异生成大量相似但不完全相同的场景,灌进仿真里做回归测试。
这个做法的价值在于,决策规划最怕的不是一个已知问题,而是“上一次改动破坏了某个过去明明好的场景”。有了场景库和自动回归,每次代码修改都能在几百上千个场景里跑一遍,哪个行为退化一目了然。可以说,如果只让我给一个新团队一个建议,我不会建议先上多先进的算法,而是建议先把场景库和自动化评估搭起来。
4.2 安全兜底与降级策略:永远假设会出错
十年做下来,我认为决策规划最重要的一个原则就是:永远假设上游会出错、模型会失效、预测会偏差,然后把兜底做得足够硬,比追求任何单点算法的先进性都重要。
具体来说,一套成熟的系统至少要有三层兜底。第一层是预测兜底:如果预测模块给的轨迹置信度很低,决策层要能主动降低对预测的依赖,拉大安全距离。第二层是规划兜底:优化求解失败、搜索超时,要有预先算好的安全停车轨迹,能在任意时刻执行。第三层是控制兜底:即使上层全失效,底层还有基于安全距离和最大制动能力的直通保护逻辑,它不应该经过复杂的决策推理,而应该像保险丝一样直接断开危险状态。
我记得有一次真实路测,感知模块因为逆光把前方静止的施工锥桶漏检了两帧,决策层的数据里瞬间没有任何障碍物。如果不是规划层做了“状态保持+障碍物记忆”的机制,系统大概率会直接加速过去。这件事之后,我再也没有怀疑过兜底设计的必要性。
4.3 可解释性与调试:出了事故怎么定位
随着系统复杂度上升,“可解释性”从加分项变成了必需品。产品事故后,第一个问题永远是“决策规划当时为什么这么做”。如果系统是个黑盒,这个问题根本无法回答。
我们常用的做法有三层。第一层是结构化日志:每一次决策切换、每一条规划轨迹的代价函数各项分值、每条预测轨迹的置信度,全部按时间戳记录。第二层是可视化回放:在仿真环境里同步回放感知、预测、决策、规划四层数据,能暂停、能查看任意时刻的输入输出。第三层是决策依据标注:在轨迹上标注“这里因为右侧障碍物距离小于阈值,所以选择了左侧绕行”这样的解释文本,极大降低事故分析成本。
这套体系听起来不复杂,但很多团队都是出了几次事故之后才开始补的。我的建议是,决策规划模块从第一天起就要设计成可debug的,而不是等到出了问题再试图加日志。
5. 十年踩坑实录:实操细节与避坑经验
5.1 长尾场景:不是统计问题而是系统问题
处理长尾场景,最容易犯的错误是把它当成一个“多收集数据”或“多加点规则”的问题。但实际经验告诉我,长尾场景是一个系统问题,必须从场景发现、仿真训练、安全兜底三个层面同时解决。
场景发现层面,不能只看人工上报,要有自动挖掘工具从路采数据里寻找异常片段,比如急刹、偏离中心线、方向盘抖动,这些往往是决策规划的隐性失败。仿真训练层面,要能对场景做组合式变异,把单场景变成场景族。安全兜底层面,刚才已经强调过,面对任何没见过的场景,系统最差也要能做出“安全停车”或“低速通过”,绝不能给出一个自信但危险的轨迹。
我现在对“corner case”这个词已经有些保留意见。因为它暗示是一个个孤立的边角,但实际上这些所谓边角在概率上并不独立,它们聚集在长尾分布里,随便拿出两个都能组合出新的边缘情况。应对它的根本思路,不是穷举,而是让系统对“不确定”本身有敬畏,输出置信度低的时候自动降级。
5.2 预测与规划的接口设计:输出什么比怎么算更关键
决策规划系统里,我认为最容易被低估的接口是预测模块的输出表示。预测模块辛辛苦苦算了半天,给规划器传什么格式的数据,直接决定整个系统的上限。
最简单的接口是传一条最可能的轨迹,规划器拿它当参考。这个方案实现快,但一旦预测错了,规划就没有回旋余地。稍微好一点的是传多条带置信度的轨迹(多模态预测),规划器在代价函数里对每条轨迹分别评估,选择整体风险最低的行为。这个方案对预测质量的要求依然很高,但它给规划器留出了“综合判断”的空间。
实际操作中我踩过的一个坑是:预测模块输出了十条轨迹,但其中真正有区分度的只有两条,另外八条几乎一样。规划器面对冗余轨迹时,反而会被多数投票效应误导,以为某个方向的可能性极高。后来我们增加了聚类和后处理,把轨迹集压缩到几类代表性的意图,而且强制要求每条轨迹携带一个“存在概率”和一个“风险等级”,规划器将这两个量直接放进代价函数。
5.3 上下游协作:感知与控制之间的决策夹层
决策规划位于感知和控制之间,位置决定了它最吃亏的地方:感知的误差、控制的不确定性,都会在决策层被放大。我见过不少项目,决策规划算法明明没问题,但实车表现很怪,一查根因在感知时间戳和控制指令时延。
这里有一条几乎不变的铁律:输入数据必须有时间戳对齐和合法性检查。感知偶尔会漏一帧,控制指令有几十到几百毫秒的延迟,如果决策层没有处理这些异常,系统就会在“看到障碍物”和“障物突然消失”之间频繁切换,轨迹抖动甚至急刹。
我建议在决策规划模块前加一个小的“状态缓冲层”,做三件事:丢失检测、状态外推、可疑数据标记。丢失检测发现某目标超过一定帧数没更新,就启动保守策略;状态外推用运动学模型把目标位置补到最新时刻;可疑数据标记用来告诉下游,这条输入可能不可靠,风险权重需要提高。别小看这几行逻辑,很多实际性能提升就是从这里来的。
5.4 给新入行朋友的几条实用建议
如果读者里有刚接触决策规划的朋友,我想分享几点这十年沉淀下来的实用建议,不是教科书上的那种。
第一,先把优化理论、概率论、控制理论打牢。决策规划听起来是算法问题,但底层是数学问题。很多复杂方案的瓶颈,最后都落在“这个优化问题怎么建模”“这个概率分布怎么估计”上。
第二,不要一上来就追端到端或强化学习。先把规则状态机和轨迹优化做一遍,亲身感受一下为什么规则会爆炸、优化会陷入局部最优。没有这个对比,你对新范式的理解是空的。
第三,一定要重视仿真和场景库。我个人见过太多聪明的算法死在评估体系不健全上,一个改动跑两天,然后放三个场景就上线,这种流程再好的算法也会被拖垮。
第四,保持对“异常”的敏感。决策规划工程师最该具备的能力,不是写出漂亮的公式,而是能快速定位“为什么这个场景下行为怪怪的”。这种能力靠大量调试、大量路测、大量事故分析练出来。
最后再分享一个小技巧:当你在调试一个复杂问题时,第一件事永远是“把输入数据一帧一帧看一遍”,而不是去看算法逻辑。我统计过,我处理过的问题里有一半以上最终的根因根本不在决策规划本身,而在于上游输入有异常。先把“输入是否可信”这个前置问题解决,决策规划才能真正安心工作。
这十年走下来,我最大的体会是:行业的真正进步不在于从规则换成优化、从优化换成了学习,而在于我们把“造一个聪明的规划器”变成了“造一个可以被信任的系统”。技术名词换了一波又一波,但让决策规划真正落地的东西,始终是围绕它的工程体系——场景、仿真、兜底、调试、验证,这些才是把每一项单点技术串成可靠产品的线。如果你打算投入这个方向,也请记住这一点:先学会在一个真实系统里把一个简单方案做到稳定不出错,再去碰那些让人觉得兴奋的复杂模型,顺序反了的话,你会被长尾场景和调试地狱折磨得怀疑人生。