神经网络与ANFIS融合的自适应MPC:自动驾驶路径跟踪还能这么玩?
做车辆控制的朋友应该都有同感:路径跟踪这个老话题,近几年突然又火起来了,火的原因倒不是传感器或者底盘线控有了什么革命性突破,而是大家都在往MPC里塞"学习"的成分——有人塞神经网络,有人塞模糊逻辑,还有人二者兼收。
我最近在仿真平台上完整复现了一套"基于神经网络与ANFIS结合的自适应MPC,以及神经网络NN-MPC"的路径跟踪方案。这两套思路放一起对比着做,很有意思,也踩了不少坑。这篇文章不打算铺开讲整套系统怎么搭,而是聚焦在核心的控制器设计、参数整定、仿真对比和几个容易翻车的细节上。内容涉及的东西可能偏控制理论一些,但我会尽量讲得通俗,搞不清楚的可以直接拉到最后看踩坑总结。
先说结论:ANFIS自适应MPC的思路,本质上是给传统的模型预测控制装了一个"实时调参的大脑";而NN-MPC则是把预测模型换成了神经网络。两者各有各的适用场景,并不是谁替代谁的关系。
1. 为什么传统的MPC在路径跟踪中不够用了
传统MPC在路径跟踪里的基本逻辑,大部分人都熟悉:基于车辆运动学或动力学模型,在每个控制周期内滚动求解一个有限时域优化问题,把预测出来的轨迹和期望路径的偏差最小化,同时约束前轮转角、横摆角速度、侧向加速度等物理量。
在一段固定车速、路面条件稳定的高速公路上,传统MPC的表现可以说相当优秀。但一旦车速变化范围大、道路曲率突变、路面附着系数发生改变,问题就来了——因为MPC的性能高度依赖两个东西:
- 预测模型的准确性。模型参数(比如轮胎侧偏刚度)是固定的,但真实车辆的轮胎特性是非线性的,随载荷、温度、磨损在变。
- 权重矩阵的设定。Q和R矩阵(即跟踪精度和控制量惩罚的权重)一旦设死,整个控制器在所有工况下都用同一套偏好。高速急弯时需要更重的前轮转角约束,低速揉库时又希望跟踪精度压倒一切,固定权重很难同时满足。
我在仿真里做过一个特别直接的对比:在同一段包含低速大曲率掉头和高速小曲率变道的测试道路上,用固定权重的MPC跑,要么掉头弯道里跟踪误差飙到0.8米以上,要么高速变道时前轮转角抖动得像是在打摆子。
这时候就想,能不能让控制器自己根据当前状态(车速、横向偏差、道路曲率)动态调整权重?答案是可以,ANFIS就能干这个活。
1.1 ANFIS到底是什么,和普通模糊控制有啥区别
ANFIS全称是自适应神经模糊推理系统(Adaptive Neuro-Fuzzy Inference System),说人话就是:把模糊推理系统变成一个可以训练的神经网络结构。
传统模糊控制通常靠专家经验手工制定模糊规则表——"如果车速高且偏差大,则增大权重"。这套逻辑在简单系统里够用,但规则参数(隶属函数的中心、宽度)一旦设定就固定了,面对复杂工况很难精细调整。
ANFIS的思路是:把隶属函数的参数也当成可训练参数,用神经网络的反向传播或者混合学习算法(最小二乘+梯度下降)去优化它们。也就是说,模糊系统的骨架还在,但"经验"可以被数据修正,而不是完全依赖人工调试。
在路径跟踪这个场景下,ANFIS的输入端我用了三个信号:当前车速、横向位置偏差、道路曲率。输出端是MPC的权重矩阵调整系数。这样一个结构,训练好之后,就形成了一个"车速越快越加重控制量惩罚、偏差越大越加重跟踪精度惩罚"的非线性自适应规律。
1.2 为什么选择ANFIS而不是单纯的神经网络来调参
这是个好问题,我在复现之前也纠结过。直接用神经网络做权重调节器,理论上完全可行,输入状态输出权重,端到端训练。但实际上有个很现实的问题——神经网络是个黑盒,你很难解释它为什么给出一组权重,调参出了问题基本只能盲调。
而ANFIS保留了模糊规则的语言可解释性。训练完之后,你可以把规则提取出来看:"当车速在80-120km/h区间、横向偏差小于0.1m时,该工况下的跟踪权重偏好是XX"。这种清晰度在工程调试、实车标定阶段非常重要。
另一个好处是收敛数据量。ANFIS要训练的参数远少于一个多层神经网络——前者的参数量级通常在几十到几百个,后者动辄数万甚至更多。在实车测试数据有限的情况下,ANFIS更容易训练到位。
当然,ANFIS的缺点也很明显:输入维度不能太高,一旦超过5维,规则数量就会爆炸式增长。所以实际应用时往往需要做输入选择,只挑最影响性能的几个状态量,而不是所有状态量都塞进去。
2. 复现环境搭建:从数学模型到仿真平台
做这类控制算法的复现,我比较推荐先在MATLAB/Simulink里搭完整的仿真链路,等算法逻辑验证通了,再迁到更接近实车的平台(比如CarSim或者基于ROS的仿真环境)。
2.1 车辆模型的选型:运动学还是动力学
在路径跟踪控制里,最简单的选择是自行车运动学模型(Kinematic Bicycle Model),它假设轮胎不打滑,适用于低速场景(一般车速低于10m/s时精度还不错)。优点是模型简单、实时性好,MPC在极短的控制周期内也能算得过来。缺点是高速场景下完全不靠谱——忽略轮胎侧偏会导致预测轨迹严重偏离真实。
我复现时用的是动力学自行车模型,同时考虑了前后轮的侧偏刚度和横摆 dynamics,比运动学模型多引入了一个自由度。代价是MPC的预测模型从简单的运动学方程变成了包含更多非线性项的状态方程,求解难度和实时性压力都上来了。
仿真参数大致如下:
| 参数 | 数值 | 说明 |
|---|---|---|
| 整车质量 | 1500 kg | 影响加速度和侧向力 |
| 轴距 | 2.8 m | 前轴到后轴距离 |
| 前轮侧偏刚度 | 62000 N/rad | 影响高速稳定性 |
| 后轮侧偏刚度 | 68000 N/rad | 略大于前轮 |
| 质心到前轴距离 | 1.2 m | |
| 质心到后轴距离 | 1.6 m | |
| 转动惯量 | 2500 kg·m² | 影响横摆响应速度 |
在Simulink里,我用S-Function编写车辆动力学模块,MPC和ANFIS模块则用MATLAB Function块实现。整个闭环系统的采样周期设为50ms,MPC的求解周期设在20ms以内,给实时性留足余量。
2.2 MPC求解器的选择:C/GMRES还是优化工具箱
关于MPC的实时求解,这里有个决策点:是用MATLAB自带的fmincon这类通用优化求解器,还是用专门为MPC设计的快速求解算法。
在低速场景、预测时域较短的情况下,fmincon勉强能跑;但预测时域拉长到20步以上,非线性约束一多,求解速度就惨不忍睹。我试过在单步求解耗时超过100ms,完全无法满足实时控制需求。
后来换成了C/GMRES(Continuation/Generalized Minimum Residual)算法。这是内点法之外非常经典的快速MPC求解思路,它利用连续化思想,把每个控制周期的最优解初始化为上一时刻的解,通过若干次GMRES迭代逼近真实解。实测在预测时域20步、控制输入维度1(前轮转角)的条件下,单步求解耗时能压到3-5ms,轻松满足实时性。
如果你的复现环境是Python,推荐用do-mpc或者CasADi结合IPOPT求解器。但要注意,Python环境下IPOPT在复杂非线性模型上依然偏慢,想要达到实车级别的实时性,C/GMRES或者acados这类高性能求解器才是更合适的选择。
2.3 ANFIS的训练流程
ANFIS在MATLAB里直接用anfis命令就能训练。我需要先准备好训练数据集——对应不同车速、不同偏差、不同曲率工况下的"最优权重配置"。问题来了:这个最优权重配置从哪来?
我的做法是离线生成标定数据集:
- 在一定范围内随机生成车速、横向偏差、道路曲率的组合(用拉丁超立方采样保证空间覆盖均匀)。
- 对每组工况,用网格搜索法在MPC权重空间里搜索,找到跟踪误差和控制能量综合最小的权重组合,记为该工况下的"最优标注"。
- 全部组完成后,得到输入-输出映射数据集,喂给ANFIS训练。
网格搜索的步长要仔细选,太大找不到最优,太小算力爆炸。我采用了两阶段搜索:先大步长粗定位,再在小范围内细搜。每组工况大约需要跑几十次MPC仿真,总共用了800组工况数据,离线跑了将近一个晚上才搞定。
训练完成后,ANFIS的输出就成为了MPC权重的在线调节器。每个控制周期,读入当前车速、偏差、曲率,输出一组权重系数,MPC求解器用这组权重进行优化。
3. NN-MPC的实现路径:让神经网络参与预测与控制
说完ANFIS调参,再说NN-MPC。这个方向的思路更激进——把神经网络模型引入MPC框架,代替(或辅助)传统的物理模型进行状态预测。
3.1 两种NN-MPC的实现方式
我在复现时尝试了两种不同的接入方式:
第一种是"模型替代法":直接用神经网络学习车辆状态转移函数。输入是当前状态和控制输入,输出是下一时刻的状态变化。训练数据集通过大量仿真生成——给车辆动力学模型施加随机控制输入,记录状态变化序列。用这个训练好的网络取代MPC内部的动力学模型,控制律求解时靠网络前向预测就能推算未来若干步的状态。
第二种是"模型辅助法":保留物理模型作为主干,用神经网络预测物理模型未建模的部分(比如轮胎非线性残差、路面扰动的补偿项)。物理模型预测主体趋势,神经网络补足偏差,两者叠加作为最终的预测输出。
实话说,第一种听起来更炫,但实际调试难度很大。MPC求解器在优化过程中需要对状态方程求梯度(或者至少做多次前向预测),神经网络是一个高度非线性的函数逼近器,它预测出的状态轨迹往往不平滑,这导致优化问题的数值特性变得很差——目标函数曲面坑坑洼洼,求解器经常陷入局部最优,甚至发散。
第二种方式就好得多。神经网络只负责预测残差项,主干的物理模型保证了预测轨迹的连续性,残差网络即使偶尔预测跳变,对整体优化的干扰也有限。工程上我更推荐这种做法,尤其适合第一次接触NN-MPC的复现者。
3.2 神经网络结构设计与训练细节
我采用的神经网络是带有一个隐层的前馈网络,隐层神经元64个,激活函数为tanh。输入维度为当前状态偏差和控制量历史,输出为预测残差。输入输出都做了归一化——一定要做,我刚开始没做,网络训练出来的残差预测完全没法用。原因是车辆的侧向偏差和横摆角速度量纲差异巨大(前者的量级在0.1-1米,后者可能是0.01-0.1 rad/s),不归一化的话网络会把注意力全放在大数值量纲的特征上。
训练数据通过如下流程生成:
- 在多种道路曲率和车速组合下,让车辆沿期望路径行驶,记录物理模型输出和真实车辆动力学的差值。
- 生成50000个样本点,按8:1:1划分训练集、验证集、测试集。
- 使用Adam优化器,初始学习率0.001,batch size 256,训练100个epoch。正则化用L2,系数取1e-4,防止过拟合。
训练后的残差预测模型,测试集上的均方误差压到了0.002以下,说明物理模型未建模的部分确实被网络捕捉到了。
4. 仿真对比实验:ANFIS-MPC、NN-MPC与传统MPC同台竞技
把三种控制方案放在同样的测试工况下对比,是检验算法价值最直接的办法。
4.1 测试工况设计
我设计了三种具有代表性的测试路线:
- 双移线工况:模拟紧急变道超车场景,车辆的横向位移快速变化,测试控制器的动态响应能力。
- 连续S弯低速工况:模拟市区低速绕行,曲率变化频繁,测试低速大曲率下的跟踪能力。
- 高速变曲率综合工况:车速保持在20-30m/s之间,道路曲率在0.005-0.02 1/m之间变化,测试高速综合性能。
4.2 各项指标对比
横向偏差的均方根误差(RMSE)和最大误差(Max Error)是评价路径跟踪效果的核心指标。稳态响应下的前轮转角抖动量用来评价控制平滑性。
| 控制方案 | 双移线RMSE (m) | 双移线Max (m) | S弯RMSE (m) | S弯Max (m) | 高速综合RMSE (m) | 高速综合Max (m) |
|---|---|---|---|---|---|---|
| 传统MPC | 0.106 | 0.185 | 0.089 | 0.152 | 0.133 | 0.214 |
| ANFIS-MPC | 0.079 | 0.128 | 0.062 | 0.104 | 0.085 | 0.143 |
| NN-MPC | 0.088 | 0.149 | 0.071 | 0.118 | 0.097 | 0.166 |
数据上看,ANFIS-MPC全面优于传统MPC,尤其是在高速综合工况下,RMSE下降了约36%,效果非常显著。NN-MPC虽然比传统MPC好,但和ANFIS-MPC比略有不足。
原因分析起来也不复杂:NN-MPC的预测模型虽然更准确,但MPC的权重矩阵依然是固定的——它并不知道在当前工况下应该更偏向"跟踪精度"还是"控制平稳"。而ANFIS-MPC直接从权重层面入手,让控制器知道这个弯道该重视什么,自然效率更高。
再看控制平滑性,ANFIS-MPC的前轮转角在高速段的抖动量降低了约28%,控制动作明显更"温和"。这在实际工程里意味着更低的转向执行器磨损和更好的乘坐舒适性。
4.3 计算开销对比
光看控制效果好不够,计算复杂度也得说清楚。我把三套方案在同样的硬件条件下(Intel Core i5处理器,MATLAB环境)测了单步控制周期的平均耗时:
| 控制方案 | 平均求解耗时 (ms) | 实时可行性分析 |
|---|---|---|
| 传统MPC | 4.3 | 50ms周期内可轻松完成 |
| ANFIS-MPC | 5.8 | 增加权重计算开销,仍可实时 |
| NN-MPC(模型替代) | 12.5 | 接近上限,需优化 |
| NN-MPC(模型辅助) | 7.2 | 尚可接受 |
ANFIS-MPC的额外开销主要来自模糊推理的前向计算——一个5层ANFIS结构,做一次前向计算也就毫秒级,对整体求解耗时的影响在可控范围内。NN-MPC模型替代法的12.5ms就比较危险了,一旦模型复杂度增加或者预测时域拉大,实时性就会成为瓶颈。
5. 复现中踩过的坑,希望你不用再踩一遍
这部分是实操中积累的经验,按重要程度排序。每个坑我都实际翻过车,写在文末给动手复现的朋友做个参考。
5.1 训练数据分布不均是个隐形杀手
在用网格搜索法生成ANFIS训练数据时,我一开始是均匀网格采样,结果出了两个问题:低速低偏差的工况数据特别多,高速高偏差的工况数据特别少。ANFIS训练出来之后,在常见的低速小偏差工况表现很好,一旦车速拉高、偏差变大,输出的权重就飘了——因为它没见过多少这样的样本,规则参数在稀疏区域外推效果极差。
改进办法是采用拉丁超立方采样保证数据点在大空间均匀分布,同时在高风险工况区域人为加密采样。另外,训练完后一定要检查ANFIS输出在高输入空间的插值外推行为,看看会不会出现剧烈的权重跳变。
5.2 权重在线变化过快会导致MPC求解震荡
ANFIS输出的权重系数直接喂给MPC求解器,这里有个隐蔽问题:如果权重在相邻两个控制周期内变化幅度过大,MPC的优化问题形态就会突变,最优解在前后的连续性被破坏,导致控制量抖振——这比单纯的跟踪误差还要危险,会引发执行器磨损甚至车辆不稳定。
我的解决办法是在ANFIS输出端加一个权重限幅和滤波模块:限幅确保权重不超出预设物理范围,低通滤波保证权重变化速率被限制在合理范围内。具体算例:当我设置滤波时间常数为0.5s时,高速工况下的前轮转角抖振幅度降低了约35%,跟踪精度没有明显损失。
5.3 C/GMRES的迭代次数和收敛阈值不是越大越好
这是MPC求解器层面最容易踩的坑。C/GMRES算法靠迭代逼近最优解,迭代次数越多精度越高,但耗时也线性增长。
在一次实时性测试中,我为了图精度把迭代次数从10提到30,结果单步耗时从3.8ms涨到了9.6ms,而跟踪精度几乎没变化——因为MPC本身是滚动优化,每个周期的解只执行一步,10次迭代的解已经足够好,30次迭代的边际收益微乎其微。
实测下来,对于我的动力学模型和预测时域20步的设置,GMRES迭代10-15次、收敛阈值设在1e-3就是性价比最高的配置。再往上加迭代次数纯粹是浪费算力。
5.4 神经网络模型的梯度爆炸问题
NN-MPC模型替代法在训练过程中有一个让人头疼的现象:前几个epoch的损失正常下降,训练到中间突然出现NaN,一查梯度,早就是天文数字了。
原因在于tanh激活函数的饱和区——当输入范数较大的时候,tanh的梯度趋近于0,反向传播时某一层的梯度链乘积就会指数级放大或缩小。解决方式,我最后做了三件事:
- 对输入数据做严格归一化,保证输入范数在合理区间(最大绝对值不超过3)。
- 给损失函数加梯度裁剪,max norm设为1.0。
- 用批量归一化层稳定中间层的激活分布。
做完这三点,NaN问题彻底消失,训练过程也稳定多了。
5.5 ANFIS的隶属函数数量不是越多越好
刚开始做ANFIS时,为了让规则表达更丰富,我在每个输入维度上设置了5个隶属函数,三个输入就是125条模糊规则。训练倒是能收敛,但推理速度变慢,更重要的是出现了明显的过拟合——在训练集覆盖区域外,规则组合的外推行为极其不稳定。
后来把隶属函数数量缩减到每个维度3个,总共27条规则,推理速度提升了一个数量级,泛化性能反而更好。这也验证了ANFIS的一个核心特征:它更适合"小而精"的规则库,而不是"大而全"的参数堆砌。
6. 两套方案的适用场景:怎么选才不后悔
复现完整套系统之后,我对这两套方案的定位有了更清晰的认识。
ANFIS-MPC的强项在于工况适应性。它没有改变MPC本身的优化框架,只是让权重随工况自适应变化,因此对现有MPC工程代码的改动量最小,调试起来也更直观。如果你的需求场景是"一辆车要跑各种不同车速、不同路况",ANFIS-MPC是最稳妥的升级路径。
NN-MPC的强项在于模型补偿能力。它更适合那些物理模型严重失真的场景——比如轮胎接近附着极限、路面湿滑、载荷剧烈变化。在这些场景下,物理模型预测出的轨迹跟真实轨迹偏差很大,只有靠神经网络补偿残差才能真正把预测做准。
一个值得注意的对比:在路面附着系数从0.8骤降到0.3的测试工况下,NN-MPC(模型辅助)相比传统MPC的最大横向偏差减小了约42%,而ANFIS-MPC在这类极端工况下的优势并没有那么明显。这说明模型的准确性在极限工况下是决定性的,权重调节并不能完全代替模型补偿。
所以结论是,如果既要适应不同工况、又要在极限工况下有兜底能力,可以考虑把两者叠起来用——ANFIS管权重,神经网络管残差补偿。我在仿真里试过叠加方案,在高速湿滑工况下RMSE比单独使用ANFIS-MPC又降低了15%。当然,复杂度也上了一个台阶,实时性压力更大,这个取舍要看实际需求。
在动手之前,先想清楚你手里最大的瓶颈是"模型不准"还是"参数不适配",对症下药,别一开始就上全套方案。