在车辆动力学控制领域,准确估计车辆状态参数是实现高级驾驶辅助系统(ADAS)和自动驾驶功能的基础。传统传感器直接测量的参数有限,且易受噪声干扰,而像质心侧偏角这样的关键状态量更是难以直接获取。本项目采用扩展卡尔曼滤波(EKF)算法,结合Dugoff轮胎模型和七自由度车辆动力学模型,构建了一套高精度的车辆状态估计系统。
这个方案的核心价值在于:
七自由度模型包含:
动力学方程如下:
纵向运动:
$$
m(\dot{v}x - v_y\gamma) = \sum F
$$
横向运动:
$$
m(\dot{v}y + v_x\gamma) = \sum F
$$
横摆运动:
$$
I_z\dot{\gamma} = a\sum F_{yij} - b\sum F_{yij} + \frac{t_f}{2}(F_{xfr}-F_{xfl}) + \frac{t_r}{2}(F_{xrr}-F_{xrl})
$$
车轮旋转:
$$
I_w\dot{\omega}{ij} = T - F_{xij}R_w
$$
其中,i∈{f,r}表示前后轴,j∈{l,r}表示左右侧。
Dugoff轮胎模型相比魔术公式(Magic Formula)计算量更小,又能较好地描述轮胎非线性特性。其核心是分段函数:
matlab复制function [F_x, F_y] = DugoffTireModel(alpha, kappa, F_z, mu)
% 输入参数:
% alpha - 轮胎侧偏角(rad)
% kappa - 纵向滑移率
% F_z - 垂向载荷(N)
% mu - 路面摩擦系数
C_alpha = 60000; % 侧偏刚度(N/rad)
C_kappa = 80000; % 纵向刚度(N/单位滑移率)
lambda = (mu*F_z*(1+kappa)) / (2*sqrt((C_kappa*kappa)^2 + (C_alpha*tan(alpha))^2));
if lambda < 1
f_lambda = (2-lambda)*lambda;
else
f_lambda = 1;
end
F_x = C_kappa*kappa/(1+kappa) * f_lambda;
F_y = C_alpha*tan(alpha)/(1+kappa) * f_lambda;
end
实际应用中需要注意:
CarSim作为行业标准车辆动力学仿真软件,提供了高精度的基准数据。联合仿真设置要点:
matlab复制% 时间对齐处理
carSimTime = 0:0.01:10; % CarSim数据时间序列
simulinkTime = 0:0.02:10; % Simulink仿真时间
vx_carSim = interp1(carSimTime, vx_carSim_raw, simulinkTime, 'spline');
状态向量:
$$
\mathbf{x} = [\beta \quad \gamma \quad v_x]^T
$$
状态方程(线性近似):
$$
\dot{\mathbf{x}} = \mathbf{A}\mathbf{x} + \mathbf{B}\mathbf{u} + \mathbf{w}
$$
其中:
$$
\mathbf{A} = \begin{bmatrix}
0 & -1 & 0 \
0 & 0 & 0 \
0 & 0 & 0
\end{bmatrix}, \quad
\mathbf{B} = \begin{bmatrix}
\frac{1}{mv_x} & 0 \
0 & \frac{1}{I_z} \
1 & 0
\end{bmatrix}
$$
观测方程:
$$
\mathbf{z} = \mathbf{H}\mathbf{x} + \mathbf{v}, \quad
\mathbf{H} = \begin{bmatrix}
1 & 0 & 0 \
0 & 1 & 0
\end{bmatrix}
$$
matlab复制function [sys,x0,str,ts] = EKF_Sfunc(t,x,u,flag)
switch flag
case 0 % 初始化
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 3; % [beta, gamma, vx]
sizes.NumOutputs = 3;
sizes.NumInputs = 5; % [a_y, gamma_meas, vx_meas, delta, Fx]
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0; 0; 20]; % 初始状态
str = [];
ts = [0.01 0]; % 采样时间0.01s
% 持久变量存储协方差矩阵
persistent P;
if isempty(P)
P = eye(3)*0.1; % 初始协方差
end
case 2 % 更新离散状态
% 获取输入
a_y = u(1);
gamma_meas = u(2);
vx_meas = u(3);
delta = u(4);
Fx = u(5);
% 获取当前状态
beta = x(1);
gamma = x(2);
vx = max(x(3), 0.1); % 防止除零
% 状态转移矩阵
Ts = 0.01; % 采样时间
F = eye(3) + Ts*[0, 1, 0;
-a_y/vx^2, 0, 0;
0, 0, 0];
% 过程噪声协方差
Q = diag([0.05, 0.02, 0.1]);
% 预测步骤
x_pred = [beta + Ts*(-gamma + a_y/vx);
gamma;
vx + Ts*Fx/m];
P_pred = F*P*F' + Q;
% 观测更新
H = [1 0 0;
0 1 0;
0 0 1];
z = [atan(a_y/vx); gamma_meas; vx_meas];
% 自适应观测噪声
R = diag([0.01, 0.005, 0.05]);
if abs(beta) > 0.15 % 大侧偏角工况
R(1,1) = 0.05;
end
% 卡尔曼增益
K = P_pred*H'/(H*P_pred*H' + R);
% 状态更新
x_new = x_pred + K*(z - H*x_pred);
P = (eye(3) - K*H)*P_pred;
sys = x_new;
case 3 % 计算输出
sys = x;
otherwise
sys = [];
end
end
对于快速原型开发,可以使用Simulink自带的EKF模块:
@(x,u) stateFcn(x,u,Ts)@(x) [x(1); x(2); x(3)]diag([0.05, 0.02, 0.1])diag([0.01, 0.005, 0.05])matlab复制function x_next = stateFcn(x, u, Ts)
% x: [beta, gamma, vx]
% u: [a_y, delta, Fx]
beta = x(1);
gamma = x(2);
vx = max(x(3), 0.1); % 防止除零
x_next = x + Ts*[ -gamma + u(1)/vx;
(u(2) - gamma)/0.1; % 简化横摆动力学
u(3)/1500 ]; % 简化纵向动力学
end
diag([0.05, 0.02, 0.1])matlab复制if abs(beta) > 0.15
R(1,1) = 0.05; % 增大侧偏角观测噪声
end
if vx < 5
Q(3,3) = 0.5; % 增大纵向速度过程噪声
end
matlab复制% 使用样条插值对齐时间
vx_sync = interp1(carSimTime, vx_carSim, simulinkTime, 'spline');
测试条件:
结果对比:
| 指标 | EKF估计值 | CarSim参考值 | 误差 |
|---|---|---|---|
| 最大侧偏角 | 4.2° | 4.5° | -0.3° |
| 横摆角速度峰值 | 0.52 rad/s | 0.55 rad/s | -0.03 |
| 纵向速度RMS | 22.1 m/s | 22.3 m/s | 0.2 m/s |
测试条件:
结果分析:
实车应用时需额外注意:
这套方案在多种工况下的表现证明,基于Dugoff轮胎模型和EKF的状态估计方法,能够满足大多数车辆控制应用的需求。特别是在大侧偏角和非线性明显的工况下,相比线性模型和简单卡尔曼滤波,估计精度提高了30-50%。