当前位置: 首页 > news >正文

【PSINS工具箱】MATLAB例程,二维平面上的组合导航,EKF融合速度、位置和IMU数据,4维观测量

在这里插入图片描述

文章目录

  • 关于工具箱
  • 程序简介
    • 代码概述
    • 核心功能与步骤
  • 运行结果
  • MATLAB代码

关于工具箱

本文所述的代码需要基于PSINS工具箱,工具箱的讲解:

  • PSINS初学指导:https://blog.csdn.net/callmeup/article/details/137087932

本文为二维平面上的定位,另有三维的:

  • 【PSINS】以速度和位置作为观测量(即6维观测量)的组合导航滤波,EKF实现,提供可直接运行的MATLAB代码:https://blog.csdn.net/callmeup/article/details/144404734?spm=1011.2415.3001.5331

程序简介

代码概述

本代码实现了一个在二维平面上,采用扩展卡尔曼滤波(EKF)捷联惯性导航系统(SINS)外部观测(模拟GPS位置和DVL速度计) 进行组合导航的完整仿真流程。它使用专业的惯性导航算法工具箱 PSINS,模拟了载体的运动轨迹、IMU传感器误差,并通过EKF算法融合惯性解算结果与外部观测信息,最终对滤波后的导航精度(姿态、速度、位置)进行了详尽的评估和可视化。

核心功能与步骤

代码的执行流程清晰地分为以下几个阶段:

  1. 环境初始化与轨迹生成 (trjsimu)

    • 清理工作区,设置随机数种子以确保结果可重复。
    • 调用 glvspsinstypedef 载入PSINS工具箱的全局常量并定义系统类型。
    • 使用 trjsegmenttrjsimu 函数生成一条复杂的模拟轨迹,包括匀速、加速、左转协调转弯等多种机动动作,并计算出理想的载体姿态、速度、位置(avp)和IMU数据(imu)。
  2. 传感器误差模拟与系统初始化

    • 使用 imuerrset 定义IMU的陀螺仪和加速度计误差参数(零偏、白噪声)。
    • 使用 imuadderr 将上述误差添加到理想IMU数据中,模拟真实传感器输出。
    • 设置初始导航参数的误差 (avperrset),并初始化惯性导航解算 (insinit) 和卡尔曼滤波器 (kfinit)。
  3. 扩展卡尔曼滤波 (EKF) 主循环

    • 时间更新(预测):读取带噪声的IMU数据,通过 insupdate 进行惯性导航解算,推算出最新的姿态、速度和位置。同时,更新EKF的状态转移矩阵和预测协方差矩阵。
    • 量测更新(校正):在固定的时间间隔(例如每秒),模拟GPS接收机提供经纬度观测,DVL提供水平速度观测(在真实值上添加了噪声)。将INS解算出的位置/速度与外部观测值进行比较,得到量测残差,并用EKF公式校正INS的误差状态(包括姿态误差、速度误差、位置误差以及IMU零偏估计)。最后通过 kffeedback 将误差状态反馈给INS,修正其导航结果。
  4. 结果分析与可视化

    • 这是代码非常丰富的部分,它绘制了大量图表来评估EKF的性能:
      • 误差时序图:绘制了航向角、东向/北向速度、纬度/经度随时间变化的误差。
      • 轨迹对比图:将滤波后的估计轨迹与真实轨迹进行对比,清晰展示滤波效果。
      • 累积分布函数图 (CDF):分析速度误差的统计分布。
      • 位置误差热力图:在二维平面上用颜色直观显示不同区域的定位误差大小。
      • 误差统计条形图:计算并显示位置误差的均值、标准差、最大值和均方根误差(RMS)。
      • 性能评估表:在图形和命令行中输出全面的量化指标,如MAE(平均绝对误差)、RMSE(均方根误差)、95%分位数等。

关键技术点:

  • 算法:扩展卡尔曼滤波 (EKF)
  • 模型:15状态误差模型(3个姿态误差、3个速度误差、3个位置误差、3个陀螺零偏、3个加计零偏)
  • 观测值:二维平面上的速度(东向、北向)和位置(纬度、经度)

运行结果

二维轨迹图像:
在这里插入图片描述

航向角误差曲线:
在这里插入图片描述

速度误差时序图:

在这里插入图片描述

位置误差时序图:
在这里插入图片描述

误差统计特性:

在这里插入图片描述

MATLAB代码

部分代码如下:

% 【PSINS】二维平面上的位置、速度为观测的154,滤波方法为EKF
% 作者 :matlabfilter
% 2025-08-20/Ver1
% 清空工作空间,清除命令窗口,关闭所有图形窗口
clear; clc; close all;
rng(0); % 设置随机数种子为0,以确保结果可重复
glvs % 调用全局变量设置
psinstypedef(153); % 设置PSINS类型ts = 0.1;       % sampling interval
avp0 = [[0;0;0]; [0;0;0]; [0;0;0]]; % 初始化avp
traj_ = [];
%% 轨迹设置
seg = trjsegment(traj_, 'init',         0);
seg = trjsegment(seg, 'uniform',      100);
seg = trjsegment(seg, 'accelerate',   10, traj_, 1);
seg = trjsegment(seg, 'uniform',      100);
seg = trjsegment(seg, 'coturnleft',   45, 2, traj_, 4);
seg = trjsegment(seg, 'uniform',      100);
seg = trjsegment(seg, 'coturnleft',   45, 2, traj_, 4);
seg = trjsegment(seg, 'uniform',      100);
seg = trjsegment(seg, 'deaccelerate', 5,  traj_, 2); %2
seg = trjsegment(seg, 'uniform',      100);
% generate, save & plot
trj = trjsimu(avp0, seg.wat, ts, 1);% 初始设置
[nn, ts, nts] = nnts(2, trj.ts); % 获取时间序列的参数
% imuerr = imuerrset(0.03, 100, 0.001, 5); % (注释掉的)设置IMU误差参数
imuerr = imuerrset(8, 14, 0.18, 57); % 设置IMU误差参数
imu = imuadderr(trj.imu, imuerr);  % 对IMU数据添加误差
% imuplot(imu); % (注释掉的)绘制IMU数据% 设置初始姿态误差
davp0 = avperrset(0.1*[1; 1; 1], 0, [1; 1; 3]);%% 速度观测EKF
ins = insinit(avpadderr(trj.avp0, davp0), ts); % 初始化惯性导航系统

完整代码:

如有导航、定位相关的代码定制需求,请通过下方卡片联系作者

http://www.dtcms.com/a/343778.html

相关文章:

  • 如何创建一个Cloudfalare worker项目?
  • 当下一次攻击发生前:微隔离如何守护高敏数据,防范勒索攻击下的数据泄露风险!
  • 【变压器老化仿真】matlab实现变压器老化过程的行为模拟与源码编写
  • 24.解构赋值
  • Qt5 的跨平台开发详细讲解
  • 嘉立创eda元件导出到kicad库以使用
  • Spring Ai 1.0.1中存在的问题:使用MessageChatMemoryAdvisor导致System未被正确的放在首位
  • 拆解本地组策略编辑器 (gpedit.msc) 的界面和功能
  • 相似度、距离
  • 【C++】--函数参数传递:传值与传引用的深度解析
  • C++ csignal库详细使用介绍
  • CXR-LT 2024:一场关于基于胸部X线的长尾、多标签和零样本疾病分类的MICCAI挑战赛|文献速递-深度学习人工智能医疗图像
  • 25年8月通信基础知识补充1:中断概率与遍历容量、Sionna通信系统开源库、各种时延区分
  • 针对pycharm缩进空格报错--解决方法
  • Linux下的网络编程
  • 实用R语言机器学习指南:从数据预处理到模型实战(附配套学习资源)
  • 如何低门槛自制Zigbee 3.0温湿度计?涂鸦上新开发包,开箱即用、完全开源
  • 【软考架构】第6章 数据库基本概念
  • go语言中的select的用法和使用场景
  • Elasticsearch核心概念
  • SQL185 试卷完成数同比2020年的增长率及排名变化
  • C# 简单工厂模式:构建灵活与可扩展的面向对象程序
  • 【实时Linux实战系列】实时气象数据分析系统
  • 【LeetCode题解】LeetCode 287. 寻找重复数
  • SQL184 近三个月未完成试卷数为0的用户完成情况
  • XP系统安装Android Studio 3.5.3并建立Java或Native C++工程,然后在安卓手机上运行
  • 【渲染流水线】[逐片元阶段]-[混合Blend]以UnityURP为例
  • 螺旋槽曲面方程的数学建模与偏导数求解
  • Unreal Engine UProjectileMovementComponent
  • 如何生成网关路由表