✨ 长期致力于分布式电动车、故障估计、模型预测控制、重构控制分配、主动容错控制研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1无迹卡尔曼滤波驱动系统故障估计针对分布式电动汽车的轮毂电机可能出现的部分失效故障将故障因子fi作为扩展状态建立增广状态空间模型。采用无迹卡尔曼滤波进行联合状态与参数估计Sigma点选取策略采用对称采样参数alpha0.1beta2kappa0。在每个采样周期UKF输出各轮故障因子估计值范围0到11表示完全有效0表示完全失效。在Carsim中模拟左前轮电机发生渐变故障40秒内从1线性降至0.3UKF估计误差小于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_x8, dim_z4): points MerweScaledSigmaPoints(ndim_x, alpha0.1, beta2.0, kappa0) self.ukf UnscentedKalmanFilter(dim_xdim_x, dim_zdim_z, dt0.01, hxself.hx, fxself.fx, pointspoints) 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, dt0.02, Np12, Nc6): 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_wheel0.3, track_width1.5): self.r r_wheel self.d track_width/2 def allocate(self, Fx_des, Mz_des, faults, mu0.8): # 加权最小二乘分配权重为1/fault w np.array([1/(f0.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