三维状态量的EKF例程(严格的组合导航推导)。基于15维误差状态模型:位置(3)、速度(3)、姿态(3)、陀螺偏差(3)、加速度计偏差(3)。观测量为三维位置(另有三维位置+速度为观测的程序)
程序简介
三维EKF组合导航系统代码结构说明
程序概述
本MATLAB程序实现了一个基于扩展卡尔曼滤波器(EKF)的三维组合导航系统,融合IMU(惯性测量单元)和GNSS(全球导航卫星系统)数据,实现高精度的位置、速度、姿态估计。
代码结构详解
- 初始化部分(第1-20行)
% 基础设置
clear; clc; close all;
rng(0); % 固定随机种子确保结果可重现
- 清理工作空间并固定随机数种子
- 为程序提供可重现的仿真环境
- 系统参数配置(第21-35行)
- 时间参数:采样间隔dt=0.1s,总仿真时间100s
- 噪声参数:定义IMU和GNSS的噪声特性
- 陀螺仪噪声、加速度计噪声
- 传感器偏差参数
- GNSS位置观测噪声
- 协方差矩阵设置(第36-50行)
- 过程噪声矩阵Q:15×15矩阵,描述系统动态噪声
- 观测噪声矩阵R:3×3矩阵,描述GNSS位置观测噪声
- 矩阵按状态顺序分块:位置、速度、姿态、陀螺偏差、加速度计偏差
- 状态向量和数据存储初始化(第51-70行)
- X_true:真实轨迹状态(15×N)
- X_imu:纯IMU积分结果(15×N)
- X_ekf:EKF滤波估计结果(15×N)
- Z:GNSS观测数据(3×N)
- P:初始协方差矩阵
- 轨迹生成和传感器数据模拟(第71-105行)
% 生成螺旋上升运动轨迹
for k = 1:N
% 真实轨迹计算
% IMU数据生成(比力和角速度)
% GNSS观测生成(每1秒更新一次)
end
- 生成螺旋上升运动的真实轨迹
- 模拟IMU传感器输出(加速度和角速度)
- 模拟GNSS观测数据(位置,1Hz更新率)
- 纯IMU积分对比算法(第106-125行)
% 纯IMU积分作为对比基准
for k = 2:N
% 姿态更新
% 速度更新
% 位置更新
% 偏差随机游走
end
- 实现纯IMU积分算法作为对比基准
- 展示未经滤波处理的IMU积分误差累积
- EKF主滤波循环(第126-160行)
for k = 2:N
% 预测步骤
X_pred = state_transition(X_ekf(:, k-1), imu_data(:, k-1), dt);
F = compute_state_jacobian(X_ekf(:, k-1), imu_data(:, k-1), dt);
P_pred = F * P * F' + Q;
% 更新步骤(有GNSS观测时)
if ~isnan(Z(1, k))
% 卡尔曼增益计算
% 状态和协方差更新
end
end
预测步骤:
- 调用状态转移函数进行状态预测
- 计算雅可比矩阵F
- 预测协方差矩阵
更新步骤:
- 检查GNSS观测可用性
- 计算卡尔曼增益
- 更新状态估计和协方差
- 结果可视化(第161-280行)
包含5个主要图表:
-
三维轨迹对比图:展示真实轨迹、IMU积分、EKF估计和GNSS观测
-
位置分量时序图:X、Y、Z三个方向的位置对比
-
速度分量时序图:X、Y、Z三个方向的速度对比
-
位置和速度误差图:量化不同方法的精度
-
姿态角对比图:横滚、俯仰、偏航角的估计效果
-
性能统计输出(第281-290行)
-
核心辅助函数
程序流程总览
初始化 → 参数设置 → 轨迹生成 → 纯IMU积分 → EKF滤波 → 结果可视化 → 性能分析
运行结果
三维轨迹对比图像:
速度、位置、姿态对比图:
误差对比图像:
命令行输出的结果:
完整代码下载链接:
https://download.csdn.net/download/callmeup/91962283
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者