
前面说到了
基于GPS的坡度估计仿真(附源代码)https://blog.youkuaiyun.com/callmeup/article/details/146196150,这里给出使用EKF融合加速度计和陀螺仪数据估计坡度角的方法
文章目录
系统建模
状态变量
选择坡度角θ和陀螺仪偏差b作为状态变量:
x
=
[
θ
b
]
\mathbf{x} = \begin{bmatrix} \theta \\ b \end{bmatrix}
x=[θb]
状态方程(过程模型)
-
陀螺仪测量的角速度ω包含偏差b,离散时间步长为Δt:
θ k + 1 = θ k + ( ω k − b k ) ⋅ Δ t + w θ \theta_{k+1} = \theta_k + (\omega_k - b_k) \cdot \Delta t + w_{\theta} θk+1=θk+(ωk−bk)⋅Δt+wθ
b k + 1 = b k + w b b_{k+1} = b_k + w_b bk+1=bk+wb
其中, w θ w_{\theta} wθ和 w b w_b wb为过程噪声,假设为高斯白噪声。 -
矩阵形式:
x k + 1 = F x k + w \mathbf{x}_{k+1} = \mathbf{F} \mathbf{x}_k + \mathbf{w} xk+1=Fxk+w
状态转移矩阵:
F = [ 1 − Δ t 0 1 ] \mathbf{F} = \begin{bmatrix} 1 & -\Delta t \\ 0 & 1 \end{bmatrix} F=[10−Δt1]
过程噪声协方差矩阵:
Q = [ σ θ 2 0 0 σ b 2 ] \mathbf{Q} = \begin{bmatrix} \sigma_{\theta}^2 & 0 \\ 0 & \sigma_b^2 \end{bmatrix} Q=[σθ200σb2]
观测模型
加速度计观测方程
加速度计测量值包含车辆纵向加速度
a
vehicle
a_{\text{vehicle}}
avehicle和重力分量:
z
k
=
a
vehicle
+
g
sin
θ
k
+
v
k
z_k = a_{\text{vehicle}} + g \sin\theta_k + v_k
zk=avehicle+gsinθk+vk
其中,
v
k
v_k
vk为观测噪声,假设为高斯白噪声。
观测矩阵(非线性)
观测函数为:
h
(
x
k
)
=
a
vehicle
+
g
sin
θ
k
h(\mathbf{x}_k) = a_{\text{vehicle}} + g \sin\theta_k
h(xk)=avehicle+gsinθk
雅可比矩阵(用于EKF线性化):
H
k
=
[
g
cos
θ
k
0
]
\mathbf{H}_k = \begin{bmatrix} g \cos\theta_k & 0 \end{bmatrix}
Hk=[gcosθk0]
观测噪声协方差:
R
=
σ
z
2
R = \sigma_z^2
R=σz2
扩展卡尔曼滤波(EKF)流程
初始化
设置初始状态和协方差:
x
^
0
=
[
0
0
]
,
P
0
=
diag
(
p
θ
,
p
b
)
\hat{\mathbf{x}}_0 = \begin{bmatrix} 0 \\ 0 \end{bmatrix}, \quad \mathbf{P}_0 = \text{diag}(p_{\theta}, p_b)
x^0=[00],P0=diag(pθ,pb)
预测步骤
- 预测状态:
x ^ k ∣ k − 1 = F x ^ k − 1 \hat{\mathbf{x}}_{k|k-1} = \mathbf{F} \hat{\mathbf{x}}_{k-1} x^k∣k−1=Fx^k−1 - 预测协方差:
P k ∣ k − 1 = F P k − 1 F T + Q \mathbf{P}_{k|k-1} = \mathbf{F} \mathbf{P}_{k-1} \mathbf{F}^T + \mathbf{Q} Pk∣k−1=FPk−1FT+Q
更新步骤
- 计算卡尔曼增益:
K k = P k ∣ k − 1 H k T ( H k P k ∣ k − 1 H k T + R ) − 1 \mathbf{K}_k = \mathbf{P}_{k|k-1} \mathbf{H}_k^T \left( \mathbf{H}_k \mathbf{P}_{k|k-1} \mathbf{H}_k^T + R \right)^{-1} Kk=Pk∣k−1HkT(HkPk∣k−1HkT+R)−1 - 更新状态估计:
x ^ k = x ^ k ∣ k − 1 + K k ( z k − h ( x ^ k ∣ k − 1 ) ) \hat{\mathbf{x}}_k = \hat{\mathbf{x}}_{k|k-1} + \mathbf{K}_k \left( z_k - h(\hat{\mathbf{x}}_{k|k-1}) \right) x^k=x^k∣k−1+Kk(zk−h(x^k∣k−1)) - 更新协方差:
P k = ( I − K k H k ) P k ∣ k − 1 \mathbf{P}_k = (\mathbf{I} - \mathbf{K}_k \mathbf{H}_k) \mathbf{P}_{k|k-1} Pk=(I−KkHk)Pk∣k−1
关键实现细节
- 车辆加速度获取:假设通过车辆CAN总线或轮速传感器微分获得 a vehicle a_{\text{vehicle}} avehicle,否则需联合估计。
- 非线性处理:使用EKF或UKF处理观测模型中的 sin θ \sin\theta sinθ。
- 噪声调整:根据传感器特性调整 Q \mathbf{Q} Q和 R R R,如陀螺仪噪声大则增大 σ θ 2 \sigma_{\theta}^2 σθ2。
- 初始条件:静止时可初始化θ为加速度计计算值,提高收敛速度。
公式总结
-
状态预测:
θ k ∣ k − 1 = θ k − 1 + ( ω k − 1 − b k − 1 ) Δ t \theta_{k|k-1} = \theta_{k-1} + (\omega_{k-1} - b_{k-1}) \Delta t θk∣k−1=θk−1+(ωk−1−bk−1)Δt
b k ∣ k − 1 = b k − 1 b_{k|k-1} = b_{k-1} bk∣k−1=bk−1 -
观测更新:
θ k = θ k ∣ k − 1 + K θ ( z k − a vehicle g − sin θ k ∣ k − 1 ) \theta_k = \theta_{k|k-1} + K_{\theta} \left( \frac{z_k - a_{\text{vehicle}}}{g} - \sin\theta_{k|k-1} \right) θk=θk∣k−1+Kθ(gzk−avehicle−sinθk∣k−1)
b k = b k ∣ k − 1 + K b ( z k − a vehicle g − sin θ k ∣ k − 1 ) b_k = b_{k|k-1} + K_b \left( \frac{z_k - a_{\text{vehicle}}}{g} - \sin\theta_{k|k-1} \right) bk=bk∣k−1+Kb(gzk−avehicle−sinθk∣k−1)
参数调试建议
- 通过Allan方差分析陀螺仪噪声,确定过程噪声参数。
- 静态测试标定加速度计噪声。
- 使用斜坡道路实测数据验证坡度估计精度。
MATLAB代码
部分源代码
%% 车辆坡度估计EKF仿真,使用EKF融合加速度计和陀螺仪数据估计坡度角
% 作者:matlabfilter
clear; clc; close all;
%% 1. 参数设置
dt = 0.01; % 采样时间(s)
T = 10; % 总时长(s)
N = T/dt; % 数据点数
g = 9.81; % 重力加速度(m/s²)
% 过程噪声协方差矩阵Q
Q = diag([0.001, 0.0001]); % 角度和偏差的噪声
% 观测噪声协方差R
R = 0.1; % 加速度计噪声
% 传感器特性
gyro_bias = 0.1; % 陀螺仪固定偏差(rad/s)
gyro_noise = 0.01; % 陀螺仪噪声强度
accel_noise = 0.1; % 加速度计噪声强度
%% 2. 生成真实数据
% 真实坡度角(示例:斜坡+正弦变化)
true_theta = linspace(0, 0.5, N) + 0.1*sin(2*pi*(0:N-1)/N);
true_bias = gyro_bias*ones(1,N);
% 真实角速度(坡度角导数 + 偏差)
true_omega = diff(true_theta)/dt + gyro_bias;
true_omega = [true_omega, true_omega(end)];
% 车辆纵向加速度(示例:正弦变化)
a_vehicle = 0.5*sin(2*pi*(0:N-1)/N);
% 生成传感器数据
gyro_meas = true_omega + gyro_noise*randn(1,N); % 陀螺仪测量值
accel_meas = a_vehicle + g*sin(true_theta) + accel_noise*randn(1,N); % 加速度计测量值
%% 3. EKF初始化
%% 4. EKF主循环
%% 5. 结果可视化
运行结果


如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者
3209

被折叠的 条评论
为什么被折叠?



