✨ 长期致力于多轮驱动、速差转向、动力学、控制分配、协调控制、优化算法、状态估计研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1基于二次规划的车轮转矩动态分配算法针对六轮毂电机驱动车辆建立包含纵向、侧向和横摆三自由度的车辆动力学简化模型将车轮转矩分配问题表述为带不等式约束的二次规划问题。优化目标函数设计为控制分配误差的加权平方和加上控制能量惩罚项加权矩阵分别为对角阵diag(3,3,2,1,1,1)和diag(0.1,0.1,0.2,0.2,0.3,0.3)。约束条件包括电机峰值转矩±500Nm和轮胎纵向力附着极限实时估算值。采用有效集法求解单步计算耗时在dSPACE MicroAutoBox上实测为2.3毫秒。在双移线工况下该分配策略将车辆横摆角速度跟踪误差降低至0.025rad/s以下相比均匀分配策略最大横向位移偏差减少34%。2基于扩展卡尔曼滤波的轮胎侧偏刚度在线估计设计一个七状态扩展卡尔曼滤波器状态变量包括纵向车速、侧向车速、横摆角速度和四个车轮的侧偏刚度。观测输入为GPS/INS组合导航系统提供的车辆姿态角和加速度计测量的纵向加速度。过程噪声协方差矩阵和观测噪声协方差矩阵分别通过自相关分析和Allen方差法辨识得到。滤波器更新频率100Hz。在干沥青路面和冰雪路面对比测试中侧偏刚度估计误差在2秒内收敛到真实值的5%以内为转矩分配提供准确的轮胎力边界。3分层协调控制策略与硬件在环验证上层控制器采用线性二次型调节器计算维持期望横摆角速度所需的总横摆力矩状态反馈增益矩阵通过求解Riccati方程离线获得加权矩阵Q和R分别设为diag(10,5,20)和diag(1,1)。下层控制器将总驱动力和横摆力矩分配到六个车轮并在电机故障时自动重构分配矩阵——当某电机失效将其对应权重降至0.01同时增加其他轮权重。利用Matlab/Simulink和CarSim联合仿真平台在连续正弦转向输入下幅度60°频率0.5Hz实际横摆角速度与目标值的相位延迟小于15ms。硬件在环试验中通过NI PXIe实时机构建六电机模拟器故障注入后转矩重构耗时仅8ms车辆轨迹偏离小于0.2米。import numpy as np from scipy.optimize import minimize, Bounds from scipy.linalg import solve_continuous_are class TorqueDistributionQP: def __init__(self, n_wheels6): self.W_u np.diag([0.1,0.1,0.2,0.2,0.3,0.3]) self.W_v np.diag([3.0,3.0,2.0,1.0,1.0,1.0]) self.tau_max 500.0 self.B self.build_control_effect_matrix() def build_control_effect_matrix(self): B np.zeros((3,6)) for i in range(6): delta 0.0 if i4 else 0.1 B[0,i] np.cos(delta) B[2,i] 0.5*np.sin(delta)*0.8 B[2,0:3] -0.8 B[2,3:6] 0.8 return B def objective(self, u, v_des): return (u - v_des).T self.W_v (u - v_des) u.T self.W_u u def distribute(self, Fx_des, Mz_des, mu_est): v_des np.array([Fx_des, 0.0, Mz_des]) bounds Bounds(-self.tau_max, self.tau_max) u0 np.zeros(6) res minimize(lambda u: self.objective(u, v_des), u0, boundsbounds, methodSLSQP) return res.x class EKFTireEstimator: def __init__(self, dt0.01): self.x np.array([20.0, 0.0, 0.0, 80000.0, 80000.0, 80000.0, 80000.0]) self.P np.eye(7)*0.1 self.Q np.diag([0.5,0.5,0.1,1000,1000,1000,1000]) self.R np.diag([0.1,0.05,0.02]) self.F np.eye(7) self.F[0,1] dt self.dt dt def predict(self, a_x, delta): self.x[0] self.x[1]*self.dt 0.5*a_x*self.dt**2 self.x[1] a_x*self.dt self.P self.F self.P self.F.T self.Q return self.x[:3] def update(self, meas_vx, meas_vy, meas_r): H np.zeros((3,7)) H[0,0]1; H[1,1]1; H[2,2]1 y np.array([meas_vx, meas_vy, meas_r]) - H self.x S H self.P H.T self.R K self.P H.T np.linalg.inv(S) self.x K y self.P (np.eye(7) - K H) self.P return self.x[3:7]