资讯动态

NN+ANFIS自适应MPC:自动驾驶路径跟踪的鲁棒性增强方案

发布时间:2026/10/20 2:56:13 来源:尧图企业网站定制
路径跟踪是自动驾驶控制里最经典的验证场景而MPC模型预测控制几乎成了这个问题的默认答案。我前段时间复现了一套思路把神经网络和ANFIS自适应神经模糊推理系统一起整合进MPC做成能够在线的自适应MPC同时搭了一版用神经网络做预测模型的NN-MPC用来对照。简单说标准MPC的性能取决于预测模型准不准可真实车辆在高速、变道、路面附着变化时模型参数一直在漂固定模型必然吃亏。神经网络负责从数据里学出车辆动力学ANFIS负责在线修正模型偏差或调节控制权重两者配合MPC的滚动优化正好补上了鲁棒性这块短板。这篇文章就聊聊这套方法的原理、建模步骤、复现过程中踩过的坑以及最终仿真结果怎么解读。正在做横向控制或者想把智能控制与传统控制方法结合进仿真项目里的读者可以重点参考。1. 我为什么把神经网络和ANFIS塞进MPC1.1 路径跟踪控制器要面对的真正问题路径跟踪从直觉上很简单让车辆贴着参考线走偏差大了回打一点方向。但真做控制设计就会发现问题没这么轻松。车辆是一个强耦合的非线性系统纵向速度会影响横摆动态轮胎力在侧偏角大时会进入饱和区悬架和转向系统还给整个回路叠加上不小的延迟。更麻烦的是模型参数本身不确定整车质量随载重变化轮胎侧偏刚度随路面附着条件变化高速时空气动力学的影响也开始显现。换句话说控制器面对的是一套今天和明天不一样的系统。经典的PID和Stanley方法胜在简单但它们本质上是无约束的启发式反馈对执行器饱和、转向速率限制这类硬约束处理得很粗暴。LQR能把状态偏差和控制代价折中起来算但依然不考虑约束而且它的权重是全局固定的工况一变就没有自适应能力。MPC之所以成为自动驾驶横向控制的主流选择是因为它把未来一段时间的预测和带约束的优化放在同一个框架里比PID多看了几步路还能明确地把方向盘转角限位、增量限位写进约束。不过MPC有个前提——预测模型必须足够准。模型不准预测轨迹就是错的优化出来的控制量自然不可信。这就是整篇复现工作的核心矛盾MPC需要一个准确的模型而真实车辆模型从来都不是固定的。1.2 三条技术路线的取舍逻辑我这次一共跑了三条路线形成对照组技术路线预测模型来源在线自适应能力实现成本线性时变MPC每个采样周期在工作点附近线性化展开无低NN-MPC神经网络从数据中学习车辆动力学无训练后固定中NNANFIS自适应MPC神经网络做基准预测ANFIS在线补偿模型偏差/调节权重高线性时变MPC的思路是每个周期把非线性模型在当下工作点泰勒展开得到一个线性模型再做二次规划求解。优点是不用额外训练计算快论文里做对比基线非常合适。缺点是线性化误差在非线性强的时候会积累比如高速急转、轮胎进入非线性区线性模型就兜不住了。NN-MPC的做法是放弃手动建模让神经网络直接拟合输入输出映射。它能表达复杂的非线性关系这是它的最大价值。但问题也明显网络训练完就是固定的路面摩擦变化、载重变化等工况漂移它感知不到预测偏差会随着环境改变悄悄变大。NNANFIS的方案补上了在线自适应这一环。神经网络负责预先学好静态的那部分非线性动力学ANFIS则扮演一个轻量级在线调节器它根据当前跟踪误差、误差变化率和车速实时输出一个补偿量或者动态调整MPC代价函数里的权重。为什么选ANFIS而不是再上一个神经网络来做在线调节一是ANFIS本质上是一组可解释的模糊规则调试时能看出每条规则在什么时候起作用二是它的混合学习机制最小二乘加反向传播收敛快初始化和在线更新都比纯神经网络容易控制三是它对噪声和异常数据相对稳健输出变化平滑不容易把控制回路搞乱。这正是控制器在线模块最需要的性格。1.3 复现目标与总体架构整套系统的框架可以拆成四个部分。参考路径生成模块负责输出带位置和航向的期望轨迹我用的是一段包含直线、双移线和弯道的组合道路。控制器模块是核心内部包含一个非线性优化求解器以及预测模型提供方——要么是纯神经网络要么是神经网络加ANFIS补偿。被控对象模块是车辆模型低速工况用运动学自行车模型就够高速工况必须上带轮胎侧偏特性的动力学自行车模型条件允许还可以替换成高保真车辆仿真平台做验证。反馈回路把当前车辆状态送给MPC作为本次优化的起点同时把跟踪误差喂给ANFIS做在线调整。这里有一个容易被忽略的设计决策ANFIS的输入为什么用误差及其变化率而不是直接用车速和横摆角速度等原始状态我的体会是误差量是目标导向的它对任意形状的参考路径都有意义。如果直接用车况状态量做输入网络学到的东西和具体路径强绑定换一条路就得重新训练泛化性差。误差输入则天然把问题归一化了不管路径怎么变控制目标都是把误差压到零。2. 先把数学底子打牢2.1 车辆模型选型运动学还是动力学路径跟踪项目里第一个要做的决定是底层车辆模型用运动学还是动力学。低速一般指低于10 m/s场景下车辆侧偏角很小轮胎工作在线性区用运动学自行车模型就够β arctan( l_r·tan(δ_f) / (l_f l_r) ) x v·cos(ψ β) y v·sin(ψ β) ψ v·sin(β) / l_r其中β是车辆质心侧偏角δ_f是前轮转角l_f和l_r分别是质心到前轴和后轴的距离ψ是航向角。如果进一步假设β可以忽略模型还能简化成x v·cosψ y v·sinψ ψ v·tanδ / LL是轴距。这个简化模型在低速下做路径跟踪足够准确而且结构简单、求导容易非常适合做MPC的预测模型。但速度一上来侧向加速度增大轮胎必须产生足够大的侧向力才能维持转向这时候侧偏角不能再忽略。必须切换到动力学自行车模型m·(v_y v_x·r) F_yf·cosδ_f F_yr I_z·r l_f·F_yf·cosδ_f − l_r·F_yr其中v_y是侧向速度r是横摆角速度I_z是横摆转动惯量。轮胎侧偏角为α_f arctan((v_y l_f·r)/v_x) − δ_f α_r arctan((v_y − l_r·r)/v_x)在线性区内侧向力与侧偏角成正比F_yf −C_f·α_f F_yr −C_r·α_rC_f和C_r就是前后轴的侧偏刚度。这里要特别强调侧偏刚度是整个模型里不确定性最大的参数干燥沥青路面和湿滑路面上的数值可以差出一倍而且它随垂直载荷变化。这恰恰是后面神经网络和ANFIS发挥作用的切入点——模型结构我们知道但参数和未建模动态需要数据来补偿。2.2 MPC的优化问题怎么摆MPC的数学命题每个周期都要解一次。给定离散化的预测模型x(k1) f(x(k), u(k))在第k个采样时刻基于当前实测状态x(k)求解从当前时刻起N_p步内的最优控制序列min_{u(0..N_c)} Σ_{i0}^{N_p−1} ( ‖y(ki) − y_ref(ki)‖²_Q ‖u(ki)‖²_R ‖Δu(ki)‖²_S ) s.t. x(ki1) f(x(ki), u(ki)) u_min ≤ u(ki) ≤ u_max Δu_min ≤ Δu(ki) ≤ Δu_max x(k) x_current_statey是模型输出的预测位置和航向y_ref是对应的参考值。目标函数有三项第一项把预测轨迹拉向参考路径第二项惩罚过大的控制量第三项惩罚控制量变化过快。前三项对应的权重矩阵分别是Q、R和S它们的相对大小直接决定控制风格。解完这个优化问题之后只把u(0)施加给车辆下一采样周期用新的状态重新求解。这就是滚动优化的含义。预测时域N_p决定控制器能看多远控制时域N_c决定控制器能自由操作几步。这两个数字直接影响控制性能和计算量我后面的参数表里给了一个经实测比较合理的组合。需要提醒的是当f是线性模型时上面的优化问题能整理成二次规划用现成求解器毫秒级解完当f是神经网络或者非线性解析模型时这是非线性规划得用序列二次规划或内点法计算量上一个台阶。这也决定了NN-MPC的实时性肯定比线性MPC差后面实测数据会印证这点。2.3 神经网络在MPC里到底承担什么角色很多人一听NN-MPC会以为是用神经网络直接输出方向盘转角那是强化学习或者模仿学习的玩法。实际文献里的NN-MPC多数是指神经网络充当预测模型输入当前状态和控制量输出下一时刻的状态增量。角色类似于系统辨识里的黑箱建模只不过用神经网络替代了多项式拟合或者传递函数。神经网络需要解决的核心问题是车辆是个带惯性、带延迟、带饱和的系统单步预测误差不致命但MPC要在优化目标里积分N_p步的预测轨迹多步预测的误差会沿着预测轨迹累积。这个问题必须在训练阶段就重视。我的做法是这样的用伪随机二进制序列加扫频信号激励方向盘转角在不同速度下采集大量输入输出数据然后设计网络输入为当前状态向量和控制量输出为状态增量Δx。之所以预测增量而不是绝对状态是为了让网络学一个更平稳的映射训练更容易收敛。网络结构选了四输入纵向速度、侧向速度、横摆角速度、航向角加控制量两个隐藏层各32个节点激活函数用tanh输出层线性。训练用均方误差作为损失函数Adam优化器初始学习率1e-3配合早停机制防止过拟合。训练完之后要先做验证——不是只看单步预测误差而是做自回归多步预测即把预测出来的状态再喂回网络连续跑N_p步和真实模型输出做对比。这一步能直观暴露误差累积问题我实测发现如果训练数据覆盖面不足多步预测在3秒后就开始显著漂移。2.4 ANFIS为什么能在线自适应ANFIS的全称是自适应神经模糊推理系统本质上是把模糊推理的规则结构和神经网络的学习能力合体。它内部维护一组形如以下的Takagi-Sugeno模糊规则规则 i: 如果 e 是 A_i 且 ė 是 B_i 且 v 是 C_i 则 f_i p_i·e q_i·ė r_i·v s_i其中e是跟踪误差ė是误差变化率v是车速A_i、B_i、C_i是模糊集合p_i、q_i、r_i、s_i是结论参数。最终输出是各条规则输出的加权平均权重由输入对模糊集合的隶属度决定。ANFIS的聪明之处在训练方式前件参数隶属度函数的中心和宽度用反向传播更新后件参数那四个线性系数用最小二乘法一步求最优。这个混合学习策略比纯神经网络快得多通常几十轮迭代就能达到可用精度。更关键的是它天然支持在线更新后件参数可以用带遗忘因子的递推最小二乘法持续更新遗忘因子取0.99左右让新数据逐渐覆盖旧数据实现对工况漂移的跟踪。在自适应MPC里ANFIS有两条典型接入路径。路径一是做模型补偿ANFIS根据误差状态输出一个转角修正量Δδ叠加到MPC输出的控制量上相当于在线补上预测模型的偏差。路径二是做代价权重调节ANFIS输出一个缩放因子动态改变目标函数里Q或R的大小比如误差偏大时自动提高误差惩罚让控制器更激进地纠偏。两条路径各有利弊路径一直接、见效快但物理含义不清晰路径二温和稳定但不改变预测轨迹本身纠偏速度稍慢。我复现时两条都试了效果差异我会在结果部分讨论。3. 复现实操从建模到跑通3.1 工具链与仿真环境配置这个项目有两个主流技术栈。一是MATLAB/Simulink路线车辆模型搭在Simulink里MPC用S-Function或者脚本回调实现神经网络用自带工具箱训练ANFIS用模糊工具箱的genfis和anfis函数非线性优化可以直接调fmincon。优点是成熟稳定而且后续想接高保真车辆仿真平台做联合仿真时衔接比较顺。二是Python路线车辆模型用NumPy手写离散化方程神经网络用PyTorch或者TensorFlowANFIS可以自己实现或者用现成的开源实现非线性优化用scipy.optimize.minimize里的SLSQP算法。优点是代码可读性好、全流程可控方便调试和可视化。我自己这次复现走的是Python路线文件结构大致是这样vehicle.py # 车辆动力学模型与离散化 data_gen.py # 激励信号生成与训练数据采集 nn_model.py # 神经网络定义、训练、多步预测 anfis_model.py # ANFIS实现、离线训练、递推在线更新 mpc_core.py # MPC优化问题构造与求解 run_sim.py # 主仿真循环 analyze.py # 结果统计与绘图如果之前只做过线性控制第一次上手会不适应的地方是每个采样周期都在调优化求解器而不是在写控制律。这个思路转变要提前做好心理建设。3.2 NN-MPC实现流程NN-MPC的落地我拆成六步。第一步生成训练数据这一步的质量几乎决定整个方案的成败。我用转向角激励信号叠加幅度限制在±0.3 rad以内频率从0.1 Hz扫到2 Hz车速在8到20 m/s之间随机变化总共跑了60秒仿真采样周期0.05秒得到1200个数据点。核心原则是让数据覆盖控制过程中可能到达的全部状态空间只覆盖稳态附近的话网络在瞬态条件下就是盲猜。第二步数据预处理把各维状态分别归一化到[-1,1]区间剔除起始瞬态数据按7:2:1划分训练集、验证集和测试集。归一化这一步不能省否则网络训练会非常慢甚至不收敛。第三步定义网络结构输入是[v_x, v_y, r, ψ, δ]五个量输出是[v_x增量, v_y增量, r增量, ψ增量]四个量。两个隐藏层各32个节点tanh激活。之所以输出增量而不是绝对状态是因为增量映射更接近线性关系网络拟合难度低。第四步训练网络均方误差损失Adam优化器学习率1e-3批次128训练轮数上限500配合早停。训练完成后做两项验证单步预测误差量化以及多步自回归预测曲线对比。我实测的验证结果是单步预测误差在2%以内但10步预测会在弯道工况出现可见漂移这个信息直接决定了预测时域不敢取太大。第五步把网络封装成MPC的预测器。预测器接收当前状态和一组控制序列用网络逐点推演整条未来轨迹返回位置和航向的预测序列。优化目标函数和约束都基于这条预测轨迹计算。第六步接入优化求解器。我用了scipy的SLSQP梯度用有限差分计算步长取1e-3。这里有个实际权衡有限差分计算简单但精度一般优化需要更多迭代用PyTorch自动微分计算精确梯度会让单次迭代更有效但整个求解过程耗时明显增加。建议先把有限差分版本跑通逻辑再考虑换自动微分。3.3 ANFIS自适应MPC实现细节ANFIS模块我分两步做。第一步离线初始化第二步在线更新。离线阶段先跑一版纯NN-MPC的闭环仿真记录每个时刻的跟踪误差e、误差变化率ė、车速v以及模型预测与真实状态之间的残差。这些残差就是ANFIS要学习的目标。ANFIS输入三个变量每个变量分配3个广义钟形隶属函数规则数3×3×327条。用混合学习算法训练200轮前件学习率0.01。训练完成后的初始模型已经能对常见工况的残差做出合理估计。在线阶段的核心是参数更新不能太激进。我固定了前件参数只让后件参数用递推最小二乘法更新遗忘因子λ取0.99。这样既有自适应能力又不会因为某一个异常采样点导致整个模型跳变。同时给ANFIS输出加了硬限幅修正量限制在±0.1 rad以内。这个限幅非常关键——我在调试早期见过ANFIS输出直接顶满饱和把原本稳定的MPC回路搅出明显的等幅振荡加上限幅后问题立即缓解。接入方式上我最终采用路径一为主、路径二为辅的组合小误差时以权重调节为主避免频繁修正引起抖动大误差时启用直接补偿快速把偏差压回去。这个切换本身也是一条模糊规则逻辑上用误差绝对值判断即可。3.4 关键参数怎么定参数整定是复现这类工作最花时间的部分。我最终使用的参数组合和背后的调参逻辑整理成了一张表参数推荐范围我的取值采样周期 T_s0.02~0.1 s0.05 s预测时域 N_p10~2515控制时域 N_c3~64横向误差权重 Q_y1~5010航向误差权重 Q_ψ0.5~105控制量权重 R0.01~10.1控制增量权重 S0.1~51转向角约束±0.4 rad0.4转向增量约束每步±0.2 rad0.2采样周期选0.05秒是综合考虑了控制带宽和计算负载。预测时域15步对应0.75秒的预测范围对10到20 m/s车速下的换道和过弯来说刚好够用短了看不清弯道趋势长了要么计算变慢要么多步预测误差把模型弄得不靠谱。权重方面横向误差权重取10、航向误差取5反映位置偏差比姿态偏差重要一点的直觉。控制量权重0.1意味着方向盘转动本身代价不高但增量权重1会有效抑制转向抖动。调参时有几条经验可以参考。增大Q_y能减小稳态横向误差但超过一定阈值就会诱发振荡尤其是高速工况。如果发现方向在弯道里来回修优先增大S而不是减小Q_y因为问题多半出在控制量速率变化太快。R一般不用太大路径跟踪本来就需要方向盘有动作把R压死反而会让误差迟迟消不掉。4. 仿真结果与现象分析4.1 测试工况设置为了公平对比三条控制路线我设计了一段组合道路前50米直线让车辆进入稳定状态接着是一段位移3.5米的双移线再接一个半径30米的90°弯道总长大约300米。最关键的设计是道路中段模拟了路面附着条件突变——整个弯道区间的轮胎侧偏刚度在名义值基础上降低15%模拟湿滑路面。这个设计直接考验控制器的自适应能力。实验设置了两个速度等级10 m/s和18 m/s对应中低速和较高速度两种场景。评价指标用最大横向误差、横向误差均方根、航向误差均方根以及单个采样周期内控制器求解耗时。为了公平三个控制器的采样周期和道路完全一致NN-MPC和自适应MPC用的是同一批训练好的神经网络。4.2 三组控制器横向误差对比实测数据整理如下表控制器最大横向误差 (m)RMS横向误差 (m)航向RMS误差 (rad)单步求解耗时 (ms)线性时变MPC0.410.190.0208NN-MPC0.280.120.01426NNANFIS自适应MPC0.180.080.00931这个结果完全符合预期但改善幅度值得细说。线性时变MPC在直线段表现很好误差基本在0.05米以内但进入弯道且路面附着衰减后线性化模型对轮胎力估计偏乐观实际需要的转角比预测模型认为的多车辆出现明显的外推趋势最大误差拉到0.41米。NN-MPC因为是从非线性动力学数据里学出来的模型对轮胎进入非线性区后的响应预测更准误差峰值降到0.28米。这说明数据驱动模型确实捕捉到了线性模型丢掉的非线性特征。自适应MPC的最大横向误差进一步压到0.18米提升主要发生在两个时刻一是双移线换道的中段ANFIS检测到误差变化率增大后提前输出补偿方向二是弯道路面附着衰减后ANFIS的递推辨识察觉到预测残差系统性偏移持续输出一个小的转角修正量把这个偏移抵消掉了。这种越跑越准的释压效应是固定模型完全做不到的。4.3 自适应到底带来了什么观察仿真过程中ANFIS输出信号的变化曲线能非常直观地理解自适应的价值。在直线段误差和误差变化率都接近零ANFIS输出几乎为零自适应模块完全不干预此时系统就相当于一个纯NN-MPC。进入弯道后横向误差爬升ANFIS输出开始增大方向与误差符号相反等于给MPC的转向指令加了一个前馈性的修正。最有趣的是在路面附着突变之后那一段前几帧MPC预测模型还没有意识到侧偏刚度已经变化横向误差出现二次增大的趋势而ANFIS通过后件参数的递推更新大约0.5秒内就把补偿量调到了新工况需要的水平误差曲线随即被压住。这个过程是自动发生的没有任何人工切换逻辑。这套机制也有代价。计算开销从NN-MPC的26毫秒增加到31毫秒主要来自ANFIS每个周期的推理和递推更新好在增加的量相对固定不会随预测时域增长而爆炸。另一方面的代价是调试复杂度多了好几个超参数要调在线学习率、遗忘因子、输出限幅任何一个设置过激都可能引发耦合振荡。我的建议是调参时一次只动一个参数而且先离线仿真充分验证再考虑上更复杂的场景。5. 常见问题排查实录5.1 预测模型失效导致控制发散我复现NN-MPC时踩的第一个大坑是控制器在仿真运行两到三秒后轨迹开始发散。排查后发现根因不在优化求解器而在神经网络的多步预测。单步预测的验证误差看着很小但MPC每一轮都要向前推15步随着预测步数增加误差逐级放大到第10步预测位置已经偏离真实位置将近半米优化器对着一条错误轨迹求解控制指令自然越走越偏。解决思路分三步。第一检查训练数据是否覆盖了实际运行的状态区域我加大了对弯道和大转角工况的采样密度。第二在网络结构中加了L2正则化降低过拟合造成的外推失真。第三把预测时域从20步缩到15步多步预测误差控制在可接受范围内。这些调整做完之后控制器重新稳定下来。这个问题的教训是NN-MPC的性能瓶颈往往不在训练精度而在预测一致性——训练时就要把多步自回归预测误差当作考核指标而不是只看单步损失。5.2 ANFIS训练不收敛和后件参数爆炸ANFIS离线训练时遇到的最典型问题是前件参数不更新损失函数长时间几乎不动。检查发现是输入数据没有归一化误差变化率和车速的量纲差异太大低速时小量纲信号在数值上被淹没。归一化之后训练立刻顺畅起来。另一个高频问题是递推最小二乘在后件参数上出现数值爆炸症状是ANFIS输出突然跳到限幅值并持续震荡。这个问题的来源是递推更新时协方差矩阵持续增长解决办法一是给递推更新加一个较小的初始协方差二是引入遗忘因子三是对输出做硬限幅。三者缺一不可其中限幅是最后一道保险不能省。5.3 实时性卡脖子怎么破非线性MPC加神经网络预测最现实的问题就是计算时间。实测单步求解31毫秒采样周期50毫秒理论上还有19毫秒余量但高保真车辆模型仿真本身还要占时间实际跑起来余量非常紧张。我试过几个有效手段第一是热启动把上一时刻的最优控制序列去掉首项后平移作为当前求解的初始值迭代次数能减少约30%第二是给SLSQP设置最大迭代次数不求每次解到最优直到收敛只要目标函数比上一轮有明显改善就接受第三是把有限差分的梯度计算做稀疏化只对控制量维度求梯度不对状态维度求省掉大量冗余计算。如果这些都不够那就只能缩短预测时域或者更换更高效的求解器这是性能与精度的取舍没有免费午餐。5.4 复现常见问题速查表把调试过程里遇过的问题汇总成表希望能帮后来者少走弯路现象可能原因处理建议仿真跑几秒后轨迹发散神经网络多步预测误差累积预测轨迹失真检查训练数据覆盖率加正则化缩短预测时域MPC优化反复报不可行约束设置过紧或者预测模型外推失真放宽转向增量约束检查状态边界先试无约束找到问题点方向盘高频抖动权重设置不当增量惩罚太小增大S权重减小控制时域N_cANFIS输出持续顶满限幅后件参数爆炸或在线学习率过高检查递推协方差矩阵降低遗忘因子强化输出限幅NN-MPC单步求解超时非线性求解器迭代次数过多开启热启动限制最大迭代次数稀疏化梯度高速弯道横向误差反而增大神经预测模型对高速工况覆盖不足增加高速大转角训练数据重新训练模型加入自适应后性能变差自适应参数设置激进补偿过度调低在线学习率缩小输出限幅只在残差持续存在时允许累加补偿我个人这一趟复现下来最深的体会是神经网络和ANFIS不是玄学它们的价值要在模型不准确的工况下才真正体现。如果只是低速直线加缓弯固定模型的线性MPC已经能打九十分没必要上这套东西。可一旦把速度提上去、把路面条件弄复杂数据驱动的那点补偿就成了稳住误差的关键。最后再分享一个小技巧复现这类方案时先把固定模型的非线性MPC跑通作为基准再逐步替换预测模型、加上自适应模块每个改动单独验证效果问题定位会快很多也更容易判断每一步提升到底来自哪里。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑