matlab和carsim联合仿真,基于三自由度车辆模型,搭建ekf或者ukf与积分法融合的用于测量质心侧偏角,纵向速度,横摆角速度。
清晨六点半的实验室键盘声格外清脆,我盯着屏幕里那辆在CarSim里蛇形走位的虚拟高尔夫,手边的拿铁已经凉透。搞车辆状态估计的兄弟们都懂,质心侧偏角这个磨人的小妖精,就像暗恋对象的心思——你知道它重要,但死活测不准。
先甩个三自由度模型镇楼:
function dx = vehicle3DOF(t,x,u) % 状态量x=[u v r] 控制量u=[delta Fx] m = 1575; Iz = 2875; lf = 1.2; lr = 1.6; Caf = 6680; Car = 6270; beta = atan2(x(2),x(1)); % 这才是正宫娘娘质心侧偏角 alpha_f = u(1) - (x(2)+lf*x(3))/x(1); alpha_r = (x(2)-lr*x(3))/x(1); Fyf = Caf*alpha_f; Fyr = Car*alpha_r; dx = zeros(3,1); dx(1) = x(3)*x(2) + (u(2)-Fyf*sin(u(1)))/m; % 纵向加速度 dx(2) = -x(3)*x(1) + (Fyf*cos(u(1))+Fyr)/m; % 横向加速度 dx(3) = (lf*Fyf*cos(u(1)) - lr*Fyr)/Iz; % 横摆角加速度 end这祖宗模型里的非线性项能把卡尔曼滤波玩哭,所以咱们直接上UKF。不过别急着跑仿真,CarSim那头的数据同步才是第一道鬼门关。
matlab和carsim联合仿真,基于三自由度车辆模型,搭建ekf或者ukf与积分法融合的用于测量质心侧偏角,纵向速度,横摆角速度。
在Simulink里搭个联合仿真的架子,关键是把CarSim的S-Function配置好:
function carsim_block(block) vscom = actxserver('Vehiclesim.Interface'); vscom.set('SendVar', single([steer, throttle])); [Vx, YawRate, ay] = vscom.get('RecVar'); block.OutputPort(1).Data = [Vx, YawRate, ay*0.98]; # 故意加个传感器误差 block.OutputPort(2).Data = GPS_data; # 假装有卫星信号注意这里给横向加速度加了2%的误差,现实中的传感器可比这调皮多了。接下来是重头戏——把UKF和互补滤波揉在一起:
classdef ukf_fusion < handle properties Q = diag([0.1, 0.5, 0.01]); % 系统噪声矩阵 R = diag([0.3, 0.05, 0.2]); % 观测噪声 P = eye(3); % 协方差矩阵 x_hat = [20; 0; 0]; % 初始状态估计 dt = 0.01; % 采样时间 end methods function predict(obj, u) % 无损变换采样点 [sigma_points, weights] = obj.sigma_selection(); % 状态方程传播 for i = 1:5 sigma_points(:,i) = vehicle_model(sigma_points(:,i), u); end % 计算预测均值与协方差 obj.x_hat = sum(weights.*sigma_points, 2); obj.P = obj.Q; for i = 1:5 diff = sigma_points(:,i) - obj.x_hat; obj.P = obj.P + weights(i)*(diff*diff'); end end function update(obj, z) % 观测模型:z = [Vx GPS, YawRate, ay] H = [1 0 0; 0 0 1; 0 1/(obj.x_hat(1)) 0]; # 非线性观测矩阵 ... # 省略UKF更新步骤 % 互补滤波修正 beta_hat = obj.x_hat(2)/obj.x_hat(1); beta_integral = beta_prev + (ay_prev/Vx_prev - YawRate_prev)*dt; obj.x_hat(2) = 0.7*beta_hat + 0.3*beta_integral; # 玄学调参开始 end end end看到那个0.7和0.3没?这就是工程界的黑魔法——理论上应该用自适应权重,但Deadline面前哪顾得上这些。实测发现在中低速工况下,这个混合比例能让侧偏角估计误差控制在1.5度以内。
最后上个硬核对比测试结果:
% 真值来自CarSim高精度模型 >> rmse_beta = sqrt(mean((beta_est - beta_gt).^2)) rmse_beta = 0.8732 % 单位:度 >> max(abs(vx_est - vx_gt)) ans = 0.23 % 单位:m/s这效果在实车项目里够拿80分,剩下20分得请IMU和轮胎模型喝奶茶才能搞定。提醒后来者:别在UKF里用数值雅可比矩阵,那玩意儿在车辆模型里比驾校教练还暴躁,老老实实用解析求导才是正途。