【课题推荐】使用EKF融合加速度计和陀螺仪数据估计坡度角的方法

在这里插入图片描述

前面说到了基于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+(ωkbk)Δ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)

预测步骤

  1. 预测状态:
    x ^ k ∣ k − 1 = F x ^ k − 1 \hat{\mathbf{x}}_{k|k-1} = \mathbf{F} \hat{\mathbf{x}}_{k-1} x^kk1=Fx^k1
  2. 预测协方差:
    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} Pkk1=FPk1FT+Q

更新步骤

  1. 计算卡尔曼增益:
    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=Pkk1HkT(HkPkk1HkT+R)1
  2. 更新状态估计:
    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^kk1+Kk(zkh(x^kk1))
  3. 更新协方差:
    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=(IKkHk)Pkk1

关键实现细节

  • 车辆加速度获取:假设通过车辆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 θkk1=θk1+(ωk1bk1)Δt
    b k ∣ k − 1 = b k − 1 b_{k|k-1} = b_{k-1} bkk1=bk1

  • 观测更新
    θ 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=θkk1+Kθ(gzkavehiclesinθkk1)
    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=bkk1+Kb(gzkavehiclesinθkk1)

参数调试建议

  • 通过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. 结果可视化

运行结果

在这里插入图片描述
在这里插入图片描述

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值