做轨迹预测这摊事也有几年了期间带过很多次数学建模竞赛的队伍也帮一些做辅助驾驶的朋友调过模块。每次拿到“自动驾驶轨迹预测”这类题目很多人的第一反应就是“这不就是个回归问题吗给我一个LSTM就完事了。” 真上手之后才发现坑全藏在数据、坐标系、评估指标和多模态输出这些细枝末节里。这篇文章把这类题目的通用解法、建模套路和踩坑记录梳理一遍尽量说人话也尽量给能直接“抄作业”的方案。如果你正准备参加数学建模竞赛或者刚入门智能车、辅助驾驶相关的算法岗再或者只是好奇自动驾驶系统里“预判别人要往哪走”到底是怎么实现的这篇文章都值得你读完。不会有很多晦涩的证明重点是讲清楚选择背后的逻辑、实操中容易翻车的地方以及一条可以快速跑通的建模主流程。1. 先把题目读懂轨迹预测到底在解决什么问题1.1 一道题背后藏着的完整链路数学建模题目里只要出现“自动驾驶”三个字十有八九会落在感知、预测、规划三选一或者三选二上。轨迹预测属于中间层它的输入通常是一段历史轨迹和环境信息输出是目标未来若干秒的轨迹。这中间层的地位很微妙。往前看是检测、跟踪和定位往后看是决策和路径规划。很多人容易犯的错误是直接把这题当纯时间序列预测来处理上来就套回归模型。但题目真正想考察的往往是你对“场景理解”和“多模态行为”的把握。以某道模拟赛题为例给了一批高速公路场景下的车辆轨迹数据要求预测目标车辆未来5秒的行驶轨迹并给出概率分布。这种题目的本质是在有限的历史信息下你要判断目标车是继续直行、变道还是准备制动并把它未来的位置量化成一条或者多条轨迹。出题人真正想看的能力包括对车辆运动学建模的掌握程度对交互场景目标车与周围车之间的相互影响的抽象能力对不确定性的处理能力只给一条轨迹远远不够结果评估的科学性纯看误差均值往往会掩盖很多问题1.2 轨迹预测与“检测”“规划”的分工很多人会混淆预测和规划的关系。简单说感知回答的是“现在哪里有什么”预测回答的是“接下来那家伙会去哪”规划回答的是“我们自己应该怎么走”轨迹预测的输出会直接喂给规划模块所以它不能只求“平均误差小”还必须给出可信的置信区间或者多模态候选。举个例子前方有一辆车在车道内轻微左右摇摆你如果只输出一条“正中间”的确定性轨迹规划模块会认为它很老实结果一旦它真的变道就是事故。这也是为什么在建模题里单条轨迹加一个误差指标的做法从一开始就不占优势。更好的做法是输出多条轨迹及对应的概率权重或者输出一个分布模型。1.3 这道题的典型数据形态与评测方式数学建模竞赛里的轨迹预测题数据通常以CSV或类似表格形式给出每条记录包含目标ID、时间戳、位置坐标、速度、加速度有时还有车道编号、与前方车辆的距离、转向灯信号等。评测时一般会从数据集中切分出训练集和验证集按时间先后切不能随机切这一点后面会详细说。指标的常用口径有几种指标含义典型用途ADE平均位移误差即预测轨迹逐点与真值轨迹的欧氏距离均值总体拟合程度FDE最终位移误差预测终点与真值终点的距离终点准确度minADE多条候选轨迹中误差最小的一条的ADE多模态方法minFDE多条候选轨迹中误差最小的一条的FDE多模态方法碰撞率预测轨迹与周围障碍物轨迹是否发生冲突工程安全指标理解这些指标特别关键因为很多模型在ADE上表现很好但实际开起来根本不能用。原因在于ADE追求的是“平均上接近”它鼓励模型输出一条安全的“中间轨迹”而真实场景里目标要么变道、要么不变道并没有一条平滑的“中间值”可选。所以现在的主流做法是先多发几条候选轨迹再让误差最小的一条尽可能准同时配合概率权重评估分布的合理性。2. 建模思路的拆解从物理模型到多模态路线2.1 传统建模方法先别急着上深度学习不管题目要不要你用深度学习方法我建议你先掌握几种经典模型它们是理解后面一切高级玩法的基础也是竞赛中建立baseline最快的方式。第一种是匀速/匀加速模型CV/CA。假设目标保持当前速度或加速度不变直接积分外推。这个模型在高速巡航场景下表现意外地好因为很多车在大多数时间确实在匀速行驶。但它的缺点也很明显对“意图变化”完全无感只要目标开始刹车或变道误差立刻爆炸。第二种是恒定转率和速度模型CTRV。它在CV模型基础上增加了一个角速度项能描述圆弧运动。公式上设状态量为横向位置、纵向位置、航向角、速度、角速度则x x (v / w) * (sin(θ w·Δt) - sin(θ)) y y (v / w) * (-cos(θ w·Δt) cos(θ)) θ θ w·Δt当角速度w趋近于0时需要退化为直线外推避免除零。CTRV适合处理弯道和轻微的横向运动。需要说明一下这一族的模型其实是从车辆运动学里简化来的实际工程中还有更完整的自行车模型bicycle model但数学建模题里用CTRV级别的简化已经够用。第三种是交互多模型IMM。它把匀速、匀加速、恒定转率几个模型并行跑每个模型对应一种运动模式最后按概率加权融合。IMM的好处是能相对平滑地处理目标运动模式的切换比如前车先是匀速然后进入制动模式IMM能在几帧内把权重转移过去。在做第一版baseline时强烈建议你先用CTRV或者IMM跑通全流程因为它的训练成本为零推理时间几乎可以忽略而且能给后面的深度学习模型提供一个公平的对比基准。2.2 概率建模思路把“不确定性”写进模型单条轨迹没法表达“目标可能变道也可能不变道”这个本质不确定性。解决办法有两个方向。方向一是高斯混合模型GMM。对预测的未来位置不再输出一个确定值而是输出K个高斯分布的均值、方差和混合权重即p(x, y | x_history) Σ π_k · N(x, y | μ_k, Σ_k)这里π_k是第k个分量的权重μ_k和Σ_k是第k个高斯分量的均值和协方差。用GMM的好处是能直接给出多模态的概率分布规划模块拿到之后可以按风险来决策。坏处是拟合的时候容易坍缩所有分量都堆到一起导致预测退化成单峰。方向二是基于锚点的多轨迹生成。先通过聚类比如K-Means从训练集中提取出一批“典型的未来轨迹锚点”每条锚点代表一种常见行为模式例如直行类锚点目标沿着当前车道匀速向前左变道类锚点未来3秒内横向偏移逐渐增大制动类锚点纵向速度在短时间内下降模型做的事情变成了“选择合适的锚点并微调”这会稳定很多。竞赛阶段我最推荐的其实是这种方式因为聚类的过程对数据量的要求不高又能自然产生多模态输出。2.3 学习类建模LSTM、Transformer还是图神经网络在数学建模题里深度学习不是必须的但如果你有一定的基础加上题目给的数据量比较大用它提分的效果也很明显。LSTM/GRU系列是最容易入手的。把目标过去3~5秒的轨迹点序列喂进去输出未来5秒的轨迹点。LSTM天然适合变长序列而且实现难度低一个两层LSTM加一个全连接输出层就能跑出像样的结果。它的缺点是很难显式建模“周围车辆对目标的影响”因为目标车的轨迹本身已经包含了这种影响的一部分历史但处理复杂交互场景时表达力不够。Transformer系列用自注意力机制替换了循环结构在处理长序列和捕捉全局依赖上有优势。如果你沿用“历史轨迹点序列作为输入”的做法Transformer的优势其实不明显因为输入长度通常也就10~20个点。它的真正价值在输入里加入了周围车辆和地图要素时注意力机制可以动态决定“该关注谁”。**图神经网络GNN**的思路是直接把场景建模成图每个交通参与者是节点车与车之间的空间关系、时间关系是边。然后通过多层消息传递让每个节点聚合邻居的信息再解码成轨迹。这套方案在学术圈很火但数学建模竞赛里除非数据里明确给出了多目标之间的关联字段否则我建议谨慎使用因为处理不好反而会被“无效邻居”干扰。如果要在竞赛里做深度模型我的个人建议是先用LSTM锚点多轨迹输出把流程跑通再考虑用Transformer替换编码器。不要一上来就堆模型复杂度否则调试时间会淹没你的解题时间。2.4 融合路线物理约束学习模型的混合框架其实最实用的方案是“物理模型打底学习模型修正”。具体地说用IMM或CTRV对目标做一个短时外推得到一条“物理轨迹”用LSTM对目标的意图做一个分类直行、左变道、右变道、制动如果分类置信度足够高则把物理轨迹按意图对应的偏差模式进行修正这个方案的好处是物理模型保证结果不会违反基本运动学约束学习模型提供环境感知和意图判断能力两者解耦调试起来很容易定位问题在一个模拟项目中我用这个混合方法把验证集上的FDE压低到了纯LSTM的三分之一左右。原因是纯LSTM偶尔会输出一些“跳变”轨迹物理模型天然把它平滑掉了。3. 数据工程与特征构造决定模型上限的关键环节3.1 坐标系、时间对齐和时间步长的选择拿到轨迹数据后第一件事不是建模而是把数据对齐。常见的坑有这几个。**坐标系不统一。**有些数据提供的是全局坐标有些是相对坐标。相对坐标更适合做模型输入因为它平移不变因此模型不用死记位置。建议把目标车辆的历史轨迹转换成以“当前时刻目标自身位置为原点、航向为x轴正向”的相对坐标。**时间戳没有均匀采样。**很多真实数据的时间间隔不是严格的0.1秒有时候缺了几帧。建议先做线性插值重采样到固定频率推荐0.1秒。如果某段连续缺失超过2秒直接丢弃不要硬补。**时间步长的trade-off。**历史输入太长模型会学到一些早期无关信息太短则无法捕捉行为趋势。我的经验是预测2秒未来时历史取2~3秒就够预测5秒未来时历史取3~5秒再长意义不大。3.2 从“单条轨迹”到“场景上下文”如果你想在竞赛里做得比别人好一定要跳出“就是预测目标车自己”的思维。自动驾驶场景里的轨迹预测本质上是在预测一个“社会性行为”。目标车是否变道很大程度取决于隔壁车道有没有车、后车的速度是多快。所以特征工程至少要包含几个层次自车运动特征历史位置、速度、加速度、航向角变化率相对交互特征与最近前车的纵向距离和相对速度、与左右车道后车的横向距离和相对速度道路结构特征所在车道编号、到左右车道线的距离、前方是否接近分流点或汇入点数据量有限时能稳定提取的最有价值特征是目标车与最近前车的车头时距Time Headway即距离除以相对速度。它反映的是“如果前车急刹目标车有多少反应时间”它跟目标车的制动概率高度相关。如果数据里给了车道中心线或者道路边界把它们转换成目标车坐标系下的离散点序列作为模型的辅助输入效果也会明显提升。3.3 训练标签怎么构造多模态要分通道还是混合输出多模态输出的构造方式直接影响训练难度。最简单的方式是不区分通道让模型一次性输出K×T个坐标点K条轨迹每条T个未来时刻点配合一个K维权重向量。然后训练时计算每条候选轨迹与真值的误差选误差最小的那条回传梯度。这个做法称为“winner-take-all”策略。但直接对所有坐标点回归容易出现“多模态坍缩”K条轨迹最后长得差不多因为每条轨迹都有梯度模型会倾向于把每条都往“平均上最安全”的方向推。改进做法是先给每个通道指定一个隐向量通过对锚点聚类或者对终点分布做离散化强制每条通道对应不同的行为模式。比如K3时三条通道分别偏向直行、左变道、制动模型每次只需要在这个偏向上做微调即可。3.4 数据增强与类不平衡处理轨迹预测任务里也存在“类不平衡”问题。高速场景下90%以上的轨迹都是直行变道和制动的样本很少。如果直接训练模型会变成“永远预测直行”的复读机在ADE上还挺好看但真正变道的场景一个也预测不到。几个缓解办法过采样少数场景把变道和制动样本复制几份或者做轻微的轨迹缩放时间反转增强某些场景下的左变道可以镜像成右变道如果坐标系是对称的这个增强几乎没有成本损失函数加权对非直行样本乘以更大的损失系数在竞赛中最简单有效的还是过采样。可以把训练集按行为类别用平均横向偏移量粗分类分成几份少数类多复制两遍即可。4. 完整实操案例一个可以直接复现的建模流水线4.1 场景设定与数据说明为了把上面的内容落到可操作这里用一套模拟数据来演示整个建模过程。场景为城市快速路的一段弯道目标车及周围车辆均有3秒历史轨迹数据采样频率10Hz要求预测未来3秒的轨迹。数据字段包括ID时间戳车辆类型全局坐标x、y速度v加速度a航向角heading所在车道lane_id与前后左右相邻车辆的距离假设总样本量有12万条有效片段其中直行占比85%变道占比10%制动占比5%。4.2 数据预处理与特征构建实操第一步先把每段轨迹切成时间窗口。窗口结构是历史3秒30帧 未来3秒30帧步长10帧。切完之后每辆车每隔1秒产出一个训练样本。第二步做坐标系转换。以每个窗口的最后一帧为基准把目标车的历史和未来轨迹都转换到相对坐标系。具体变换公式是x_rel cos(-θ0) * (x - x0) - sin(-θ0) * (y - y0) y_rel sin(-θ0) * (x - x0) cos(-θ0) * (y - y0)其中x0、y0是基准时刻目标车的位置θ0是其航向角。这个转换让模型不需要记住目标车在全局地图里的绝对位置只需要负责“从目标车自己的视角”做决策。第三步特征拼接。对每个样本构造一个特征向量由以下几个部分组成目标车最近10帧的相对坐标、速度、加速度目标车最近4帧的航向角变化率最近前车的相对距离和相对速度左右车道最近车辆的相对距离没有车时置为一个较大值比如50米把所有特征归一化到0~1区间存储为训练矩阵。4.3 模型结构与通道设计模型选择的是两层LSTM 三个轨迹解码头。结构如下输入特征 (维度d) - 全连接嵌入 (64维) - LSTM层1 (隐藏单元64) - LSTM层2 (隐藏单元64) - 输出三个通道的隐向量 (每个维度32) - 每个通道接一个全连接解码器 - 输出30个未来时刻的 (x, y) 坐标共60个数值 - 同时输出每个通道的置信度权重 (softmax归一化)通道初始化训练前用K-Means对训练集中未来轨迹的终点坐标聚类成3类得到三个初始“终点锚点”。把每个解码器的偏置项设为对应锚点的坐标这样训练初期各通道就已经分散开。损失函数设计L Σ_k w_k * (mask_k * (ADE_k λ * FDE_k)) α * CE(pred_weights, true_mode_index)其中mask_k表示这次样本的监督信号只回传给误差最小的那条通道即winner-take-allCE为交叉熵损失鼓励置信度权重能正确识别真实行为模式。λ取0.5α取0.2。4.4 训练参数与效果对比训练参数如下优化器Adam初始学习率0.001每5个epoch衰减0.5批量大小256训练轮数20个epoch早停条件为验证集FDE连续3轮不降损失权重winner通道回传全部梯度其余通道梯度置零按8:1:1划分训练集、验证集、测试集注意按时间顺序划分确保测试集的样本在未来时间上不重叠。最终在测试集上的效果大致如下方法ADE (m)FDE (m)minADE (m)minFDE (m)CTRV物理外推1.352.411.352.41单轨迹LSTM0.921.880.921.88三通道多模态LSTM1.041.670.580.95三通道意图分类混合模型0.881.520.510.87有意思的是三通道多模态模型的ADE比单轨迹LSTM还差一点但minFDE显著更低。这恰恰说明了多模态评估和多模态输出之间“看哪个指标”密切相关。如果你的竞赛题目主要看FDE那么多模态输出基本是必须做的如果题目主要看ADE那么稳定输出的单模型也可能拿到不错的分数。4.5 推理阶段的处理细节推理时模型输出的是三条轨迹和对应权重。但规划模块不能拿三条轨迹全都用它需要一条“决策用轨迹”和一份“风险候选集”。我的处理方式是取置信度最高的那条轨迹作为主轨迹把主轨迹与另外两条候选轨迹的偏差作为规划模块的安全包络参考如果最高置信度低于0.5说明场景高度不确定此时会额外输出一个“减速建议”提示下游模块降低车速这些工程细节虽然不直接影响竞赛分数但它是区分“会做模型”和“会做系统”的分水岭。5. 踩坑总结与工程化建议5.1 常见问题排查速查表问题现象可能原因排查与解决训练集ADE很低测试集很高数据划分时随机切分导致时间重叠改为按时间顺序切分留出连续时间段做测试所有候选轨迹都重合多模态坍缩winner回传策略失效用K-Means锚点初始化各通道输出或对通道加不同偏置短期预测准长期发散模型误差随时间累积或者直接回归远期坐标比重太低增大FDE权重λ或改为逐步预测策略对变道场景完全无反应变道样本太少模型退化为直行复读机过采样变道样本或者在损失函数中提高非直行样本权重车辆交叉场景出现重叠轨迹忽略了车辆间的交互特征加入前车距离、邻车道车距等相对特征输出轨迹出现“Z”字形跳变模型输出缺少运动学约束在损失函数中加入相邻点距离平滑项或对输出做卡尔曼平滑置信度权重失效总是一高一低交叉熵损失未生效或监督标签构造错误检查true_mode_index是否按最小FDE通道编号生成5.2 关于评估指标的三个额外提醒第一个提醒是FDE比ADE更适合衡量“终点意图”。自动驾驶规划真正关心的是你在未来某个时刻会占住哪个位置前2秒差一点问题不大第5秒差两米可能就已经横跨两个车道了。第二个提醒是minFDE中的“min”不能随便用。如果一个模型不管什么场景都输出几十条轨迹那它的minFDE必然很低但这个低没有意义因为规划模块根本不知道该信哪一条。所以好的多模态评估要在固定候选数的前提下比较minFDE并且同时看置信度权重的概率校准程度。第三个提醒是不要只看赛后排名要看误差的空间分布。把误差按真值横向位移的大小分组你会发现几乎所有模型都在“大变道”场景上崩掉。这其实是一个加分思路在答辩或者报告里主动指出这一点说明你真正理解了问题而不仅仅是在调参。5.3 适合竞赛节奏的工程建议如果现在是比赛的中期你只有不到一天时间把预测模块跑通我的建议优先级是这样的先实现数据预处理和CTRV baseline跑通全流程再实现单轨迹LSTM确认数据管道无误最后把LSTM输出改成多通道锚点初始化直接提升FDE指标时间有余再考虑加Transformer、GNN等高阶方法我个人在实操中的体会是很多队伍不是被模型难倒的而是被数据切分、特征归一化、坐标转换这些“不性感”的细节拖死的。尽早把数据管道固定下来反复用它跑不同模型做对比比在单个模型上死磕要高效得多。最后再分享一个小技巧在比赛最终报告里把你预测错误率最高的场景挑出来做两三页详细分析。这会让评委觉得你不是在套一个现成模型而是真的理解轨迹预测在自动驾驶系统中的边界。往往这种“展望和总结”性质的章节才是拉开分数差距的地方。