【MATLAB例程】三维组合导航,滤波使用EKF,带严格的惯导推算、雅克比求解函数,图像对比滤波前后的速度、位置、姿态

在这里插入图片描述

程序介绍

本程序实现了 三维状态量的扩展卡尔曼滤波(EKF)组合导航仿真,采用严格的15维误差状态模型,状态向量包括:

x = [ p x p y p z v x v y v z ϕ θ ψ b g x b g y b g z b a x b a y b a z ] T x = \begin{bmatrix} p_x & p_y & p_z & v_x & v_y & v_z & \phi & \theta & \psi & b_g^x & b_g^y & b_g^z & b_a^x & b_a^y & b_a^z \end{bmatrix}^T x=[pxpypzvxvyvzϕθψbgxbgybgzbaxbaybaz]T

其中,位置 p p p、速度 v v v、姿态欧拉角 ( ϕ , θ , ψ ) (\phi, \theta, \psi) (ϕ,θ,ψ)、陀螺偏差 b g b_g bg、加速度计偏差 b a b_a ba 构成完整的15维误差状态。

系统建模

  • 过程模型 由IMU观测驱动,采用离散状态转移函数:

p k + 1 = p k + v k Δ t v k + 1 = v k + ( C b n ( f m − b a ) − g ) Δ t Θ k + 1 = Θ k + ( ω m − b g ) Δ t b g , b a  视为随机游走模型 \begin{aligned} p_{k+1} &= p_k + v_k \Delta t \\ v_{k+1} &= v_k + \big(C_{bn}(f_m - b_a) - g\big)\Delta t \\ \Theta_{k+1} &= \Theta_k + (\omega_m - b_g)\Delta t \\ b_g, b_a & \ \text{视为随机游走模型} \end{aligned} pk+1vk+1Θk+1bg,ba=pk+vkΔt=vk+(Cbn(fmba)g)Δt=Θk+(ωmbg)Δt 视为随机游走模型

其中, f m , ω m f_m, \omega_m fm,ωm 分别为测得的加速度与角速度, C b n C_{bn} Cbn 为姿态方向余弦矩阵。

  • 观测模型 来自GNSS,观测量为位置和速度

滤波框架

扩展卡尔曼滤波按以下步骤实现:

  • 预测:

x ^ k ∣ k − 1 = f ( x ^ k − 1 , u k − 1 ) \hat{x}_{k|k-1} = f(\hat{x}_{k-1}, u_{k-1}) x^kk1=f(x^k1,uk1)

P k ∣ k − 1 = F P k − 1 F T + Q P_{k|k-1} = F P_{k-1} F^T + Q Pkk1=FPk1FT+Q

  • 更新:
    若有GNSS观测:

K k = P k ∣ k − 1 H T ( H P k ∣ k − 1 H T + R ) − 1 K_k = P_{k|k-1} H^T (H P_{k|k-1} H^T + R)^{-1} Kk=Pkk1HT(HPkk1HT+R)1

x ^ k = x ^ k ∣ k − 1 + K k ( z k − h ( x ^ k ∣ k − 1 ) ) \hat{x}_{k} = \hat{x}_{k|k-1} + K_k(z_k - h(\hat{x}_{k|k-1})) x^k=x^kk1+Kk(zkh(x^kk1))

P k = ( I − K k H ) P k ∣ k − 1 P_k = (I - K_k H) P_{k|k-1} Pk=(IKkH)Pkk1

其中, F F F H H H 分别为系统雅可比矩阵和观测雅可比矩阵。

仿真设置

  • 真实轨迹为 螺旋上升运动,即圆周运动叠加线性爬升。
  • IMU数据由真实运动加噪声和随机偏差生成。
  • GNSS每秒输出一次位置与速度观测。

性能对比

程序对比了三种轨迹:

  1. 真实轨迹(蓝线)
  2. 纯IMU积分结果(红线)
  3. EKF融合结果(黑线)
    并绘制位置、速度、姿态曲线及误差随时间的变化,计算均方根误差 (RMSE) 作为性能指标。

代码优点

  • 使用严格的 15维误差状态建模,保证了惯导/GNSS组合导航的一致性推导。
  • 包含 状态转移雅可比矩阵观测雅可比矩阵 的显式计算,便于理论分析与扩展。
  • 程序结果直观展示了 EKF在三维导航中的精度改进:有效抑制纯IMU积分的发散,显著降低位置与速度误差。

运行结果

三维轨迹对比:
在这里插入图片描述
各轴速度、位置、姿态对比:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

误差对比:
在这里插入图片描述

MATLAB源代码

部分代码:

% 三维状态量的EKF例程(严格的组合导航推导)
% 基于15维误差状态模型:位置(3)、速度(3)、姿态(3)、陀螺偏差(3)、加速度计偏差(3)
% 作者:matlabfilter
% 2025-08-25/Ver1 

clear; clc; close all;
rng(0); % 固定随机种子

%% 系统参数设置
dt = 0.1;           % 采样时间间隔 (s)
total_time = 100;   % 总仿真时间 (s)
N = total_time / dt; % 采样点数

%% 噪声参数设置
% IMU噪声参数
gyro_noise_std = 0.01 * pi/180;      % 陀螺噪声标准差 (rad/s)
accel_noise_std = 0.001;             % 加速度计噪声标准差 (m/s^2)
gyro_bias_std = 0.001 * pi/180;      % 陀螺偏差标准差 (rad/s)
accel_bias_std = 0.0001;             % 加速度计偏差标准差 (m/s^2)

% GNSS观测噪声
gnss_pos_noise_std = 3;             % GNSS位置噪声标准差 (m)
gnss_vel_noise_std = 0.1;           % GNSS速度噪声标准差 (m/s)

%% 过程噪声协方差矩阵Q (15×15)
% 状态顺序:[位置(3), 速度(3), 姿态(3), 陀螺偏差(3), 加速度计偏差(3)]
Q = zeros(15, 15);
% 位置噪声(通过速度积分产生)
Q(1:3, 1:3) = eye(3) * (accel_noise_std * dt^2 / 2)^2;
% 速度噪声
Q(4:6, 4:6) = eye(3) * (accel_noise_std * dt)^2;
% 姿态噪声
Q(7:9, 7:9) = eye(3) * (gyro_noise_std * dt)^2;
% 陀螺偏差噪声
Q(10:12, 10:12) = eye(3) * (gyro_bias_std * dt)^2;
% 加速度计偏差噪声
Q(13:15, 13:15) = eye(3) * (accel_bias_std * dt)^2;


完整代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MATLAB卡尔曼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值