☰
分布式驱动车辆电机失效容错控制:UKF观测器与横摆力矩协同仿真
2026/10/22 11:47:51 网站建设 项目流程

1. 项目背景:为什么分布式驱动车辆必须面对电机失效问题

1.1 分布式驱动的普及与容错控制的必要性

分布式驱动车辆,也就是四个车轮各配一台独立驱动电机的构型,这些年几乎成了智能底盘研究的标准载体。相比传统集中式驱动,它的核心优势在于每个车轮的扭矩可以独立控制,响应速度是毫秒级的,这给整车动力学控制带来了极大的想象空间——电子差速、直接横摆力矩控制、极限工况下的稳定性干预,都可以通过四个电机的扭矩分配来实现。

但硬币的另一面往往是容错问题。一辆正常行驶的分布式驱动车辆,如果某一个驱动电机因为过热保护、控制器故障、通信中断等原因突然退出工作,车辆的非对称驱动力会在极短时间内产生一个额外的横摆力矩,整车会明显向失效车轮一侧跑偏。如果此时车速较高,驾驶员根本来不及修正,车辆可能直接失控。这个问题的本质在于:分布式驱动把“动力输出自由度”分散到了四个轮子,自由度变多意味着控制灵活,但也意味着任何一个自由度的缺失都会破坏整车的受力平衡。

1.2 失效工况下的“感知—决策—执行”链条

解决电机失效问题,单靠某一个控制器是不够的,需要一条完整的故障处理链路。我理解下来分三段:第一段是“感知”,也就是准确判断哪个电机退化、退化到什么程度——这是故障观测器要做的事;第二段是“决策”,根据故障信息重新计算每个健康电机应该出多少扭矩,在维持纵向车速的同时尽量消除额外的横摆力矩;第三段是“执行”,把决策层的扭矩指令平稳地落到各个电机控制器上。

这个项目(分布式驱动车辆UKF故障观测器+纵向速度PI控制+附加横摆力矩控制仿真)正是按照这个逻辑搭建的完整仿真验证方案。它覆盖了从故障检测、状态估计到控制重构、仿真验证的全部环节。对于正在做车辆动力学控制方向课题的研究生,或者刚进入智能底盘领域想快速建立容错控制整体概念的工程师,这套方案的价值在于:它能让你在一个仿真环境里完整看到“故障发生后,观测器如何捕捉异常、控制器如何响应、整车姿态如何恢复”的全过程。

1.3 本文会讲什么

这篇文章从我复现整个仿真的视角出发,重点拆解四个层面的内容:一是UKF故障观测器的建模思路和参数选择;二是纵向速度PI控制与附加横摆力矩控制如何配合工作;三是仿真平台搭建和故障注入的具体操作方式;四是几组典型失效工况下的结果分析,以及我在参数调试过程中踩过的坑。

我默认读者对车辆动力学和自动控制原理有基本了解,但完全不熟悉UKF和直接横摆力矩控制概念的人也能跟得上,关键公式我会展开解释,不会一笔带过。

2. UKF故障观测器为什么选它——从状态估计到实时诊断

2.1 故障观测器的任务边界

先说清楚故障观测器在这个项目中到底承担了什么任务。它本质上是一个基于模型的状态估计器,输入是车辆当前可测量的信号(比如横摆角速度、纵向加速度、方向盘转角),输出是车辆的关键运动状态以及每个电机的健康程度。所谓“健康程度”,在这个项目里被建模为一个失效因子,记作 ( \mu_i ),范围在0到1之间。( \mu_i = 1 ) 表示第 ( i ) 个电机完全失效,( \mu_i = 0 ) 表示健康。

为什么需要失效因子?因为控制重构层必须知道剩余驱动能力。如果左前轮电机失去了30%的输出能力,那么给左前轮的扭矩指令就需要按剩余70%的物理能力重新计算,否则实际扭矩和指令扭矩不匹配,横摆力矩的补偿计算也是错的。失效因子就是连接“诊断”和“控制”之间的桥梁参数。

2.2 为什么在KF、EKF、UKF之间选了UKF

做状态估计,最常见的三个候选是卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)。KF只适用于线性系统,车辆动力学方程显然是非线性的,直接出局。EKF用泰勒展开线性化,需要计算雅可比矩阵,对系统模型的连续性要求高,而且一旦非线性较强,线性化误差会明显影响估计精度。

UKF的思路完全不同,它不对方程做线性化,而是用一组经过精心挑选的采样点(Sigma点)直接通过非线性函数,再用“加权统计”的方式近似出状态的后验分布。对于车辆这种非线性中等偏强、但维数不高的系统,UKF在估计精度上通常优于EKF,计算量又远低于粒子滤波,这就成了实际工程项目里最常用的折中方案。

2.3 车辆状态方程与量测方程的建立

UKF要跑起来,首先得有系统方程。我在仿真里采用了一个中等复杂度的车辆模型:纵向速度 ( v_x )、横摆角速度 ( \gamma )、质心侧偏角 ( \beta ) 作为核心状态量;同时把四个车轮的轮速也纳入状态向量,因为电机失效最直接的体现就是轮速异常——某个车轮的轮速在驱动力消失后会快速下降,即使车辆还在滑行。

系统的状态方程可以写成:

[ \dot{v}x = \frac{1}{m} \left( \sum{i=1}^{4} F_{xi} - F_{res} \right) + v_y \gamma ]

[ \dot{\gamma} = \frac{1}{I_z} \left[ a(F_{y1} + F_{y2}) - b(F_{y3} + F_{y4}) + \frac{B}{2}(F_{x1} - F_{x2} + F_{x3} - F_{x4}) \cdot \mu_i \right] ]

这里的 ( F_{xi} )、( F_{yi} ) 分别是第 ( i ) 个车轮的纵向力和侧向力,( a )、( b ) 是质心到前后轴的距离,( B ) 是轮距。侧向力采用简化的线性轮胎模型 ( F_{yi} = C_\alpha \alpha_i ) 计算,其中 ( \alpha_i ) 是各车轮侧偏角。轮速的动力学方程里直接引入了失效因子 ( \mu_i ):

[ J_\omega \dot{\omega}i = T_i (1 - \mu_i) - r F{xi} ]

这个方程是故障观测器能够辨识出失效程度的关键。当 ( \mu_i ) 接近1时,即使控制器还在给第 ( i ) 个电机下发较大的扭矩指令 ( T_i ),轮速的加速度也远小于模型预期,残差就会被UKF捕获。

2.4 UKF算法的实现细节与参数选择

UKF的算法流程分为预测、更新两步,中间穿插Sigma点生成和权重计算。我在实现时按照标准流程分拆为六步:

  1. 初始化状态均值 ( \hat{x}_0 ) 与协方差 ( P_0 ),并设定过程噪声协方差 ( Q ) 与量测噪声协方差 ( R );
  2. 根据当前状态均值与协方差生成 ( 2n+1 ) 个Sigma点(( n ) 为状态维数);
  3. 将每个Sigma点代入非线性状态方程进行一步预测,得到预测状态的均值和协方差;
  4. 将预测状态再次生成Sigma点,代入量测方程得到量测预测;
  5. 计算卡尔曼增益 ( K_k );
  6. 利用实际量测与量测预测的残差更新状态均值与协方差。

Sigma点的生成公式是:

[ \chi_k^{(i)} = \hat{x}_k + \left( \sqrt{(n + \lambda)P_k} \right)_i, \quad i = 1, \dots, n ]

[ \chi_k^{(i)} = \hat{x}k - \left( \sqrt{(n + \lambda)P_k} \right){i-n}, \quad i = n+1, \dots, 2n ]

其中 ( \lambda = \alpha^2 (n + \kappa) - n ),( \alpha ) 决定Sigma点离均值的距离,一般取 ( 1 \times 10^{-3} ) 到 1 之间的值;( \kappa ) 通常取0或 ( 3 - n )。我这里状态维度约为6(纵向速度、横摆角速度、质心侧偏角加四个轮速),取 ( \alpha = 1 \times 10^{-2} ),( \kappa = 0 ),权重则按标准公式计算:均值权重 ( W_m^{(0)} = \frac{\lambda}{n + \lambda} ),其余点为 ( \frac{1}{2(n + \lambda)} )。

有一点务必提醒:过程噪声协方差 ( Q ) 的取值对失效因子辨识的收敛速度影响极其显著。( Q ) 设置得过大会让滤波器过度信任量测、对噪声敏感,估计结果毛刺严重;过小则滤波器响应迟钝,故障发生后很久才能逼近真实失效程度。我在调参时的经验是,先用对角线矩阵起步,通过试凑逐步放大失效因子对应位置的方差,直到阶跃响应时间落在 0.3 到 0.5 秒之间。

3. 纵向速度PI控制与附加横摆力矩控制协同工作的核心逻辑

3.1 分层控制架构与扭矩分配思路

这个项目的控制部分采用了典型的双层结构:上层是运动控制层,负责根据驾驶员输入(加速踏板、方向盘转角)计算整车需要的总纵向力和附加横摆力矩;下层是分配层,把总力需求拆分到四个车轮。

为什么要分层?因为故障重构只发生在分配层时,控制策略就会非常简单。具体来说,当某电机失效,观测器给出失效因子 ( \mu_i ),分配层重新解算各轮的扭矩指令,让健康车轮多出力、失效车轮少出力,同时保证整车总驱动力不变、横摆力矩越额外误差为零。这种“上层控制不用改、下层分配自适应”的结构,工程可维护性非常好。

3.2 纵向速度PI控制器的设计与整定

纵向速度控制在这个仿真中承担的任务是:无论电机失效前后如何,车速都要尽量跟随驾驶员设定的目标值。我用的是经典PI控制:

[ T_{req} = K_p (v_{x,ref} - v_x) + K_i \int_{0}^{t} (v_{x,ref} - v_x)dt ]

这里 ( T_{req} ) 是总需求扭矩,( v_{x,ref} ) 是目标车速。PI参数的整定我采用的是工程化的“先比例后积分”方法:先把 ( K_i ) 置零,逐步增大 ( K_p ) 直到车速响应出现明显振荡,然后退回 60% 左右作为最终值;再加入 ( K_i ),从0开始缓慢增大,直到稳态误差消失且超调小于5%。

我在这一环节调试的记录值得分享:当 ( K_p ) 偏大(比如超过30)而 ( K_i ) 又不够时,电机失效瞬间车速会产生二次振荡,原因不是控制环路本身发散,而是失效导致的横摆力矩变化引发了横摆角速度波动,而横摆角速度又耦合进了纵向速度通道。所以纵向速度控制器和横摆力矩控制器之间实际上是强耦合的,单纯调PI参数解决不了所有问题,必须联合调。

3.3 附加横摆力矩控制:让车辆在失效后“保持原方向”

附加横摆力矩控制,逻辑上非常直接:设置一个期望横摆角速度 ( \gamma_{ref} ),它根据方向盘转角、车速和车辆稳态增益计算而来。正常工况下,车辆实际 ( \gamma ) 跟随 ( \gamma_{ref} );电机一旦失效,各轮驱动力不对称会产生一个额外的横摆力矩,导致实际 ( \gamma ) 偏离期望值。这时控制器计算一个补偿力矩:

[ \Delta M_z = K_{\gamma,p} (\gamma_{ref} - \gamma) + K_{\gamma,d} (\dot{\gamma}_{ref} - \dot{\gamma}) ]

我在这里用的是PD控制而不是PI,因为横摆角速度的跟踪本质上是瞬态响应问题,积分项反而容易引入低速工况下的相位滞后和振荡。( \Delta M_z ) 再叠加到驾驶员需求的总力矩上,通过分配层做成差动扭矩,即左右侧车轮扭矩不等,以此产生与失效额外横摆力矩方向相反的补偿力矩,把整车拽回原行驶方向。

3.4 控制分配层的重构策略

分配层是这个项目里最“机械”但又最关键的部分。正常工况下,四个轮子的扭矩分配可以简单按载重比例或者平均分配;失效工况下,需要重新构建约束。

我的做法是构造一个优化问题:在满足总驱动力需求和附加横摆力矩需求的前提下,最小化各轮轮胎附着利用率之和。简化后的目标函数:

[ \min_{T_i} \sum_{i=1}^{4} \left( \frac{T_i / r}{F_{zi}} \right)^2 ]

约束条件为:

[ \sum_{i=1}^{4} T_i = T_{req}, \quad \frac{B}{2r} (-T_1 - T_2 + T_3 + T_4) = \Delta M_z ]

同时每个轮子的扭矩必须满足电机物理限制 ( 0 \le T_i \le T_{max,i} ),其中失效电机的 ( T_{max,i} ) 要乘以 ( (1 - \mu_i) )。

这个优化问题的求解在仿真环境里用二次规划求解器即可完成,运算开销很小。关键在于,故障观测器给到分配层的失效因子如果不准,分配结果就会出错——比如你以为右前电机还有60%能力,实际却只有20%,那补偿力矩就必然不够,车辆仍然会跑偏。这就是为什么整个方案里观测器的精度是“地基”,控制器设计再完美,地基不稳全都是空中楼阁。

4. 仿真平台搭建与故障注入的操作细节

4.1 仿真环境的模块化建模思路

整个仿真我是在MATLAB/Simulink环境下完成的,车辆动力学部分用S-Function编写核心状态方程,控制算法用标准Simulink模块搭建,故障观测器用Embedded MATLAB Function实现。这样分块的好处是便于调试:动力学写错了可以单独验证动力学,观测器不收殓可以单独跑开环,不会因为模块耦合而无法定位问题。

我建议不要一上来就把所有模块连成一个大系统。可行的做法是先建立整车动力学模型,用固定的阶跃扭矩输入验证车速和横摆角速度响应的合理性;然后单独搭建UKF观测器,用离线数据开环验证估计效果;最后才连接控制器,闭环联调。这个顺序能显著缩短排查时间。

车辆模型的关键参数我列一下,方便直接参考:

参数数值说明
整车质量1400 kg含乘客
横摆转动惯量2200 kg·m²绕z轴
轴距2.7 m前轴到后轴
质心距前轴1.15 m
轮距1.55 m左右轮距
轮胎侧偏刚度65000 N/rad线性区等效值
驱动电机峰值扭矩180 N·m单轮

4.2 故障注入方式与场景设计

本项目的仿真是通过Simulink中的Step块或Signal Builder设置故障发生时刻与失效深度,在指定的仿真时间上,将对应电机的失效因子从0阶跃至目标值。

我设计了三个典型场景:

场景一:2秒时左前电机完全失效(( \mu = 1.0 )),车速目标保持80 km/h,转向角为0,观察车辆的纵向减速度和跑偏情况;
场景二:3秒时右后电机部分失效(( \mu = 0.6 )),在同一时刻驾驶员给出一个轻微转向角,验证观测器在“故障+转向耦合”条件下是否还能准确辨识故障;
场景三:5秒时左前和右后同时失效(( \mu = 0.5 ) 和 ( \mu = 0.7 )),且失效发生在制动过程中,考察纵向和横摆耦合最严重时的系统稳定性极限。

4.3 故障注入的触发逻辑与注意事项

在Simulink里,故障注入我用了一个简单的逻辑:用Clock模块获取仿真时间,与预设的故障时刻比较,输出逻辑值乘以失效因子幅值。这样硬件在环或者后续做实时测试时,也可以很方便地把这个触发信号替换成真实的故障诊断信号。

实际操作中有一个很隐蔽的坑:UKF观测器的失效因子更新是非连续的——因为故障本身是阶跃发生的,但观测器输出的 ( \mu_i ) 不可能瞬间跳变,它会有一个从0到真实值之间的过渡过程。如果你把观测器输出的 ( \mu_i ) 直接接到控制分配层,就会看到扭矩指令在过渡期内频繁变化,产生不必要的轮端扭矩抖动。

我当时的解决办法是:在观测器和分配层之间加一个一阶低通滤波器,时间常数大约0.15秒。这样既不会让过渡太慢拖累容错控制的响应速度,也能有效抑制因状态估计波动引起的扭矩抖振。

4.4 仿真运行流程

推荐的仿真流程是:

  1. 运行无故障工况,保存各状态量作为基准数据;
  2. 注入简单故障(单轮阶跃失效),验证观测器能在0.3到0.5秒内追踪到失效因子;
  3. 开启纵向速度PI控制,验证车速在失效前后的保持情况;
  4. 开启附加横摆力矩控制,验证横摆角速度的误差收敛情况;
  5. 逐步提高工况复杂度,叠加转向和制动输入,确认系统稳定裕度。

每次仿真结束后,我建议同时保存时间序列数据和最终工作区变量,包括失效因子估计、各轮扭矩指令、实际车速、横摆角速度。这些数据在后续画图和分析时都很有用。

5. 失效工况下的仿真结果分析与参数调试经验

5.1 典型结果:完全失效工况下,系统如何自愈

以场景一为例,2秒时左前电机完全失效。故障发生前整车稳定行驶在80 km/h,无转向输入。失效瞬间,车辆左前方驱动力消失,右侧车轮继续输出扭矩,车辆产生一个向左的偏航趋势,横摆角速度从0迅速跳变到约-0.18 rad/s。

观测器几乎在同一个时刻捕获到了轮速异常——左前轮的轮速因为失去驱动力而快速下降,伴随着纵向力残差的显著增大。观测器输出的 ( \mu_{LF} ) 从0开始以一个平滑的指数过程趋近1.0,这里的关键是估计曲线没有出现过冲,意味着 ( Q ) 中失效因子对应的方差设置基本合适。在0.4秒左右,( \mu_{LF} ) 进入稳定区间。

纵向速度控制方面,失效瞬间车速下降约3 km/h,PI控制器在0.8秒内把车速重新拉回80 km/h。这一段响应算比较快的,原因在于其余三个车轮能包容左前轮丢失的全部驱动需求,但这也意味着三个健康车轮的负荷率显著上升,如果初始车速更高或者路面附着更低,这套方案的裕度会压缩不少。

横摆力矩控制的效果从横摆角速度的恢复曲线能直观看到:没有附加横摆力矩控制的车辆,横摆角速度会一直维持在一个非零的稳态值,车辆持续跑偏,最终冲出车道;而附加横摆力矩控制介入后,横摆角速度在1.5秒左右收敛到±0.02 rad/s以内,车辆基本保持在原行驶方向。右侧车轮的扭矩分配呈现在这个过程中是先增大——补偿左侧失效带来的总扭矩缺口,再小幅回落——因为横摆补偿需要的差动力矩不需要始终保持最大。

5.2 部分失效工况下的挑战:故障与转向耦合

场景二的仿真结果比完全失效更有意思。3秒时右后电机失效60%,同时方向盘有一个小幅转向输入。这时观测器面对的是一个“双通道”问题:轮速变化既受故障影响,也受转向引起的车辆运动状态变化影响。如果观测器的模型没有准确包含转向输入对轮速的耦合关系,很容易把转向引起的轮速波动误判为故障信号。

我在最初版本就踩过这个坑:由于量测方程里没有把前轮转角对轮速的影响建模透彻,仿真中出现过一次误报警——观测器把右前轮估计出了0.2的失效因子,而实际该轮完全健康。后来检查,问题出在轮胎模型的侧向力计算过于简化,导致横摆角速度变化没有被正确映射到轮速预测上。修正的方式是把方向盘转角作为已知输入量显式加入状态方程,并在量测更新中增加横摆角速度的权重,因为横摆角速度对转向敏感、对电机失效也敏感,是区分两种激励最好的观测信号。

修正后的结果很理想:( \mu_{RR} ) 在0.5秒内收敛到0.58到0.62区间,其他三个轮的失效因子估计始终保持在0.05以下,没有出现误判。横摆角速度在转向输入叠加故障扰动的情况下,控制器的最大偏差被限制在0.12 rad/s以内,车辆响应比无控制的工况平滑得多。

5.3 调试过程中的“毛刺”现象与处置思路

联合调试时最让我头疼的现象是:观测器输出在不该波动的地方出现了高频毛刺,尤其是在有轻微转向输入的高速工况。毛刺的根源有两个,一个是量测噪声的统计特性设置不合理,一个是控制指令的突变被模型误差放大成了残差。

针对第一个根源,我把量测噪声协方差 ( R ) 从单纯的固定对角线矩阵改成了随车速可变的矩阵——车速越高,轮速传感器噪声相对越大,( R ) 对应位置也相应增大。针对第二个根源,我在控制层输出端增加了一阶惯性滤波,时间常数0.05秒,让进入观测器量测方程里的信号平滑一些,但又不至于影响观测器对故障阶跃的响应速度。这两个改动加在一起,毛刺幅度下降了约70%,且没有牺牲故障辨识时间。

5.4 控制参数联合整定的关键心得

最后把参数整定的心得集中留一段。很多人分别整完PI和PD参数后直接合在一起联调,结果是这两个环路互相“打架”——车速控制器为了恢复车速增大需求扭矩,横摆控制器为了纠偏希望左右扭矩差更大,两边同时动作时,总扭矩约束无法同时满足,结果就是超调或者周期性振荡。

我的建议是:先固定横摆控制器的PD参数,整定纵向PI,把车速调节做到位;再固定纵向PI,整定横摆PD。这个顺序本身是个近似过程,但能保证系统稳定。如果两者确实需要同时调节,每次只改一个通道的参数,用仿真结果对比曲线判断是哪个通道的响应主导了不良现象。从实际操作看,绝大多数“组合起来就发散”的案例,问题都出在横摆PD的微分项增益过强,它对轮端扭矩抖动的放大作用极其明显。

5.5 这个方案可以继续扩展的方向

仿真跑通之后,可扩展的方向其实很多。第一,目前用的是线性轮胎模型,换diagonal非线性轮胎模型后,观测器在高侧偏角工况下的适应性会变差,这正好是继续研究UKF对模型失配鲁棒性的切入点。第二,现在的控制分配用的是集中式二次规划,下一步可以换成分布式或者基于博弈论的协同分配,结合多智能体控制思路,应对多轮同时失效的场景会更有优势。第三,失效因子的估计结果目前只是反馈给控制器,还没有利用它做寿命预测和健康管理,叠加一套失效趋势外推和剩余寿命估计逻辑,就能把当前的容错控制系统升级成分层递进的预测性维护方案。

这些扩展未必需要推倒重来,现有的UKF观测器、控制器和分配层模块都可以复用,只需要在接口处增补新的信息流,这也是当初坚持模块化搭建的主要原因。

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

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

立即咨询