【MATLAB例程】三维组合导航仿真(使用UKF),误差状态模型:位置+速度+姿态+陀螺偏差+加速度计偏差

在这里插入图片描述

三维状态量的 U K F UKF UKF例程(严格的组合导航推导)使用基于15维误差状态模型:位置(3)、速度(3)、姿态(3)、陀螺偏差(3)、加速度计偏差(3);6维的观测量:位置(3)、速度(3)

程序简介

程序实现了三维状态量的无迹卡尔曼滤波(UKF)组合导航仿真,其核心思想是通过 IMU(加速度计 + 陀螺仪)的高频积分来推算运动轨迹,同时借助 GNSS 的低频观测进行修正,从而获得更加稳定和准确的定位与姿态解算结果。

主要特点和流程如下:

状态建模

  • 状态维度为 15维误差状态模型, 分别表示三维位置、速度、姿态(欧拉角)、陀螺偏差和加速度计偏差。

  • 系统过程噪声协方差矩阵 Q 和观测噪声协方差矩阵 R 由 IMU 与 GNSS 噪声特性推导而来。

真实轨迹与传感器数据生成

  • 模拟对象运动为 三维螺旋上升轨迹(圆周运动 + 匀速上升)。
  • IMU数据:由真实轨迹计算比力与角速度,再加入噪声与偏差。
  • GNSS观测:每秒提供一次三维位置与速度观测,其余时刻缺省。更新频率可以更改

纯IMU积分解算

作为对比基线,仅利用IMU数据进行姿态、速度和位置更新。由于误差累计,积分结果会逐渐漂移。

UKF滤波流程

UKF 使用无迹变换传播非线性系统:

  1. 生成 Sigma 点
  2. 预测步骤:将 Sigma 点输入到非线性状态转移函数中,得到预测状态与协方差。
  3. 更新步骤:若有 GNSS 观测,则通过观测模型修正预测值,计算卡尔曼增益更新状态;否则保持预测值。

结果与对比

  • 程序绘制了 三维轨迹、位置曲线、速度曲线、姿态角变化 等对比图。
  • 给出了 位置、速度和姿态误差的 RMSE 统计,验证 UKF 相比纯IMU积分显著降低漂移误差。

运行结果

三轴轨迹对比:
在这里插入图片描述
各轴位置和速度变化曲线:
在这里插入图片描述

在这里插入图片描述
三维空间中的位置误差、速度误差变化曲线:
在这里插入图片描述

MATLAB源代码

完整代码如下:

% 三维状态量的UKF例程(严格的组合导航推导)
% 基于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 = 0.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;

%% 观测噪声协方差矩阵R (6×6)
% 观测量:GNSS位置(3) + GNSS速度(3)
R = zeros(6, 6);
R(1:3, 1:3) = eye(3) * gnss_pos_noise_std^2;
R(4:6, 4:6) = eye(3) * gnss_vel_noise_std^2;

%% 初始化
% 真实轨迹参数(螺旋上升运动)
radius = 50;        % 水平圆形轨迹半径 (m)
angular_vel = 0.1;  % 角速度 (rad/s)
climb_rate = 0.5;   % 上升速率 (m/s)

完整代码的下载链接:
https://download.csdn.net/download/callmeup/91756830

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MATLAB卡尔曼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值