和朋友聊起最近在复现的一篇论文就是这个标题——基于神经网络与ANFIS结合的自适应MPC、外加一个神经网络NN-MPC用在自动驾驶车辆路径跟踪上。标题很长读起来有点劝退但拆开来看其实就两件事一个是在传统MPC外面套了一层自适应调节器另一个是彻底把MPC“学”成一个神经网络。我花了小半年时间把这条技术路线完整复现了一遍期间踩了不少坑也搞清楚了两类方案各自的真实水平。这篇内容不打算写成论文复述而是站在一个工程复现者的角度把这套东西怎么搭起来、每个模块为什么这么设计、实际跑起来是什么结果以及哪些细节论文不会告诉你都整理出来。适合正在做车辆横向控制、轨迹跟踪、智能驾驶控制算法验证的同学参考尤其是那些打算复现“MPC变体”但又被文献里的缩写绕晕的人。1. 复现这个课题前我到底想验证什么1.1 路径跟踪控制为什么绕不开MPC路径跟踪本身不是新问题核心任务是让车辆沿着一条参考路径走并且横向偏差、航向偏差都控制在合理范围内。传统PID也能做但在车速高、弯道急、路面附着力变化大的工况下PID的固定增益很难适应。模型预测控制MPC自带“向前看”能力能把动力学模型、约束条件和未来目标统一塞进一个优化问题里所以一直是路径跟踪控制的主流选择。但MPC有一个老毛病参数敏感。预测时域Np、控制时域Nc、权重矩阵Q和R每个参数都直接影响控制效果。同一组参数在低速直线工况和高速弯道工况下表现可能完全不同。调参过程基本靠经验试出来的参数又很难解释为什么好。论文里用ANFIS和神经网络去改造MPC本质上就是想把“人工调参”变成自适应过程。1.2 三个必须说清楚的验证目标我复现时给自己定了三个目标后面所有工作都是围绕它们展开的自适应是否真实有效ANFIS调出来的MPC参数是真正在变工况下比固定参数好还是只对特定测试路径有效。NN-MPC能否替代在线优化把MPC的求解过程离线学进神经网络在线只做一次前向推理这种思路在跟踪精度和实时性上能到什么程度。工程可行性的边界两套方案在算力、训练成本、参数标定、安全性方面的真实差异以及哪一种更适合作为落地方向。如果只是跑通流程、看一两张曲线图那验证意义不大。我后面所有的对比实验都是在这三个问题的框架下设计的。1.3 复现工作的边界说明需要先说明一点我复现的重点是横向路径跟踪纵向速度假设恒定。车辆模型用的是经典二自由度自行车模型重点考察横向误差e_y、航向误差e_psi以及横摆角速度的动态。这样做可以把问题收敛到横向控制本身避免纵向和横向耦合带来的干扰变量。另外这篇原文里的“神经网络NN-MPC”描述存在歧义——它既可能指“用神经网络预测模型MPC求解器”也可能指“用神经网络直接模仿MPC控制器”。我复现时选择的是后者也就是行为克隆behavior cloning路线让神经网络学习MPC的输入输出映射在线直接输出控制量。这样和ANFIS实现的自适应MPC对比起来更公平因为两者都指向同一个目标以低成本方式获得MPC级别的控制效果。2. 两类控制器在架构上的本质差异ANFIS自适应MPC与NN-MPC的分工逻辑2.1 自适应MPC优化器和自适应器各司其职自适应MPC这条路线保留的是“在线优化”这个核心框架。控制器仍然在每个控制周期里求解一个带约束的优化问题只是求解时用的参数不再固定而是由上层模块实时给出。这里上层模块就是神经网络加ANFIS的组合。为什么需要两者结合普通神经网络擅长从数据里学映射关系但缺点是黑箱、不可解释、需要大量数据而ANFIS本质是T-S模糊推理系统加上神经网络的学习结构它既能用模糊规则描述控制经验又能通过训练数据调整隶属度函数和结论参数。具体到控制链路是这样的关系状态估计模块给出当前横向偏差、航向偏差、车速、参考路径曲率ANFIS模块把这些信息作为输入实时输出MPC的权重矩阵参数比如横向偏差权重、航向偏差权重或者预测时域MPC求解器拿最新参数构造代价函数在线求解得到前轮转角控制量。整个过程里MPC负责“最优”ANFIS负责“自适应”互不替代但又紧密耦合。我甚至可以把ANFIS视为一个“带可解释性的增益调度器”它比查表法更平滑也比纯黑箱神经网络更容易被人接受。2.2 NN-MPC把优化器压缩成一次前向推理NN-MPC的路线就完全不同了。它不再在线求解优化问题而是先把MPC当“老师”离线采集大量“状态参考信息→最优控制量”的样本然后训练一个神经网络去模仿老师的决策在线只做一次前向推理直接输出控制量。这相当于把“专家经验”压缩进网络的权重里。好处非常明显在线计算量从求解一个二次规划问题变成了一堆矩阵乘法控制周期可以压缩到毫秒甚至微秒级别低算力平台也能跑。但代价也很明显MPC求解器有硬约束保障前轮转角限制、控制增量限制、状态约束神经网络没有。网络训练得再好也只是“近似”最优解一旦遇到训练分布之外的状态它的行为没有任何理论保障。所以在NN-MPC的工程实现里几乎都要配一个安全兜底比如超出误差阈值就切回MPC或PID。2.3 为什么作者要用ANFIS而不是普通BP网络做参数自适应这是我复现时反复琢磨的一个点。后来在实验里逐渐体会到自适应MPC需要的“参数调整规则”往往是局部的、可解释的低速时不要太激进高速弯道时加重横向误差权重。这种规则用模糊逻辑表达特别自然——如果车速高且曲率大那么权重就放大。而普通神经网络是把这些规则隐式地揉进了权重里效果也许不差但出了问题很难反推是哪里学歪了。ANFIS的好处在于模糊规则能给人一个“粗暴但可理解”的解释框架训练好的结论参数还能抽出来单独分析。对控制系统工程师来说这种可解释性比一点点精度提升更重要。2.4 两类方案的对比概览我复现前先做了一个技术选型对比用来指导后续工作核心差异如下对比维度自适应MPCANFISMPCNN-MPC行为克隆在线计算量高需要实时求解优化问题低仅一次网络前向推理可解释性中高模糊规则可检查低黑箱行为约束满足能力强MPC自带硬约束弱需要外部限幅和监控参数自适应能力强参数随工况在线调整弱训练完成后固定离线训练成本中等需要标定数据高需要大量MPC采样数据适用平台高算力工控机或车载计算单元低算力嵌入式平台这个表基本框定了我后面的实验方向自适应MPC重点看精度和参数变化NN-MPC重点看实时性和分布外泛化能力。3. 整车与路径仿真环境的搭建细节3.1 车辆动力学模型的选择路径跟踪控制里最常用的是二自由度自行车模型也叫单轨模型它把左右轮合并成一个等效轮忽略横纵向载荷转移和悬架侧倾的影响。对横向控制算法验证来说这个精度足够而且状态量少非常适合MPC实时计算。我采用的模型状态定义如下e_y距参考路径的横向偏差e_psi车辆航向与参考路径切线方向的航向偏差v_y车辆坐标系下的横向速度psi_dot横摆角速度控制输入u为前轮转角delta对应的状态方程可以写成e_y_dot v_x * e_psi v_y e_psi_dot psi_dot - v_x * kappa_ref v_y_dot (-m * v_x * psi_dot 2 * Cf * (delta - (v_y lf * psi_dot) / v_x) 2 * Cr * (- (v_y - lr * psi_dot) / v_x)) / m psi_dot_dot (2 * lf * Cf * (delta - (v_y lf * psi_dot) / v_x) - 2 * lr * Cr * (- (v_y - lr * psi_dot) / v_x)) / Iz这里m是整车质量Cf和Cr是前后轴等效侧偏刚度lf和lr是质心到前后轴的距离Iz是横摆惯性矩kappa_ref是参考路径曲率。注意这套方程里用了小角度假设也就是轮胎侧偏角在一个较小范围内如果复现时遇到的是紧急避障这类大侧偏工况线性轮胎模型就不够准了需要换成非线性轮胎公式。这个坑我后面会专门讲。3.2 参考路径与测试场景设计路径跟踪算法好不好不能只看一条路。我设计了三种典型参考路径来覆盖不同工况双移线路径模拟车辆高速变道对控制器动态响应要求高是最常用的测试场景。S形连续弯道模拟连续转向曲率变化平缓但持续时间长能检验控制器在稳态跟踪上的表现。正弦扫频路径模拟曲率周期性变化可以激励出控制器的振荡趋势用来观察参数自适应是否会引起不稳定。路径生成方式很简单先用参数曲线定义参考横坐标和纵坐标再对曲线求一阶和二阶导数得到航向角和曲率。有一点需要注意对离散路径点做数值求导时会让曲率带上噪声建议在采样前先对路径做平滑滤波否则MPC里面的参考曲率抖动会直接放大成控制量抖动。3.3 离散化与控制周期MPC必须在离散时间域内求解。我选择采样周期Ts为20ms控制周期50Hz。这个频率对路径跟踪来说足够也能覆盖大部分嵌入式平台的算力需求。离散化方法我采用的是四阶Runge-KuttaRK4做模型状态更新而不是简单的一阶欧拉。原因很简单欧拉法在迭代预测时域Np20步的情况下累积离散误差会明显影响MPC的预测精度尤其是横摆角速度这一路误差大了之后控制效果会变差。RK4虽然每一步多算几次状态方程但预测结果要可靠得多。控制量约束我设为delta_min -0.35 rad delta_max 0.35 rad delta_dot_min -0.05 rad / step delta_dot_max 0.05 rad / step预测时域Np取20控制时域Nc取5权重矩阵初始值Qdiag(10, 8)R1。这些初值不是凭空来的是先通过离线仿真粗略搜索后确定的后面会交给ANFIS去在线调整。3.4 性能评价指标为了公平对比不同控制器的效果我定义了一组固定指标横向偏差均方根值RMS_e_y反映整体跟踪精度最大横向偏差e_y_max反映瞬态大偏差是否可接受航向偏差均方根值RMS_e_psi反映航向保持能力控制量变化率均方根值RMS_d_delta反映控制信号是否平滑单步平均计算时间反映实时性这组指标贯穿了后面所有对比实验保证不同方案之间的比较口径完全一致。4. ANFIS自适应MPC的实现拆解参数从哪来又如何更新4.1 MPC原始形式与参数敏感点先把固定MPC的优化问题写出来这是后面一切的基础min sum_{k0}^{Np-1} ( y_err(k)^T * Q * y_err(k) delta_delta(k)^T * R * delta_delta(k) ) s.t. x(k1) f(x(k), delta(k)) delta_min delta(k) delta_max delta_delta_min delta_delta(k) delta_delta_max其中y_err包含横向偏差和航向偏差delta_delta是前轮转角增量。Q矩阵里横向偏差权重q_y和航向偏差权重q_psi是决定控制行为的关键q_y太大控制器会拼命把横向偏差压到零容易引起转向过猛、车辆振荡q_psi太大控制器会优先对齐航向横向误差收敛变慢弯道跟踪容易出现内侧漂移R太大控制动作过于保守误差收敛慢R太小动作频繁执行机构压力大。传统做法是拿一组固定参数跑到底工况一变就只能靠工程师重新标定。ANFIS在这里干的活本质上就是代替工程师去处理这种“工况变化→参数调整”的映射关系。4.2 ANFIS输入与输出设计我在复现中没有把所有状态都怼进一个ANFIS模块那样会导致规则数爆炸后面会专门讲这个坑。我采用的是“拆分设计”一个ANFIS模块只负责一个权重参数。具体来说我设计了两个子模块ANFIS-Q_y输入为车速v_x、参考路径曲率kappa_ref、横向偏差e_y输出为横向偏差权重q_yANFIS-Q_psi输入为车速v_x、参考路径曲率kappa_ref、航向偏差e_psi输出为航向偏差权重q_psi。每个输入只划分3个模糊集比如车速划分为{低速、中速、高速}曲率划分为{小曲率、中曲率、大曲率}。这样每个规则库里最多3^327条规则对控制周期20ms来说完全够用。规则采用一阶T-S模糊规则形式如下如果 v_x 是 高速 且 kappa_ref 是 大曲率 且 e_y 是 正大 则 q_y p0 p1*v_x p2*kappa_ref p3*e_y这里p0到p3是结论参数由训练决定。T-S结构的优势在于它最终输出是一个光滑的线性组合不会像查表法那样在工况边界产生跳变。4.3 训练数据生成从标定经验到监督样本ANFIS的参数需要数据驱动来训练。但这些权重参数的“真实标签”从哪来我的做法是分两步走第一步离线扫参。在不同速度20/40/60/80km/h和不同曲率路径半径50/100/150m及直线下用固定MPC配合网格搜索对q_y和q_psi进行扫描选出每组工况下跟踪误差RMS最小的一组权重作为“经验最优值”。第二步构造训练集。把车速、曲率、误差等输入和扫出来的最优权重组合成输入输出样本用这些数据去训练两个ANFIS模块。训练采用混合算法前件参数用梯度下降结论参数用最小二乘这种分成两段优化的方式比一起优化收敛快很多。我实际跑下来80%的训练样本都来自中低速工况高速样本偏少这导致ANFIS在高速大曲率区间的拟合精度不如中低速区间。后来我重新调整了采样分布把高速工况的样本比例从20%提升到45%效果才有明显改善。这算是做自适应算法时一个很值得注意的数据工程细节。4.4 在线控制循环整个自适应MPC在线运行的流程用伪代码表示是下面这样for t 0, Ts, 2*Ts, ..., T_end: # 读取当前状态 state get_vehicle_state() ref_seq get_reference_sequence(t, Np) # ANFIS在线输出权重参数 q_y anfis_qy.eval(v_x, kappa_ref, e_y) q_psi anfis_qpsi.eval(v_x, kappa_ref, e_psi) # 构造MPC优化问题 Q diag(q_y, q_psi) u_opt mpc_solve(state, ref_seq, Q, R, Np, Nc, constraints) # 执行第一个控制量 apply_control(u_opt[0])我在实现里让ANFIS只负责输出权重不在线调整自身的隶属度参数。原因是实车运行中传感器数据噪声大如果每个控制周期都去在线更新隶属度函数很容易出现参数漂移甚至导致权重值跳变。更稳妥的方案是离线训练好在线只做前向计算。4.5 实际效果和边界条件ANFIS自适应MPC跑下来最直观的变化是高速大曲率工况下q_y会自动增大控制器会更快地拉回横向偏差跟踪轨迹更贴线而低速小曲率工况下q_y会降下来控制动作更柔和车辆不会频繁修正方向。但我必须说明它的边界条件。如果路面附着系数突然从0.85掉到0.3仅靠调整权重矩阵是不够的因为权重变化只能改变控制的优先级不能改变预测模型本身对轮胎力的错误估计。这时就需要对模型参数也进行自适应而不仅仅是权重自适应。论文标题里的“自适应”更多是面向工况变化不是面向模型严重失配。5. NN-MPC的实现路径让神经网络“学会”优化器5.1 教师数据的生成NN-MPC的第一步是生成足够多、足够有代表性的训练数据。我选用的策略是让固定MPC在开环和闭环混合模式下滚动采样。具体做法是随机初始化车辆状态让状态在某个范围内波动横向偏差在-1.5m到1.5m之间航向偏差在-0.3rad到0.3rad之间速度在20km/h到80km/h之间然后跑MPC闭环仿真。每个采样时刻记录下一组输入输出对输入: [e_y, e_psi, v_y, psi_dot, v_x, kappa_ref, delta_prev] 输出: [delta_opt]这里delta_prev是上一时刻的前轮转角加上它可以显著抑制神经网络输出的高频抖动。如果不加这一项网络学出来的控制动作很容易在相邻时刻之间大幅跳变实车执行机构根本受不了。我总共采集了约30万条样本分布在各种初始偏差和速度组合下。生成样本花了很长时间因为每一条样本都需要在线求解一次MPC即使中等规模问题平均也要几毫秒。后来我用多个线程并行采样才把时间压缩到了可接受范围。5.2 网络结构与输入输出设计网络结构我尝试过多种最终稳定下来的是一个三层全连接网络输入层: 8个节点 隐藏层1: 256个节点, ReLU 隐藏层2: 128个节点, ReLU 输出层: 1个节点, tanh激活乘以delta_max限幅选256和128是因为在这个数据规模下这个容量既能拟合教师策略又不至于复杂到在训练集上严重过拟合。输出层用tanh然后把值乘以delta_max好处是把控制量硬限制在最大转角范围内相当于给神经网络加了一个输出限幅。损失函数我最终用的是Huber损失Smooth L1而不是纯MSE。原因是绕中如果出现少量离群样本MSE会被这些样本拖得非常大导致网络为了照顾离群点而牺牲大部分区间的拟合精度Huber损失在误差大时变为线性损失对离群点更鲁棒。5.3 训练流程与效果训练过程用标准的Adam优化器初始学习率1e-3每20个epoch衰减0.5批量大小256。数据按8:1:1划分为训练集、验证集和测试集。训练收敛很快大约500个epoch后验证损失基本不再下降。测试集上的平均绝对误差大概在0.012rad左右看起来很小但要注意这个误差是在“单步状态输入”条件下的放进闭环里会被层层放大后面对比实验里就会暴露出来。训练结束后把网络和MPC做一个统计对比测试集上网络输出和MPC输出的相关系数在0.98左右。这个数字看着很漂亮我当时差点以为NN-MPC可以直接替代MPC结果闭环仿真狠狠教育了我。5.4 在线推理与安全兜底网上线推理时每一控制周期只做一次前向计算耗时不到0.2毫秒和MPC的几毫秒比几乎可以忽略不计。但前面说过神经网络没有硬约束概念一旦状态超出训练分布它的输出就不可控了。我在NN-MPC外面包了一个监控层if abs(e_y) 0.5m or abs(e_psi) 0.2rad: switch to MPC fallback else: delta nn_policy(state) delta clamp(delta, delta_min, delta_max)这个兜底策略是工程上必须有的不然纯NN-MPC在偏差稍大的情况下很容易出现输出饱和或者进入振荡发散。单纯看论文里的“端到端”效果很多人会忽略这一层但我复现后的结论是NN-MPC可以作为快速控制器但很难作为安全关键控制器独立运行。5.5 为什么会出现分布偏移问题朴素行为克隆最大的坑是“训练时一步犯错测试时步步错”。训练数据里网络输入都是MPC产生的高质量状态分布但在线闭环时网络自己输出的控制量会把车辆带到训练样本覆盖范围之外的状态。一旦进入陌生区域网络输出就更不靠谱形成恶性循环。我采用的缓解办法是数据聚合先在基础数据集上训一个初始网络用它在闭环里跑把跑出来的状态喂给老师MPC重新生成合理控制量再把新样本加入训练集重新训练。如此迭代两三轮后闭环稳定性有了明显改观。这个思路和模仿学习里的DAgger算法类似是行为克隆类方法里我觉得最值得去做的一个环节。6. 相同工况下的对比结果与误差数据分析6.1 测试工况定义为了公平对比三套方案固定权重MPC、ANFIS自适应MPC、NN-MPC我统一在双移线工况下测试车速80km/h采样周期20ms所有控制器共用同一个车辆模型和路径。在这个工况下车辆需要完成两次快速变道曲率变化剧烈。固定权重MPC采用和自适应MPC相同的初值参数但不做任何在线调整NN-MPC采用训练完成的网络加监控兜底。6.2 精度与实时性对比三套方案的统计指标如下控制器类型RMS横向偏差(m)最大横向偏差(m)平均单步耗时(ms)控制信号平滑度固定MPC0.1220.347.0较好ANFIS自适应MPC0.0630.177.2好NN-MPC0.1150.310.6一般有轻微振荡从精度看ANFIS自适应MPC是明显的赢家RMS横向偏差比固定MPC下降了接近一半最大偏差也从0.34m压到了0.17m。原因非常清楚当车辆进入第二个弯道时曲率变大、横向偏差骤增ANFIS及时增大了q_y权重控制器响应更果断而固定MPC只能按最初标定的权重慢慢拉回误差响应滞后。NN-MPC的精度虽然不如自适应MPC但是单步耗时只有0.6ms基本是MPC的十分之一。这个实时性优势在低算力平台上非常有价值如果对精度要求不是极端苛刻NN-MPC完全有应用空间。6.3 参数失配鲁棒性测试我又加了一组鲁棒性测试把车辆模型里的前后轴侧偏刚度同时增加30%模拟轮胎特性变化或路面附着变化带来的模型失配其他条件不变。控制器类型RMS横向偏差(m)最大横向偏差(m)是否出现振荡固定MPC0.180.55是略有超调ANFIS自适应MPC0.120.23否NN-MPC0.260.47是稳态附近抖动固定MPC因为在预测模型里使用了错误的轮胎刚度导致车辆实际响应比预测更“贼”横向误差被预测模型低估超调明显。ANFIS自适应MPC虽然预测模型同样失配但它的权重调节模块看到误差持续增大后会自动加大误差权重相当于用更强的反馈去补偿模型的乐观估计所以最大偏差还能压住。NN-MPC表现最差因为它的训练数据来自名义模型MPC模型一变整个输入输出映射的前提就失效了。这再次印证了NN-MPC的“分布内有效、分布外脆弱”特点。6.4 结果背后的机理分析这几组对比说明了一个很核心的问题对MPC做参数级自适应得到的收益是直接的、可解释的、可工程验证的对MPC做行为克隆收益主要体现在算力上但损失了模型预测和约束处理的能力。我的复现结论是如果计算资源充裕自适应MPC是更稳妥的技术路线如果目标是低算力平台NN-MPC值得继续深入但不能把它当黑箱直接用必须在网络结构和监督数据生成上做大量针对性工作。7. 复现时踩过的坑与工程建议7.1 ANFIS的规则爆炸问题一开始我曾经试图把全部状态作为ANFIS输入然后直接输出一组权重矩阵。结果输入维度达到7个每个变量划分3个模糊集规则数变成了3^72187条。且不说训练数据量要求光是规则库的计算开销就已经撑爆了控制周期预算。解决办法就是前面说的拆分设计每个ANFIS只负责一个权重参数输入限制在二到三个变量以内。这样规则数量可控每个模块的训练数据也更集中。如果你在复现时也遇到ANFIS在线计算超时大概率就是规则数失控了。7.2 朴素行为克隆在闭环里发散这是我在NN-MPC上遇到的最大坑。第一次训练完网络测试集误差很小满怀信心放进闭环仿真结果车辆在第二个弯道就跑飞了。原因就是我前面说的分布偏移。后来我做了数据聚合迭代训练情况才真正好转。每次用当前网络闭环跑500条随机初始状态轨迹把网络“不懂”的状态样本交给老师MPC打标签重新训练。两三轮之后网络在高偏差区间的表现有了明显改善。这个迭代训练过程论文里通常一笔带过但实际占了我NN-MPC部分一半的开发时间。7.3 离散化方式不一致导致学出来的策略错位还有一个很低级但很容易犯的错生成训练数据时MPC内部用的是RK4离散模型但我给神经网络构造训练样本时状态更新却用了欧拉法。导致网络学到的输入输出映射和实际仿真模型之间的口径对不上控制效果乱七八糟。事后检查发现只要把数据生成器和在线仿真的离散化方式改成完全一致这个问题立刻消失。这个经验提醒我在复现别人算法时先把所有模块里的时间离散约定统一写清楚再往下做否则排查起来极其痛苦。7.4 在线更新ANFIS参数的失败教训我也试过让ANFIS在控制过程中持续更新隶属度参数理论上可以让自适应更快。结果在连续弯道工况下误差信号里包含的噪声和滞后让隶属度函数不断漂移权重输出出现高频波动控制效果反而比冻结参数更差。最终的方案是隶属度函数形状离线训练固定在线只做参数前向推理。这样既保留了对工况的适应性又避免了在线学习的稳定性风险。对于大多数实际控制系统这种“离线学习在线推理”的模式已经够用不必强行追求在线学习。7.5 工程落地顺序建议结合这次复现我个人的工程建议是先上固定MPC作为基线再引入ANFIS做自动标定把人工调参的工作量降下来NN-MPC可以作为低算力平台的候选方案但必须配套监控和兜底机制并且要持续收集线上数据迭代训练否则很难保证长期稳定。复现整个过程下来最大的体会是这两类控制器的价值不能只看论文里的对比曲线。ANFIS自适应MPC赢在可靠性和可解释性NN-MPC赢在实时性和低算力友好它们是解决不同场景问题的两条路不是替代关系。最后再分享一个细节整个项目里我花在数据清洗和分布设计上的时间远多于网络训练本身。控制类任务和图像分类不一样样本不光要数量多更要覆盖到控制器可能遇到的各种临界状态。能把这一步做到位后面的训练和仿真都会顺很多。
阅读完成 · 觉得有帮助?