【MATLAB例程,组合导航,平面】CKF(容积卡尔曼滤波)作为融合方法,状态量8维,观测量4维,包含二维平面上的严格的INS推导

124 阅读4分钟

在这里插入图片描述

三维状态量的CKF例程(严格的组合导航推导)基于8维误差状态模型:位置(2)、速度(2)、航向角、航向偏差(1)、加速度计偏差(2)
,基于,4维观测:XY位置(2)+XY速度(2)

文章目录

程序详解

算法概述

本程序实现**容积卡尔曼滤波(CKF)**的二维组合导航:利用 IMU(比力、角速度)进行预测,用 GNSS(位置、速度)进行校正,抑制纯 IMU 积分的漂移,提升位置与速度精度。轨迹为匀速圆周运动,用于对比 CKF、纯 IMU、仅 GNSS 的性能。

状态与观测

  • 状态(8维) :位置X、位置Y、速度X、速度Y、航向角、陀螺零偏、加速度计零偏X、加速度计零偏Y。
  • 观测(4维) :GNSS 的位置X、位置Y、速度X、速度Y(1 Hz 提供,其余时刻缺测)。

关键流程(CKF)

  1. 生成容积点:围绕先验均值和协方差,构造对称的 2n 个容积点。
  2. 状态传播:对每个容积点用 IMU 数据做一次预测更新(姿态由航向角积分,速度用 DCM 将机体系比力旋到导航系后积分,位置由速度积分;零偏按随机游走保持)。
  3. 统计量计算:由传播后的容积点集求预测均值与协方差。
  4. 量测更新:当有 GNSS 时,将容积点映射到观测空间,计算观测均值、新息协方差与交叉协方差,完成卡尔曼更新;无量测则仅用预测值。

噪声与模型

  • 过程噪声 Q:考虑加速度噪声(影响速度与位置)、陀螺噪声(影响航向角)、陀螺零偏与加计零偏的随机游走。
  • 观测噪声 R:GNSS 位置与速度的高斯噪声。
  • 姿态/坐标:仅使用航向角,方向余弦矩阵由航向角生成(二维平面导航)。

输出与评估

  • 绘制:二维轨迹、X/Y 位置曲线、X/Y 速度曲线、位置/速度误差曲线。
  • 统计:对比纯 IMU仅 GNSSCKF 融合的 RMSE。

适配与扩展建议

  • GNSS 失锁/非等时观测:已用 NaN 占位,CKF 自动“只预测”。
  • 模型扩展:可加入重力、外部力或一阶马尔可夫零偏(非纯随机游走)。
  • 参数整定:先调 R(贴合 GNSS 噪声),再按漂移量级调 Q(尤其零偏项)。

运行结果

轨迹对比图像:
在这里插入图片描述
位移曲线对比:
在这里插入图片描述

速度曲线对比:
在这里插入图片描述
误差曲线对比:
在这里插入图片描述

命令行输出的结果:
在这里插入图片描述

MATLAB源代码

部分代码如下:

% 三维状态量的CKF例程(严格的组合导航推导),84
% 基于8维误差状态模型:位置(2)、速度(2)、航向角、航向偏差(1)、加速度计偏差(2)
% 基于4维观测:XY位置(2)+XY速度(2)
% 容积卡尔曼滤波器(Cubature Kalman Filter)实现
% 作者:matlabfilter
% 2025-08-30/Ver1

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

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

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

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

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

%% 观测噪声协方差矩阵R (4×4)