☰
神经网络与ANFIS自适应MPC在车辆路径跟踪中的复现对比
2026/10/20 14:12:31 网站建设 项目流程

前阵子复现这套“神经网络 + 自适应MPC”路径跟踪方案时,我被一个细节卡了很久:同样的双移线工况,传统MPC在大曲率弯道把横向误差压到 0.2 米以内,换上加神经网络预测模型的 NN-MPC 之后,误差不降反升,还时不时出现转向抖振。后来逐段排查才发现,问题不在神经网络本身,而在训练数据里弯道工况的分布权重太小。这篇内容就是把 ANFIS 自适应 MPC 和 NN-MPC 两套架构的复现过程完整拆开讲,适合正在做路径跟踪方向课程设计、毕业设计,或者想把这套方法搬到自己仿真平台的开发者参考。文章会覆盖模型搭建、控制算法细节、仿真闭环、实验对比和踩坑过程,尽量把每一步为什么这么做说清楚。

1. 路径跟踪场景下,纯MPC的软肋在哪里

1.1 MPC为什么适合路径跟踪,却又让人头痛

路径跟踪的本质,是让车辆沿着期望路径行驶,核心控制目标就是横向偏差和航向偏差都趋近于零。模型预测控制(MPC)的优势非常直观:它能“看向未来一段路”,在预测时域内同时考虑跟踪误差、控制量变化和约束条件,然后滚动求解。这比单纯靠当前误差做反馈的PID强不少,尤其在弯道前就能提前打方向,路径跟踪的平滑性和精度都会有提升。

但MPC有个天然的矛盾:它的表现高度依赖预测模型的准确性。我这里用的车辆模型是二自由度自行车模型加上路径跟踪误差方程,状态量包括侧向速度、横摆角速度、横向偏差和航向偏差,控制量是前轮转角。这个模型在中等车速、良好附着路面上足够用了,但一旦进入湿滑路面、急弯或者轮胎接近附着极限,线性化模型的误差就会明显放大。预测模型不准,MPC的“预测”就从预判变成了猜,优化出来的控制量自然也不可靠。

1.2 模型失配、权重整定与实时性:三个绕不开的老问题

我复现过程中总结下来,纯MPC在路径跟踪里主要有三个痛点,也正好是神经网络和ANFIS能发挥作用的地方。

第一个是模型失配。车辆在实际行驶中,轮胎侧偏刚度会随路面附着系数、胎压、载荷变化,二自由度模型的参数不可能全覆盖。线下标定再好,到真实工况里还是会有偏差。

第二个是权重整定困难。MPC的目标函数里通常有两类权重:一类是跟踪误差的权重Q,一类是控制量变化的权重R。Q和R的比值决定了控制器“敢不敢用力打方向”。固定权重在低速大弯和高速小弯场景下表现差异明显,单纯调一组参数很难让所有工况都满意。

第三个是实时性。MPC每步都需要求解一个带约束的优化问题,如果为了精度把模型做得太复杂,优化求解时间就会超过控制周期。这也是很多实验室项目只能停留在仿真阶段的原因。

把这三个痛点记在心里,再去看“ANFIS自适应MPC”和“NN-MPC”这两种方案,就会清楚它们各自在解决哪一块。

2. 两套方案架构拆解:ANFIS在线自适应与神经网络预测模型

2.1 ANFIS自适应MPC:在线修正预测模型的逻辑

自适应MPC的思路是:既然模型参数会随工况变化,那就用一个在线估计器实时调整MPC预测模型的参数。我当时采用的是“ANFIS在线估计等效参数”的方案,也就是用自适应神经模糊推理系统,根据当前车速、路径曲率和侧向加速度,输出轮胎侧偏刚度的修正量或等效值,然后把这个修正量更新到MPC的预测模型里。

ANFIS的核心结构是五层网络,底层是模糊规则,上层是神经网络的训练机制。说得直白一点,它把模糊逻辑里“如果是大弯、车速又高,那么修正量应该偏大”这种规则,通过神经网络的学习能力自动调整隶属度函数和后件参数。训练时用混合算法:先用最小二乘固定前件参数、更新后件线性参数,再用梯度下降微调。在线运行时为了实时性,我固定了前件参数(隶属度函数),只用递推最小二乘更新后件参数,这样每步计算量非常小。

这个方案的优点是保留了MPC的优化框架,每次只是更新模型参数,不需要改QP求解器本身,工程上改动小。缺点是ANFIS的性能取决于输入特征选得好不好,如果漏掉关键工况特征,在线估计的修正量就会失真。

2.2 NN-MPC:神经网络作为预测模型的两种形态

神经网络模型预测控制这个名词在论文里有两种常见理解。一种是用神经网络直接替代机理模型作为预测模型,输入当前状态和一组控制序列,输出未来状态序列,MPC在这个纯黑箱模型上做滚动优化。另一种是“机理模型 + 神经网络残差补偿”,也就是用神经网络学习机理模型预测误差的残差项,把网络输出叠加到机理模型输出上,构成混合预测模型。

我复现时优先尝试的是第二种。原因很实际:单纯用神经网络当预测模型,泛化能力完全取决于训练数据覆盖范围,遇到没见过的工况基本就是瞎猜。而机理模型虽然在极限工况下不准,但整体趋势是靠谱的,用神经网络弥补它的局部偏差,既保留模型结构又引入数据驱动能力,工程上稳妥得多。

具体做法是:神经网络的输入为当前侧向速度、横摆角速度、前轮转角、参考曲率等,输出为下一时刻侧向速度和横摆角速度的残差修正量。训练数据通过在标称模型周围施加轮胎参数扰动和路面附着变化来生成,让网络学会“机理模型在哪些场景下会偏差多少”。

2.3 两套方案的本质区别

为了直观对比,我把两种方案的关键差异列了一个表:

维度ANFIS自适应MPCNN-MPC
自适应对象预测模型中的物理参数(如侧偏刚度)预测模型输出本身(残差或直接预测状态)
可解释性较好,规则和参数有物理含义较差,黑箱映射
对QP求解的影响仅更新模型矩阵,求解结构不变目标函数和梯度来源改变,求解更复杂
数据依赖需要工况分布较广的训练样本需要覆盖长尾工况,否则外推易失败
在线更新成本低,递推最小二乘即可中高,需要网络前向推理甚至反向求梯度
最适应用场景参数慢变、模型失配为主非线性强、机理模型结构缺失严重时

表里能看出一个规律:ANFIS方案适合“模型整体趋势对,但参数漂移”的场景;NN-MPC适合“模型结构本身描述不了复杂非线性”的场景。路径跟踪恰好两者都有,所以标题把它们放在一起对比是合理的。

3. 复现场景的搭建:车辆模型、参考路径与仿真闭环

3.1 车辆模型与路径跟踪误差方程怎么搭

复现的第一步不是写控制器,而是把被控对象和评价体系搭好。我采用的是常用的二自由度单轨模型,假设左右车轮合并,纵向速度恒定。状态方程如下:

侧向加速度方程:
v_y_dot = (C_f + C_r) / (m * v_x) * v_y + (a * C_f - b * C_r) / (m * v_x) * ω - v_x * ω - C_f / m * δ

横摆角速度方程:
ω_dot = (a * C_f - b * C_r) / (I_z * v_x) * v_y + (a^2 * C_f + b^2 * C_r) / (I_z * v_x) * ω - a * C_f / I_z * δ

路径跟踪误差部分,采用道路坐标系下的误差模型。横向偏差的导数近似为:
e_y_dot = v_y + v_x * e_psi
航向偏差的导数近似为:
e_psi_dot = ω - v_x * κ_ref

其中 κ_ref 是参考路径曲率。这里有个隐藏细节:误差模型里我做了小角度假设,如果车速很高、横摆角偏差接近 10 度以上,线性近似就会引入误差。所以后续实验最高车速控制在 100 km/h,就是不想让小角度假设失效的太厉害而干扰对算法本身的评估。

模型参数方面,整车质量取 1400 kg,横摆转动惯量取 2400 kg·m^2,质心到前轴 1.2 m,到后轴 1.4 m,标称侧偏刚度前轮 80000 N/rad、后轮 90000 N/rad。这些参数本身不重要,重要的是后面的实验要让侧偏刚度出现明显变化,才能检验自适应能力。

3.2 参考路径、控制参数与仿真闭环

参考路径我用两类:一类是标准双移线,用来模拟紧急避障场景;一类是蛇形连续弯道,用来检验连续换道时的稳定性和跟踪精度。双移线路径用常见的分段多项式公式生成,横坐标每 5 米一个采样点,曲率由路径的二阶导数近似计算。路径生成后要离线算一次曲率序列,因为曲率信号是ANFIS和NN的输入之一,曲率算不准会直接影响后面所有在线模块。

仿真闭环流程如下:

  1. 给定参考路径和期望纵向车速,初始化车辆状态。
  2. 每个控制周期先采样当前状态,更新ANFIS修正参数或获取神经网络预测模型。
  3. 构造MPC预测方程、目标函数和约束,求解QP。
  4. 取最优控制序列第一个值,作为前轮转角作用到车辆模型。
  5. 推进车辆状态到下一时刻,记录横向偏差、航向偏差、控制量等数据。
  6. 重复步骤2到5,直到跑完整个路径。

控制参数上,采样周期我取 10 ms,预测时域 Np = 25,控制时域 Nc = 8。预测时域太长,QP矩阵变大,实时性下降;太短又看不见远处弯道,提前转向能力不足。Np = 25 对应 0.25 秒的预测窗口,在 80 km/h 下大约是 5.5 米,足够覆盖双移线的第一段入弯特征。

平台选择上,我先用Python把整个逻辑跑通,所有算法都在一个文件里能追踪调试,确认逻辑没问题后再搬到Simulink环境做闭环验证。Python里数值求解用的开源QP库,C接口和Python接口都很清晰,方便嵌入式移植。

4. 核心实现细节:从MPC求解到ANFIS在线更新的完整链路

4.1 目标函数与约束设计:Q、R权重到底在调什么

MPC的目标函数我写成标准二次型:

min J = Σ || y_ref(t+k) - y_pred(t+k) ||²_Q + Σ || Δu(t+k) ||²_R

第一项是预测输出与期望路径的偏差,第二项是控制增量,也就是前轮转角的变化量。Q矩阵对角元素分别对应横向偏差和航向偏差的权重,R对应前轮转角增量权重。Q越大,控制器越激进地消除误差;R越大,控制器越不愿快速改变转角。

复现初期我犯过一个错误:把横向偏差权重调得很大,结果直线上跟踪精度很漂亮,一进弯道转角变化率就超出执行机构约束,控制器频繁触碰约束后出现振荡。后来我调整了思路,Q和R不是单独调,而是看它们的比值。横向偏差权重与转角增量权重的比值大概在 3 到 8 之间比较合理,具体值还要结合车速做一点缩放。想省事的话,可以按照“误差权重/控制量权重 ≈ 让最大预测误差乘以权重后的量级与最大控制增量权重相当”这个原则来初定,再微调。

约束方面我设置了三个:前轮转角幅值限制在 ±0.5 rad,转角增量限制在 ±0.05 rad,质心侧偏角幅值限制在 ±0.15 rad。质心侧偏角约束是后面ANFIS自适应能稳定工作的一个重要前提,因为模型参数修正量本来就是在线性区内辨识的,如果侧偏角太大,整个辨识前提就不成立。

4.2 把MPC变成QP:每个控制周期的标准动作

有了预测模型和目标函数,下一步就是把MPC转化为一个标准二次规划问题。对ANFIS自适应MPC来说,因为只是模型参数变化,线性时变预测模型下每一周期重新构造A、B矩阵,然后用标准QP求解器求解。对NN-MPC来说,神经网络构成的预测模型非线性强,直接构造QP比较麻烦,我采用了局部线性化的做法:在当前状态点对神经网络输出做一阶泰勒展开,得到近似的线性模型,再走标准QP流程。这样虽然牺牲了一点理论上的最优性,但工程实现稳定。

每个控制周期的标准动作可以概括为下面这段伪代码:

for k in range(total_steps): state = vehicle.get_state() x_ref, kappa_ref = reference.get_lookahead(state) if controller_mode == "anfis_mpc": param_delta = anfis_estimator(state.v_x, kappa_ref, state.a_y) model = vehicle_model.update_stiffness(param_delta) elif controller_mode == "nn_mpc": model = nn_predictor.linearize_near_state(state, kappa_ref) qp_matrix = build_qp_objective(model, Q_weight, R_weight, x_ref) constraints = build_constraints(delta_max, delta_rate_max) u_seq = solve_qp(qp_matrix, constraints) vehicle.apply_steering(u_seq[0])

关键点在于第 3 步和第 4 步的衔接。如果是NN预测模型,局部线性化得到的雅可比矩阵要算得准,我用自动微分工具把神经网络输出的偏导算出来,然后缓存成矩阵供QP构造使用。这个开销比前向推理大不少,所以在实时性问题上是主要瓶颈,后面会展开说。

4.3 神经网络的训练数据从哪里来

神经网络不能凭空训练,数据得自己造。我的做法是在标称模型上叠加参数扰动和工况变化,生成训练数据集。具体来说,侧偏刚度在标称值的 ±20% 范围内随机变化,路面附着系数从 0.85 降到 0.4,车速从 40 km/h 到 100 km/h 均匀采样。然后在多种双移线和蛇形路径上,用标称MPC作为数据采集控制器闭环运行,记录每一步的状态、控制量和参考路径信息。

数据量方面,我一共生成约 12 万条样本。每条样本的特征包括:当前车速、侧向速度、横摆角速度、横向偏差、航向偏差、参考曲率、上一时刻的前轮转角;标签是下一时刻的侧向速度误差残差和横摆角速度误差残差,这是相对于机理模型预测的偏差而言的。

训练之前要做两件事。第一是归一化,把所有特征和标签缩放到均值为 0、标准差为 1 的分布,不然曲率和侧向速度量纲差异会把网络的梯度带偏。第二是时间对齐,采样时控制器输出的前轮转角作用于车辆后,状态是下一个周期才变化的,特征里的转角必须用上一时刻的值,这个滞后如果不对齐,网络学到的映射关系会有迁移偏差。

网络结构我用了一个相对轻量的全连接网络:输入层 8 个特征,两层隐藏层各 64 个神经元,激活函数用 ReLU,输出层两个残差量。训练时用 Adam 优化器,学习率初始 0.001,训练 80 轮,验证集损失不再下降就提前停止。这个规模在后续实时推理时开销可控。

4.4 ANFIS在线更新:滑动窗口与参数防漂移

ANFIS部分我采用的输入是车速、参考曲率和侧向加速度,每个输入划分三个高斯隶属度函数,这样规则总数是 27 条,后件参数共有 27×4 组。离线训练阶段用混合算法把所有前件和后件参数定下来。

在线运行时,我固定前件参数,只用递推最小二乘更新后件参数。这里有个很关键的经验:不能每个控制周期都无脑更新后件参数。车辆在直线上行驶时,曲率接近零,侧向加速度很小,ANFIS输入提供的信息量不足,如果强制更新,参数会在小样本上过拟合,出现随机漂移。我加了两道保险。

第一道是更新触发条件:只有当最近 10 步的预测残差移动平均值超过某个阈值时才触发在线更新。残差不大说明当前模型还够用,没必要动参数。第二道是防漂移机制:后件参数更新后做上下限钳位,同时引入遗忘因子 0.99,让历史样本的影响随时间衰减。实际测试中遗忘因子太大会让参数更新迟钝,太小又会让参数抖动明显,0.99 是一个兼顾稳定性和跟踪速度的折中选择。

5. 同工况对比实验:两组MPC的实际表现与差距来源

5.1 测试工况与指标定义

为了公平对比,我把三套控制器放在完全相同的仿真环境里测试:一组是参数固定不变的基线MPC,一组是ANFIS自适应MPC,一组是NN-MPC。工况分为四种组合:良好附着路面(附着系数 0.85)和低附着路面(附着系数 0.4),分别跑双移线和蛇形路径,车速统一取 80 km/h。

评价指标我关注四个:最大横向误差、横向误差均方根、最大航向误差、单步平均求解时间。最大横向误差反映最危险时刻的偏离程度,横向误差均方根反映整体跟踪质量,求解时间是评估实时性是否能落地的关键。

这里要事先说明,我复现环境里的数值只代表本项目的相对对比,不同模型参数、不同求解器配置下绝对数值都会变,但趋势是有参考价值的。

5.2 三组控制器的横向误差与耗时对比

测试结果整理如下:

指标基线MPCANFIS自适应MPCNN-MPC
良好路面双移线 最大横向误差0.18 m0.12 m0.10 m
良好路面双移线 误差均方根0.07 m0.05 m0.04 m
低附着路面双移线 最大横向误差0.52 m0.21 m0.18 m
低附着路面蛇形 最大横向误差0.47 m0.19 m0.17 m
单步平均求解时间3.1 ms3.8 ms9.6 ms

三组数据放在一起能读出几个信息。低附着路面下基线MPC的最大横向误差从 0.18 米猛增到 0.52 米,说明模型失配对纯MPC的影响是决定性的。ANFIS自适应MPC把最大误差压回 0.21 米,虽然没有完全消除误差,但已经控制在可接受范围内。NN-MPC在误差上略优于ANFIS,但优势没有想象中大,而且求解时间几乎是ANFIS版本的 2.5 倍。

5.3 从误差曲线里读到的两个信号

只看表头可能掩盖一些细节。我把低附着路面双移线的横向误差曲线逐点翻出来看,注意到两个信号。

第一个信号是NN-MPC在入弯初期表现很好,误差甚至比ANFIS版本小,但过弯中段偶尔出现小幅高频振荡,表现在前轮转角曲线上就是控制量抖动。原因之一是神经网络残差模型在训练数据密集区域预测很准,但一旦某个状态点稍微偏离训练分布,残差输出出现一个尖刺,MPC对这个尖刺的反应就是猛打一下方向再回正。

第二个信号是ANFIS自适应MPC在刚进入低附着路段的时候有一个短暂的调整期,横向误差会先冲高到 0.15 米左右,然后迅速回落。这是因为在线参数辨识需要几个周期的数据积累才能把侧偏刚度修正量估计出来。相比之下,NN-MPC因为训练时见过低附着工况,一开始就能给出补偿。这个差异让我理解了两套方案的互补性:一个靠在线快速自适应,一个靠离线先验知识。

6. 复现过程中绕不开的坑与我的排查方式

6.1 训练数据分布偏置:弯道外推失败的完整排查

刚跑通NN-MPC时,我一度怀疑它的效果还不如基线MPC。问题出在我最初生成训练数据时,为了图快,在直道和缓弯上采样的样本占比过高,大曲率工况只占了大概一成。神经网络在训练时见过太多低曲率工况,对高曲率输入的外推能力很弱,一到双移线大弯就直接预测失准。

排查过程是这样的:第一步,我把测试路径按曲率分段,分别统计每段上的预测误差,结果发现误差集中在大曲率段。第二步,画出训练样本在曲率-车速二维分布上的直方图,问题一目了然,大曲率区域样本稀疏。第三步,重新生成数据集,按曲率分箱采样,保证大曲率工况占比不低于三成,再重新训练后,大弯段的误差明显回落。这个坑也提醒我:数据驱动的控制器,评估它之前得先评估数据分布。

6.2 神经网络梯度不平滑引发的求解抖动

NN-MPC的QP求解中,预测模型来自神经网络的局部线性化。有一次实验里,控制量输出出现了频率很高的抖动,横向误差倒是不大,但前轮转角变化率频繁顶到约束边界。我一开始怀疑是Q、R权重不合适,调了半天无效。

后来我把神经网络的输出对输入求了梯度,画出来发现某些区间梯度变化非常剧烈,ReLU激活函数的转折点造成一阶导数不连续,MPC优化时会把这些局部梯度的毛刺放大成控制量的剧烈变化。解决方案是双重的:一是激活函数从ReLU换成平滑的SiLU,二是对神经网络的输出做一阶低通滤波,截止频率设在 10 Hz 左右,滤掉高于控制带宽的抖动。改完之后,控制量曲线平滑度明显改善,最大横向误差没有变差,说明滤波没有损伤有效控制信息。

6.3 在线更新太快:参数漂移与控制器抖振

ANFIS自适应MPC在实验初期同样遇到过抖振问题,而且比NN-MPC更难排查,因为误差曲线看起来还算干净,但方向盘动作很碎。后来我在代码里加了调试输出,把每个周期的后件参数值打出来,发现参数在几秒内变化幅度超过三成,已经远超合理范围。

根因有两层:一是更新频率过高,每个周期都在做递推最小二乘,样本之间高度相关,参数被短时噪声牵着走;二是触发的数据里混入了闭环控制引起的相关性噪声,当前的控制动作影响下一时刻的状态,又反馈到辨识数据里,形成闭环辨识偏差。解决办法就是我前面讲的更新触发阈值加上参数上下界钳位。实测中,触发阈值不能设得太敏感,我最终取的是预测残差移动平均值超过标称噪声水平的三倍才触发更新。

6.4 实时性瓶颈:从求解器到网络推理的量化分析

NN-MPC的 9.6 毫秒单步求解时间,虽然在我设定的 10 毫秒控制周期边缘可以勉强跑完,但完全没有任何裕量。我逐段剖析时间开销后发现:QP求解本身只占大约四成,神经网络前向推理占两成,局部线性化时的自动微分求梯度占了三成多,剩下的在数据拷贝和模型重建上。

针对这个瓶颈,我做了两个优化。第一,把自动微分计算换成了离线符号求导,把雅可比表达式提前展开成静态计算图,省掉了运行时反传开销。第二,网络推理用轻量化处理,隐藏层从 64 减到 48,并验证了精度几乎没有变化。优化后单步求解时间降到 6.8 毫秒左右,实时性余量就充足了。这个数据也支持我前面一直强调的观点:神经网络要想落到MPC里用,不能只追求预测精度,必须把推理和求梯度的开销当成一等公民来设计。

7. 关于复现顺序与后续改进的个人建议

7.1 我的复现顺序与验证习惯

如果你也想复现这套东西,我的建议是不要一上来就写神经网络。先把基线MPC在良好路面上跑通,把预测时域、控制时域、Q、R权重这些基础概念吃透,再引入模型失配(比如人为把侧偏刚度改掉 20%)观察基线MPC性能退化程度,然后叠加ANFIS在线修正或NN残差补偿。

这样做的原因很简单:基线MPC是后续所有模块的挂载基础,如果连基线都跑不稳,自适应模块表现不好时你根本分不清是模型问题还是算法问题。验证环节我还有一个习惯:所有对比实验共用一个评价脚本,固定好随机种子和路径生成方式,控制变量尽量严格。否则一次实验换一个测试条件,数据之间完全没有可比性。

7.2 后续还能往哪个方向扩展

这两个方案在我来看并不是二选一的关系,更合理的组合方式是让ANFIS负责慢变参数的自适应,让神经网络负责机理模型尾差补偿,二者叠加成一个混合自适应MPC。另外,文章里的神经网络只是离线训练加在线推理,下一步可以考虑把在线微调加进去,用滑动窗口数据对网络参数做轻量更新,增强对未知工况的适应能力。

如果不想停在仿真层面,可以进一步做硬件在环测试,把实时性约束和数据采集延迟纳入考虑,那时候你会在真实控制系统中发现更多仿真里根本暴露不出来的问题。这个方向我自己还在继续跟,后面有新的实验结果再拿出来分享。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询