三自由度车辆仿真融合Matlab与carsim,融合EKF/UKF与积分法测量质心侧偏角、纵向...
清晨六点半的实验室键盘声格外清脆,我盯着屏幕里那辆在CarSim里蛇形走位的虚拟高尔夫,手边的拿铁已经凉透。搞车辆状态估计的兄弟们都懂,质心侧偏角这个磨人的小妖精,就像暗恋对象的心思——你知道它重要,但死活测不准。看到那个0.7和0.3没?matlab和carsim联合仿真,基于三自由度车辆模型,搭建ekf或者ukf与积分法融合的用于测量质心侧偏角,纵向速度,横摆角速度。matlab和carsim
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里用数值雅可比矩阵,那玩意儿在车辆模型里比驾校教练还暴躁,老老实实用解析求导才是正途。

更多推荐
所有评论(0)