ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

自动驾驶预测决策规划:高频考点与工程实践

自动驾驶预测决策规划:高频考点与工程实践 最近好几个准备面试自动驾驶算法岗的朋友问我说网上各种“预测决策规划八股”满天飞但真正能讲清楚“什么场景下用哪套方案”的内容很少更多是名词解释堆砌。我自己前前后后也面过几十个候选人带过不少刚转行过来的同学发现大家在准备这一块的时候很容易掉进一个误区把“预测、决策、规划”当成三个孤立的“考点”去背而没有理解它们在整车软件架构里是怎么串起来协作的。这篇东西我不打算写成一本正经的技术手册更像是我这几年在项目里踩坑、评审代码、准备面试和面试别人之后沉淀下来的一份“内参”。内容会围绕预测、决策、规划三个模块的核心问题拆开讲把那些高频考点的来龙去脉说清楚也会穿插一些真正工程落地时的考量和教训。不管你是刚入门想建立知识体系还是准备跳槽想查漏补缺只要吃透这些“八股”背后的逻辑应付技术面试和日常开发都会从容很多。1. 先搞清楚整个系统长什么样1.1 感知-预测-决策-规划的分层逻辑很多新手上来就盯着规划算法啃结果发现A*、EM Planner、Lattice这些名词越学越乱因为他没有建立“上游给什么、下游要什么”的边界意识。自动驾驶软件栈虽然各家命名略有差异但核心逻辑高度一致感知层负责回答“我周围现在有什么”定位层回答“我在哪里”预测层回答“这些东西接下来会怎么动”决策规划层回答“我该怎么动”。这里的“动”不只是方向盘和油门还包括“是否变道、是否让行、以多大速度通过”这一连串决策。预测决策规划在整个链条里处于“承上启下”的位置。它拿到感知融合后的障碍物列表通常包含位置、速度、朝向、类别、历史轨迹等结合高精地图和自车状态输出一条安全、舒适、可执行的轨迹。这条轨迹通常是一条带时间戳的离散路径点序列包含位置、速度、加速度甚至曲率信息交给下游控制模块去跟踪执行。这里有个特别容易被忽略的点预测决策规划三者的输入输出是有“接口契约”的。预测模块输出的不是“这个障碍物3秒后会在这个位置”就完事了而是要附带概率分布或者多模态假设决策模块吐出的也不是一个简单的“左转”指令而是一组带约束条件的语义决策规划模块则要将这些语义决策转化成几何上可行、动力学上可执行的轨迹。这个“接口契约”思想是面试里经常会深挖的内容也是真实工程协作里最容易扯皮的地方。1.2 预测决策规划的核心边界搞清系统分层后还得把三者的职责边界划清楚不然很容易在面试里答串。预测和决策的边界在于预测只“猜测未来”不去评判哪个未来对自车最优决策只“定方向”不去负责生成具体的曲线。比如前方路口有一辆左转车预测模块要做的是估计它“是左转还是靠边停”的概率而决策模块要做的是根据这个概率分布结合自车意图决定“减速让行”还是“鸣笛提示后绕行”。规划模块接到的则是更具体的指令“自车在3秒内从当前车道平滑切换到左侧车道目标速度15m/s”。实际操作里边界往往不是绝对清晰的。现在很多方案引入了“预测决策联合优化”或者“决策规划一体化”比如通过代价函数把预测的不确定性直接揉进规划求解里。但作为基础框架先理清三者的传统边界再谈融合才有意义否则很容易陷入“端到端大模型”的浪漫想象里遇到具体实现就抓瞎。2. 预测模块高频考点与实战经验2.1 预测问题怎么定义评估指标怎么选预测模块的核心任务可以描述成给定障碍物的历史状态序列和场景上下文估计其未来一段时间内的状态分布。这里“状态”可以是位置、速度、朝向也可以是意图比如左转、直行、停车。面试时一上来就追着问“你用过哪些预测模型”的一般是初级面试官真正有经验的面试官会先问“你的预测结果是怎么评估的”。原因很简单预测评估的指标直接决定了算法方案的选择。最常用的指标是ADEAverage Displacement Error平均位移误差和FDEFinal Displacement Error最终位移误差。ADE计算预测轨迹与真实轨迹在所有时间步上的平均欧氏距离FDE只计算预测终点与真实终点的距离。但这两个指标只能反映“平均表现”掩盖了长尾场景的安全风险。一个预测模型在普通场景下表现很好一旦遇到加塞、突然变道这类交互场景就崩盘ADE可能只是略微变差但实车测试就是致命的。所以我更建议在简历项目和面试沟通中除了报ADE/FDE数值还要能讲清楚“在哪些场景下预测会失效”。业界常用的补充评估方式包括按场景类型分层计算指标路口、匝道、cut-in、计算预测轨迹的碰撞率、把预测结果输入规划器后统计“因预测错误导致的紧急制动次数”。这些指标虽然不是标准八股但能体现你对预测问题本质的理解深度。2.2 从基于模型的预测到数据驱动的预测预测模块的技术演进基本走了一条“基于物理模型 → 基于规则/意图模型 → 基于数据驱动的交互预测”的路线。这条演进路线本身也是面试八股的高频骨架你要能说清楚每一步在解决什么问题、引入了什么新问题。基于物理模型的预测最常见的是恒速度CV、恒加速度CA模型配合卡尔曼滤波做状态估计外推未来几秒的轨迹。优点是计算快、可解释强缺点是不会考虑道路几何和障碍物意图弯道场景预测很容易“飞出路面”。所以纯物理模型现在一般只用于短时预测或者作为其他方案的兜底。基于意图模型的预测引入车道级信息先估计障碍物最可能的目标车道比如“往左变道”还是“沿当前道直行”再在目标车道上用物理模型或路径规划生成未来轨迹。这种方案工程上可控性强很长一段时间里是量产项目的主流。面试里常问的“如何估计意图”常见答法有规则打分、贝叶斯网络、隐马尔可夫模型HMM进阶一点的会提到用轻量级分类网络。数据驱动预测是现在卷得最厉害的方向。核心思路是不再手工设计意图规则而是从大量轨迹数据里学习障碍物的运动模式。代表作有Social LSTM、Social GAN、Trajectron、MultiPath等等。这些模型内部细节很多但面试八股更看重的是你能否讲清楚一个共性问题多智能体交互怎么建模。几个主流思路包括把周围障碍物池化成栅格图喂给CNNRasterNet、用图神经网络建立障碍物之间的交互边VectorNet、或者用Attention机制让每个障碍物“关注”其他障碍物Transformer系列。2.3 预测模块的“交互博弈”与不确定性表达如果说前面是预测模块的及格线那“交互博弈”和“不确定性表达”就是区分度最高的考点。面试官问“你怎么处理自车对障碍物预测的影响”时大部分候选人会愣住因为很多人的预测模型是纯开环的——只观察障碍物历史轨迹不考虑自车决策对它的影响。但真实交通里你减速让行对方可能就加速通过你提速抢行对方可能就踩刹车。这种“双向影响”就是交互预测要解决的问题。工程上比较成熟的折中方案是“自车轨迹条件化预测”在预测障碍物轨迹时把自车的规划轨迹作为输入特征之一。具体实现上可以将自车未来几秒的轨迹点编码后和障碍物历史轨迹一起喂进预测模型。这样预测结果就是“给定自车当前计划”下的障碍物未来分布虽然不是真正的博弈但工程上可控也能明显提升交互场景的预测质量。不确定性的表达同样很重要。预测输出的不确定性至少分成两类偶然不确定性aleatoric uncertainty和认知不确定性epistemic uncertainty。前者是数据本身带有的随机性比如行人可能突然驻足的随机性后者是模型能力不足导致的不确定性比如训练数据里没见过这种车型。面试时能聊到这一层面试官会认为你是真的做过预测系统的而不是只会调包跑模型。3. 决策模块从状态机到MDP的进化之路3.1 决策到底在解决什么问题决策模块在自动驾驶里回答的问题是“自车在当前场景下应该执行什么样的驾驶行为”。这里的“行为”是语义级别的比如巡航跟车、停车等待、变道超车、路口让行、靠边停车等等。一个好的决策系统需要满足三个基本要求安全不违反交规、不碰撞、效率不阻碍交通流、可解释遇到事故时能回溯为什么做出这个决策。可解释性这块在量产项目里尤其重要也是面试官喜欢追问的点。决策问题最经典的数学刻画是马尔可夫决策过程MDP由状态、动作、状态转移概率、奖励函数四要素组成。自动驾驶的决策可以建模成一个MDP状态是自车和周围障碍物的联合状态动作是语义决策或离散控制量奖励函数用来量化“安全、效率、舒适”等目标。但教科书上的MDP和真实工程之间有很大一条鸿沟因为真实场景的状态转移概率往往难以精确建模奖励函数怎么设计也没有标准答案。一个折中的工程实践是把决策拆成“上层行为决策 下层参数决策”。上层用规则或状态机选择驾驶行为下层根据当前具体场景输出行为参数比如目标车速、跟车时距、安全距离阈值。这种分层方式可靠性高、调试方便很多量产项目至今仍在用。3.2 状态机、MDP、POMDP 这些工具怎么选状态机FSM是决策模块最“皮实”的方案也是面试题里最容易被小看的一个。自动驾驶的决策场景可以被抽象成有限个状态比如“车道保持”、“变道中”、“路口等待”、“紧急停车”状态之间通过事件或条件触发迁移。FSM的优点是可解释性极强、开发调试直观、安全验证容易做缺点是状态设计高度依赖人工经验遇到设计之外的“组合爆炸”场景容易漏状态表现得很“机械”。比FSM“更高级”的决策方法是基于MDP/强化学习的方案。MDP的求解方法包括动态规划、价值迭代、策略迭代在路径规划、资源调度等领域早有成熟应用但在自动驾驶决策里状态空间连续且高维精确求解并不可行。业界更多是往“分层强化学习”“模仿学习RL微调”方向探索但目前真正量产落地的还是少数。POMDP部分可观测马尔可夫决策过程是理论上应对“感知不确定性下的决策”最完备的框架。它额外引入观测模型和信念状态让决策系统能够推断“我对自己和环境的认知有多不确定”。面试里提到POMDP会加分但也要做好准备面对追问“为什么实际项目用得少”。因为POMDP求解复杂度极高计算资源消耗大工程上通常要做大量近似和简化性价比反而不如前面提到的FSM条件化预测组合。3.3 决策八股的核心从“想当然”到“看约束”决策模块的八股考点里高频问题基本绕不开这几个怎么保证决策安全性、怎么处理交互博弈、怎么定义奖励函数、怎么防止决策震荡。前两个前面已经提过奖励函数设计是另一个容易被问透的点。奖励函数的设计本质上是在“翻译”人类驾驶员的驾驶目标。常见做法是加权叠加多个子项碰撞惩罚、交规违反惩罚、进度奖励希望尽快到达目的地、舒适度惩罚加速度过大、变道惩罚减少无谓换道。但权重一旦靠人工调很容易顾此失彼。我在项目里的经验是要加上“约束型”处理而不是纯靠权重对碰撞和交规违反这一类硬约束采用“安全护栏”机制直接否决对应决策对于舒适、效率这类软目标才用加权代价来排序。“决策震荡”是路测里特别常见的坑。表现是自车在“变道”和“保持”之间反复横跳或者“加速”和“减速”来回切换。原因一般有两个上游感知/预测结果帧间抖动太大或者决策模块本身没有加迟滞机制。工程上常用“决策保持计数器”和“状态切换迟滞”来抑制比如连续3帧都满足变道条件才真正执行变道。4. 规划模块把决策变成一条可以开的轨迹4.1 规划问题的数学表达与约束体系规划模块的任务是把决策层的语义意图转化成一条满足运动学/动力学约束、避障约束、交规约束的轨迹。一条合格的轨迹一般包括几何路径path和速度曲线speed profile两者可以联合优化也可以分开求解。面试八股里最常问的是规划问题里的约束体系你要能条件反射式地列出这几类边界约束道路边界、车道线、动力学约束加速度、加加速度、曲率、横摆角速度、安全约束与障碍物的最小距离、交规约束限速、停止线、红绿灯、舒适性约束加加速度的软约束。每一类约束都有对应的数学表达方式比如安全约束可以用圆/凸多边形包络表示边界约束可以用高精地图里的车道中心线坐标来参数化。规划问题的求解目标通常是最小化一个代价函数代价由参考线偏离、加加速度变化率、离障碍物距离、换道次数等子项组成。面试时如果能提到“多目标优化通常用加权求和但权重标定要结合实车体验来调”会显得很有工程落地经验。4.2 路径规划和速度规划的分治策略工程上最主流的规划方案不是“一次性求解整条轨迹”而是“分治”先在Frenet坐标系下做路径规划再在S-T图里做速度规划最后组合成完整的轨迹。Frenet坐标系的精髓是用道路中心线作为参考线将车辆位置表示为纵向位移s和横向偏移l这样道路的曲率信息被“吸收”到参考线里路径规划的复杂度大幅降低。这个坐标系转换的思想是规划八股里的绝对核心建议深挖。路径规划主流方法分三类。第一类是基于搜索的比如A*、Hybrid A*A适合全局导航级路径规划Hybrid A额外考虑了车辆的非完整性约束常用于停车场自主泊车场景第二类是基于采样的比如RRT、RRT*通过随机采样构建路径树在高维空间里搜索能力很强但轨迹平滑性一般需要后处理第三类是基于优化的比如Lattice Planner和EM Planner。Lattice Planner在Frenet坐标系下采样一系列候选轨迹横向、纵向各采样多个候选然后用代价函数选最优EM Planner是先做动态规划DP得到一个粗略解再用二次规划QP做平滑是百度Apollo早期的经典方案。速度规划同样有对应的思路。最常见的是沿着S-T图搜索S-T图的横轴是时间纵轴是沿道路的纵向位移障碍物在图上被投影为占据区域规划的目标是找一条不穿越占据区域的S-T曲线。动态规划可以先给出一个粗略的速度曲线再用QP做平滑优化处理加速度、加加速度约束。4.3 轨迹平滑与优化求解的那些坑很多人面试准备到“DPQP”就停了但真正工程里坑最多的是最后一步轨迹优化求平滑。规划出来的轨迹常常存在曲率突变、加速度突变的问题直接交给控制模块会导致车身顿挫甚至失控。所以需要专门的平滑算法来处理常见的有B样条曲线拟合、分段多项式拟合、基于OOPOptimization-based Planning的QP平滑。说一个我在项目里踩过的坑QP平滑的代价函数里横向偏移的权重调太大轨迹会被“死死按”在参考线上遇到障碍物绕行时会切弯切得很生硬权重调太小轨迹又会大幅“甩”出去乘客体验很差。这个权重没有标准答案只能结合车辆标定和实车体验反复调试。面试如果聊到这里面试官大概率会对你刮目相看。另外规划模块必须处理“动态障碍物未来轨迹不确定”的问题。处理的方法之一是把障碍物的预测结果带概率分布的轨迹当作“时空占据概率”在轨迹代价评估里加入碰撞风险项。更工程化的做法是“轨迹滚动时域重规划”每100ms重新规划一次轨迹每次只执行未来1-2秒的轨迹后面部分作为备用这样即使预测存在误差也能通过高频重规划来修正。4.4 规划模块面试真题与答题模板5. 常见问题与经验避坑5.1 八股的“背诵陷阱”和“推导陷阱”准备预测决策规划面试的过程中最常见的误区就是“背结论不推导”。比如很多人能熟练说出“Apollo的EM Planner是DP QP两段式优化”但被追问“DP在这一步具体在优化什么目标QP的约束条件是什么两者的衔接关系怎么处理”就卡壳了。这是因为只背了流程没理解每一步要解决的问题。以EM Planner为例DP阶段的目标是快速拿到一个“粗糙但可行”的解作为初值这时候不需要太精细的动力学约束主要解决“有没有”的问题QP阶段在DP解的基础上做平滑和细节优化目标是把轨迹打磨到可执行的质量。所以DP和QP是“先求有、再求好”的关系。面试时能把这个逻辑讲清楚比背一百遍算法名称都管用。另一个常见陷阱是“只讲模型不讲实现”。我说一个我面过的一个候选人的例子简历上写着“基于LSTM的多模态轨迹预测”但问了几个关键问题——“输入序列长度怎么定的”“输出是直接回归坐标还是预测高斯分布的参数”“训练时如何处理多模态的塌缩问题”——完全答不上来。所以准备八股时不要停留在“模型长什么样”要深入一层想“这个模型怎么用代码实现、怎么训练、怎么上实车”。5.2 简历项目和真实工程经验的“包装”建议很多候选人会拿课程项目或者开源项目写在简历里这本身没问题关键在于你怎么表述。与其写“实现了LSTM轨迹预测模型”不如写清楚“基于TensorFlow实现LSTM多模态轨迹预测在开源数据集如Argoverse上FDE从3.2m降至2.8m并通过注意力机制融合自车意图特征提升交互场景预测稳定性”。面试官喜欢看到的是“你遇到了什么问题、你是怎么思考的、最终结果如何”。还有一点强烈建议在你的项目描述里加入“Fallback方案”和“系统集成”的思考。比如“当预测模型失败时系统如何兜底”“规划轨迹如何与控制模块接口”。这会让面试官相信你不仅会跑代码还真的在思考如何让系统整体稳定工作。5.3 自动驾驶学习路线的几条建议如果你是从零开始准备进入预测决策规划方向我的建议是别一头扎进深度学习框架里。先花两周时间把坐标系变换、车辆运动学模型、车辆动力学模型、卡尔曼滤波这些基础概念吃透。基础模型的底子打好之后再去看Apollo的规划模块源码、Lattice Planner的开源实现、以及相关课程的作业代码。编程语言方面最好掌握C跟Python两门Python用来做研究和原型验证C用来搞工程落地几乎没有例外。深度学习模型方面先跑通几个经典方案再谈改进。强烈推荐从行为克隆Behavior Cloning开始入门把轨迹预测做成一个“输入历史轨迹场景上下文输出未来轨迹”的回归任务用PyTorch实现一遍。跑通之后再渐进式加入多模态、交互建模、不确定性建模每一层都能给你带来新的理解。这个过程当然不轻松但相信我当你真正手写过一个完整系统之后面试里那种“八股”问题根本难不倒你。最后再分享一个小技巧也是我几年从业下来最深的体会学习预测决策规划最忌讳“只见树木不见森林”。壮观的端到端模型背后依然是“感知、预测、决策、规划、控制”这五层架构在兜底。纯粹为了应付面试背八股非常容易背到焦虑但是如果你每学一个概念都追问一句“这在系统里承担什么角色输入输出是什么失败了我怎么兜底”你会发现自己不知不觉已经把整条技术栈拧成了一股绳。希望这篇东西能帮你在准备面试和工程开发的过程中少走点弯路。
返回列表