基于车辆状态估计的电动汽车横纵向稳定性滑模观测器【附代码】
2026/5/5 0:23:20 网站建设 项目流程

博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。


(1)双重无迹卡尔曼滤波的车身质量与状态联合估计:

为同时估计分布式驱动电动汽车的质心侧偏角、横摆角速度和车身质量,设计了一种双重无迹卡尔曼滤波估计器。主滤波器以方向盘转角、四个车轮转速和纵向加速度为输入,利用七自由度车辆模型和Dugoff轮胎模型,预测车辆侧向和横摆运动状态,并利用改进的Cholesky分解保证协方差矩阵的平方根计算非负定。副滤波器基于纵向动力学和悬架垂直力平衡方程,根据车辆加速度和轮胎载荷估计车身总质量。两滤波器信息交互频率20Hz,互为校正,副滤波器输出的质量参数更新主滤波器的模型参数。在Carsim-Simulink联合仿真中,设置车辆质量从空载1500kg突变至满载2200kg(模拟载货),双重无迹卡尔曼滤波的质量估计在1.2s内收敛至误差±18kg,质心侧偏角估计误差小于0.3°,与单独的无迹卡尔曼滤波相比,在质量变化时侧滑角估计的均方根误差降低了46%,为后续稳定性控制提供可靠状态。

(2)模型预测纵向稳定性与最优转矩分配:

构建了分层纵向稳定性控制器,上层采用模型预测控制器计算期望纵向加速度。预测模型为简化的纵向一阶系统,目标函数综合考虑车速跟随误差、加速度变化率和能量消耗,并加入驱动防滑约束。在Simulink中利用FORCES Pro求解器实时求解,控制周期50ms,计算时间约4ms。下层控制器将期望总驱动力矩通过最优分配算法分配到四个轮毂电机,以最小轮胎负荷率为优化目标,在电机峰值转矩和附着极限约束下求解二次规划问题。在高附着双移线工况中,纵向速度从80km/h降至60km/h的制动过程中,四轮滑移率始终远低于附着峰值点,车速跟踪误差小于0.3km/h。当单个车轮因路面湿滑(μ=0.3)力矩受限时,转矩分配算法自动减少该轮力矩同时增加对侧车轮力,使车辆减速轨迹没有明显跑偏。

(3)基于模型预测的直接横摆力矩控制与滑模观测器联合验证:

设计横向稳定性控制器,上层采用模型预测控制计算稳定车辆所需的附加横摆力矩,参考模型为二自由度线性车辆模型,产生理想横摆角速度。控制器以横摆角速度偏差和质心侧偏角为状态,预测时域10步,通过优化得到附加横摆力矩。下层分配器将附加力矩分配为四个车轮的差动驱动力,采用基于轮胎附着利用率最小的二次规划。在正弦转向输入和低附双移线工况下,控制器成功将横摆角速度跟随误差控制在10%以内,质心侧偏角峰值从无控制的4.2°降至1.8°。滑模观测器用于估计无法直接测量的轮胎侧向力,通过设计滑模面使观测器动态追踪轮胎模型输出与实际响应的误差,为模型预测控制提供实时侧向力反馈,进一步增强了控制器在轮胎非线性区的鲁棒性。

import numpy as np from filterpy.kalman import UnscentedKalmanFilter from scipy.linalg import cholesky # 双重无迹卡尔曼滤波设计 class DualUKF_Estimator: def __init__(self): # 主滤波器:状态[x, yaw rate, sideslip] self.ukf_state = UnscentedKalmanFilter(dim_x=3, dim_z=3, dt=0.01, hx=self.state_measure, fx=self.state_trans) # 副滤波器:质量估计 self.ukf_mass = UnscentedKalmanFilter(dim_x=1, dim_z=2, dt=0.01, hx=self.mass_measure, fx=self.mass_trans) self.mass_est = 1500.0 def state_trans(self, x, dt): # 七自由度简化模型 return x # 占位 def state_measure(self, x): return x def mass_trans(self, m, dt): return m def mass_measure(self, m): return np.array([0, m]) def update(self, steering, wheel_speeds, acc): # 副滤波器更新质量 self.ukf_mass.predict() self.ukf_mass.update(np.array([acc, 0])) self.mass_est = self.ukf_mass.x[0] # 主滤波器利用新质量估计更新状态 self.ukf_state.predict(fx=lambda x,dt: self.state_trans(x,dt, self.mass_est)) self.ukf_state.update(np.array([0,0,0])) return self.ukf_state.x # 模型预测控制纵向 class MPC_Longitudinal: def __init__(self, Np=10, dt=0.05): self.Np = Np self.dt = dt def solve(self, v_ego, v_ref): # 简化的车速预测 a_opt = (v_ref - v_ego) / (self.Np*self.dt) * 0.9 return np.clip(a_opt, -3, 2) # 最优转矩分配 def torque_distribution(F_total, motor_limits, mu, wheel_radius=0.35): from cvxopt import matrix, solvers n = 4 H = np.eye(n) * 0.01 f = np.zeros(n) Aeq = np.ones((1,n)) beq = np.array([F_total]) lb = -motor_limits; ub = motor_limits # 附着约束 G = np.vstack([np.eye(n), -np.eye(n)]) h = np.concatenate([mu * 4000 * wheel_radius, mu * 4000 * wheel_radius]) sol = solvers.qp(matrix(H), matrix(f), G=matrix(G), h=matrix(h), A=matrix(Aeq), b=matrix(beq)) return np.array(sol['x']).flatten()


如有问题,可以直接沟通

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

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

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

立即咨询