【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.pswp.cn/web/94265.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MiMo-VL 技术报告

摘要 我们开源了 MiMo-VL-7B-SFT 和 MiMo-VL-7B-RL 两个强大的视觉语言模型,它们在通用视觉理解和多模态推理方面均展现出最先进的性能。MiMo-VL-7B-RL 在 40 项评估任务中的 35 项上优于 Qwen2.5-VL-7B,并在 OlympiadBench 上获得 59.4 分,超越了参数量高达 780 亿的模型。…

CTFshow Pwn入门 - pwn 19

先看main函数:fclose(_bss_start) fclose(stdout) 关闭了默认fd1的输出,所以system的结果无法直接看到。 思路: 输出重定向。 ls 1>&0 ls >&0 ls >&2 ###三种写法均可将输出重定向到能回显的终端并获得一个新的交互…

Redis(以Django为例,含具体操作步骤)

简介Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),可用作数据库、缓存或消息队列。其核心特点包括:高性能&am…

浏览器解析网址的过程

问题浏览器解析网址的过程我的回答当你在浏览器地址栏输入一个URL(比如www.example.com)并按下回车后,会发生以下一系列步骤:首先,浏览器会解析URL结构,确定要访问的协议、域名和路径。如果你没有输入协议部…

NVIDIA Nsight Systems性能分析工具

* 性能分析 NVIDIA Nsight Systems (推荐): 这是 NVIDIA 官方推荐的更现代、功能更强大的分析工具。 安装 Nsight Systems在 Docker 容器中启动程序:# 确保你在启动容器时挂载了/usr/local/cuda/targets/x86_64-linux/lib/ 和 /usr/local/nvidia/lib64 #…

后台管理系统-14-vue3之tag标签页的实现

文章目录 1 tag静态实现 1.1 CommonTag.vue(el-tag) 1.2 Main.vue(普通组件标签) 2 tag通过pinia管理 2.1 CommonAside.vue(菜单点击事件) 2.2 stores/index.js(selectMenu()和tags) 2.3 CommonTag.vue(计算属性tags) 3 点击tag之后跳转到指定页面 3.1 views/Mail.vue(商品) 3.…

CMake2: CMakeLists.txt的常用命令

参考链接: 爱编程的大丙 | CMake教程 CMakeLists指令以及常用方法 现代 CMake 教程 文章目录1. cmake_minimum_required( )2. project( )3. add_executable( )4. set()5. aux_source_directory( )6. file( )7. include_directories( )8. add_library( )9. link_libraries()与li…

Ansible入门:自动化运维基础

Ansible 基础概念与安装1. 自动化动机 (Motivation for Automation)概念解释: 指为什么要用Ansible等工具来替代手动管理服务器。核心动机包括:效率与速度: 同时在上百甚至上千台服务器上执行任务,秒级完成,远非人工可…

【测试】基于博客系统的测试报告

前言 本篇博客对简易的博客系统做的测试总结一份测试报告,包含功能测试,自动化测试,性能测试 💓 个人主页:zkf ⏩ 文章专栏:测试 若有问题 评论区见📝 🎉欢迎大家点赞👍…

Oracle:配置让插入语句时id自动输入

Oracle:配置让插入语句时id自动输入无需手动指定,核心是利用 序列(Sequence) 或 自增列(Identity Column) 来自动生成唯一值。以下是两种常用方案:方案 1:使用序列(Sequence&#xf…

秒杀服务的回调方案

在秒杀场景中,用户点击“抢购”后,后端需要通过异步处理应对高并发(避免请求阻塞),同时需通过实时回调机制将最终结果(成功/失败)推送给客户端并展示。核心方案是:“前端发起请求→后…

php apache无法接收到Authorization header

Apache 默认不传递 Authorization头到后端环境(如 PHP)。其表现是:print_r($_SERVER)时, 没有 [Authorization] :Array ([Accept-Language] > zh,en;q0.9,zh-CN;q0.8,en-US;q0.7[Accept-Encoding] > gzip, defla…

当我们想用GPU(nlp模型篇)

在个人设备上“把 GPU 真正用起来”做 NLP,分五步:准备 → 安装 → 验证 → 训练/推理 → 踩坑排查。下面每一步都给出可复制命令和常见错误。 ────────────────── 1. 硬件准备 • 一张 NVIDIA GPU,算力 ≥ 6.1&#xff08…

CryptSIPVerifyIndirectData函数分析

可以使用此函数从SIP接口对应的文件中提取签名信息 CryptSIPVerifyIndirectData:将当前文件的哈希结果做为“指纹”,并与从CryptSIPGetSignedDataMsg中提取的签名信息进行比较。 如果哈希结果相同,则意味着当前文件与之前签名的文件相同&…

20250823解决荣品RD-RK3588-MID开发板在充电的时候大概每10s屏幕会像水波纹闪烁一下

20250823解决荣品RD-RK3588-MID开发板在充电的时候大概每10s屏幕会像水波纹闪烁一下 2025/8/23 17:58【结论】:使用直流电源供电,给电池【快速】充电,但是直流电源的电压稳定,电流抖动导致的!那个是2.4G 已经知道了我司…

CANN安装

前提条件 请参考本文档正确安装和使用CANN软件,不建议将CANN安装在共享磁盘后,通过挂载的方式使用CANN,因为CANN对文件系统有文件锁的依赖,部分共享存储不支持文件锁,可能导致任务拉起失败。 root用户和非root用户安装CANN软件包的步骤一致,当前示例步骤以非root用户为例…

docker的基础配置

目录 数据卷 数据卷容器 端口映射与容器互联 互联机制实现便捷互访(基于容器搭建论坛) 数据卷 1.创建数据卷 [rootopenEuler-1 /]# docker volume create test test [rootopenEuler-1 /]# docker volume ls DRIVER VOLUME NAME local test [ro…

VSCode Import Cost:5 分钟学会依赖瘦身

一句话作用:在代码里 import 时,实时显示包大小,帮你一眼揪出体积炸弹。1️⃣ 30 秒安装 & 启动 打开 VSCode → 扩展商店搜索 Import Cost → 安装重启 VSCode,立即生效,零配置。2️⃣ 使用方式(开箱即…

TCP/UDP详解(一)

UDP报文源端口16bit 目的端口16bit校验和checksum16bit 总长度16bit--------------------------------------------------------------------------------------------------------------------------源目端口用于标识应用层协议,分为知名端口&#x…

数据库优化提速(一)之进销存库存管理—仙盟创梦IDE

从存储过程到通用 SQL:进销存系统的数据操作优化在进销存系统的开发与维护中,数据库查询语句的编写方式对系统的性能、兼容性和可维护性有着深远影响。本文将围绕给定的三段 SQL 代码展开,深入探讨将存储过程转换为通用 SQL 在进销存场景下的…