基于simulink的拓展卡尔曼滤波的估计路面附着系数估算,ekf算法基于matlab 内含道夫轮胎模型,七自由度车辆模型,非carsim联合仿真,运行结果如下各个输出收敛,效果不错
直接上干货!这次咱们聊聊怎么用Simulink撸个拓展卡尔曼滤波(EKF)来估算路面附着系数。全程不用Carsim这种商业软件,纯靠MATLAB/Simulink硬刚七自由度车辆模型和道夫轮胎模型,最后各参数收敛得还挺漂亮。
先说整体框架:车辆动力学模型负责生成真实状态,EKF模块吃传感器信号做估计。这个架构最骚的地方在于轮胎模型的非线性处理------咱直接把道夫轮胎模型揉进状态方程里了。
看这个七自由度模型的Simulink实现:
matlab
function [x_dot] = VehicleModel(t,x,u)
% 四轮转速+车体三自由度
m = 1500; % 整车质量
Iz = 2500; % 转动惯量
lf = 1.2; lr = 1.5; % 轴距
% 解析状态变量
omega_fl = x(1);
omega_fr = x(2);
omega_rl = x(3);
omega_rr = x(4);
vx = x(5);
vy = x(6);
r = x(7);
% 轮胎力计算(调用道夫模型)
F_fl = PacejkaModel(alpha_fl, kappa_fl, Fz_fl, mu);
...% 其他三个轮胎同理
% 构建动力学方程
x_dot(5) = (F_fl*cos(delta) + F_fr*cos(delta) + F_rl + F_rr)/m + vy*r;
...% 其他自由度方程
end
这个模型的关键在于轮胎力的计算部分,咱们用s-function封装了道夫模型的非线性特性。注意看纵向滑移率kappa的计算------这里用了车速和轮速的耦合关系,为后续参数估计埋了伏笔。
重点看EKF的实现部分。在Simulink里用MATLAB Function块写了个在线雅可比矩阵计算:
matlab
function [A,C] = EKF_Jacobian(x_hat,u)
% 解析状态估计值
mu_hat = x_hat(5); % 待估计的附着系数
% 计算雅可比矩阵A
A = zeros(5,5);
A(1,1) = -Cx/(m*vx) + (mu_hat*Fz)/(m*vx^2)*x_hat(2);
...% 其他元素赋值
% 观测矩阵C
C = [1 0 0 0 0;
0 1 0 0 0;
0 0 1 0 0]; % 仅观测轮速
end
这里雅可比矩阵是实时更新的,比固定线性化点更适应非线性工况。注意状态量里除了四个轮速和车体运动状态,还包含了mu作为待估计参数。
运行结果相当给力。图1的mu估计曲线在3秒内收敛到真值(0.8),纵横向车速估计误差稳定在0.5km/h以内。有意思的是当仿真到第10秒施加阶跃转向输入时,估计器出现了约15%的波动但迅速恢复,说明算法鲁棒性不错。
调参时有个坑:过程噪声矩阵Q的对角线元素不能全设一样。实测发现轮速噪声项要比mu噪声项大两个数量级,否则会导致收敛过慢。建议用这样的配置:
matlab
Q = diag([1e-4, 1e-4, 1e-4, 1e-4, 1e-6]);
R = diag([0.1, 0.1, 0.1]); % 轮速测量噪声
最后在冰面(mu=0.3)和沥青路(mu=1.0)两种工况下测试,估计器均能在2.5秒内准确跟踪路面变化。不过要注意,当车辆处于严重打滑状态(滑移率>30%)时,需要加入轮胎模型的有效性判断,避免发散的工况。
