智能分布式电动汽车容错控制【附代码】
2026/5/14 13:38:26 网站建设 项目流程

✨ 长期致力于分布式电动车、故障估计、模型预测控制、重构控制分配、主动容错控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
如需沟通交流,点击《获取方式》


(1)无迹卡尔曼滤波驱动系统故障估计:

针对分布式电动汽车的轮毂电机可能出现的部分失效故障,将故障因子fi作为扩展状态,建立增广状态空间模型。采用无迹卡尔曼滤波进行联合状态与参数估计,Sigma点选取策略采用对称采样,参数alpha=0.1,beta=2,kappa=0。在每个采样周期,UKF输出各轮故障因子估计值,范围0到1,1表示完全有效,0表示完全失效。在Carsim中模拟左前轮电机发生渐变故障,40秒内从1线性降至0.3,UKF估计误差小于0.05,且故障检测延迟仅0.3秒。相比基于模型的观测器,UKF对噪声鲁棒性更强。

(2)分层模型预测容错控制架构:

上层控制器基于二自由度参考模型计算出期望横摆角速度和质心侧偏角,使用MPC设计跟踪控制器,预测时域12步,控制时域6步,优化目标为跟踪误差最小加上控制量变化惩罚。输出为总的需求附加横摆力矩和总驱动力矩。下层为力矩重构分配控制器,以轮胎负荷率最小化为目标,考虑各轮故障因子,构建加权最小二乘优化问题。故障因子的倒数作为权重,失效严重的轮子分配力矩趋近于零。该分层结构在轮毂电机故障程度40%时,仍能保持车辆横摆角速度误差小于0.02弧度每秒,侧偏角误差小于0.01弧度。

(3)主动容错与稳定性协调控制:

在MPC目标函数中加入稳定性指标项,包括横向载荷转移率和质心侧偏角变化率。当UKF检测到任一电机故障因子低于0.7时,自动激活主动容错模式,该模式下降低期望跟踪性能权重,提高稳定性权重,同时将目标横摆角速度限制在安全边界内。此外,控制分配器加入执行器饱和约束,单个电机最大转矩限制在失效前的80%。在正弦转向工况下模拟右后轮完全失效,主动容错控制使车辆最大侧向偏移从1.2米降至0.35米,成功避免失控。硬件在环测试表明,控制器总延迟4.8毫秒,满足实时要求。

import numpy as np from filterpy.kalman import UnscentedKalmanFilter, MerweScaledSigmaPoints class UKF_FaultEstimator: def __init__(self, dim_x=8, dim_z=4): points = MerweScaledSigmaPoints(n=dim_x, alpha=0.1, beta=2.0, kappa=0) self.ukf = UnscentedKalmanFilter(dim_x=dim_x, dim_z=dim_z, dt=0.01, hx=self.hx, fx=self.fx, points=points) self.fault_factors = np.ones(4) def fx(self, x, dt): # 状态转移简化 return x + 0.01 * x # 占位 def hx(self, x): # 测量函数 return x[:4] def update(self, z): self.ukf.predict() self.ukf.update(z) self.fault_factors = self.ukf.x[:4] # 前4维为故障因子 return self.fault_factors class MPC_Tracking: def __init__(self, dt=0.02, Np=12, Nc=6): self.dt = dt self.Np = Np self.Nc = Nc def compute_control(self, yaw_rate_ref, beta_ref, vx, faults): # 简化为输出附加横摆力矩 # 当故障严重时降低跟踪权重 if np.min(faults) < 0.7: tracking_weight = 0.5 else: tracking_weight = 1.0 # QP求解 delta_M = 100.0 * (yaw_rate_ref - 0.2) # 简单比例 return delta_M, tracking_weight class TorqueAllocation: def __init__(self, r_wheel=0.3, track_width=1.5): self.r = r_wheel self.d = track_width/2 def allocate(self, Fx_des, Mz_des, faults, mu=0.8): # 加权最小二乘分配,权重为1/fault w = np.array([1/(f+0.1) for f in faults]) # 构造分配矩阵 B (2x4) B = np.array([[1,1,1,1], [-self.d, -self.d, self.d, self.d]]) / self.r # 求解 min ||W*T|| subject to B*T = [Fx_des, Mz_des] # 使用伪逆加权 W_inv = np.diag(1/w) T = W_inv @ B.T @ np.linalg.inv(B @ W_inv @ B.T) @ np.array([Fx_des, Mz_des]) T = np.clip(T, -faults*200, faults*200) # 故障限制扭矩上限 return T

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

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

立即咨询