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

【PSINS】EKF、UKF、CKF三个滤波下的组合导航(松组合)对比

在这里插入图片描述

该 MATLAB 代码实现了扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)和无迹卡尔曼滤波的变体(CKF)的对比,主要用于导航与定位领域,通过处理惯性测量单元(IMU)和GPS数据来估计运动轨迹。

文章目录

  • 说明:基于PSINS工具箱的EKF、UKF、CKF对比
    • 主要功能
  • 运行结果
  • 代码

说明:基于PSINS工具箱的EKF、UKF、CKF对比

该 MATLAB 代码实现了扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)和无迹卡尔曼滤波的变体(CKF)的对比,主要用于导航与定位领域,通过处理惯性测量单元(IMU)和GPS数据来估计运动轨迹。

主要功能

  1. 参数初始化

    • 清理工作空间并设置随机数生成器。
    • 定义采样时间间隔和初始的速度、姿态和位置(AVP)信息。
  2. 轨迹设置

    • 通过一系列轨迹段(如匀速、加速、转弯和爬升)来模拟运动轨迹。
    • 使用trjsimu函数生成包含IMU数据的轨迹。
  3. 初始化滤波器

    • 设置IMU误差模型和初始状态误差。
    • 初始化INS(惯性导航系统)和卡尔曼滤波器(KF)。
  4. 扩展卡尔曼滤波(EKF)

    • 在每个时间步中更新INS状态并进行KF更新。
    • 通过模拟GPS位置获取带噪声的观测值,进行观测更新。
    • 记录滤波结果并进行结果展示。
  5. 无迹卡尔曼滤波(UKF)

    • 类似于EKF的过程,但使用UKF算法进行状态更新。
    • 处理IMU数据并用GPS数据进行观测更新,记录滤波结果。
  6. 无迹卡尔曼滤波变体(CKF)

    • 重复UKF的流程,但使用CKF算法进行状态估计。
    • 记录估计的状态和协方差。
  7. 结果可视化

    • 绘制真实轨迹、EKF、UKF和CKF的估计轨迹。
    • 误差比较:绘制不同滤波器在X、Y、Z轴上的位置误差及其累积分布函数(CDF)。
  8. 性能评估

    • 输出各个滤波器在X、Y、Z轴上的最大误差,以量化不同滤波器的性能。

运行结果

轨迹曲线:
在这里插入图片描述
误差曲线:
在这里插入图片描述

代码

部分代码:

% 基于PSINS工具箱的EKF、UKF、CKF对比
% 2024-7-14/Ver1
clear;clc;close all;
rng(0);
glvs
psinstypedef(153);
ts = 0.1;       % sampling interval
%% 轨迹设置
avp0 = [[0;0;0]; [0;0;0]; [0;0;0]]; % init avp
% trajectory segment setting
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, 'climb',        10, 2, traj_, 50);
seg = trjsegment(seg, 'uniform',      100);
seg = trjsegment(seg, 'descent',      10, 2, traj_, 50);
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);
% trjfile('trj10ms.mat', trj);
%% 初始化
% initial settings
[nn, ts, nts] = nnts(2, trj.ts);
imuerr = imuerrset(0.03, 100, 0.001, 5);
imu = imuadderr(trj.imu, imuerr);
davp0 = avperrset([0.5;-0.5;20], 0.1, [1;1;3]);
ins = insinit(avpadderr(trj.avp0,davp0), ts);
% KF filter
rk = poserrset([1;1;3]);
kf = kfinit(ins, davp0, imuerr, rk);
kf.Pmin = [avperrset(0.01,1e-4,0.1); gabias(1e-3, [1,10])].^2;  kf.pconstrain=1;
len = length(imu); [avp_ekf, xkpk] = prealloc(fix(len/nn), 10, 2*kf.n+1);
timebar(nn, len, 'KF'); 
ki = 1;

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


http://www.kler.cn/a/456980.html

相关文章:

  • Postman测试big-event
  • XML解析
  • Python 青铜宝剑十六维,破医疗数智化难关(上)
  • FPGA自学之路:到底有多崎岖?
  • 【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识
  • springboot506基于Springboot的小区疫情购物系统录(论文+源码)_kaic
  • 面向对象的设计原则与设计模式
  • HuggingFace peft LoRA 微调 LLaMA
  • Mysql数据库中,监测某张表中某字段的修改情况(被哪个ip所修改、新老值)
  • InceptionNeXt: When Inception Meets ConvNeXt
  • 不安全物联网的轻量级加密:综述
  • 【最新】宇鹿家政小程序系统v1.1.3高级版源码全开源+搭建环境
  • 太通透了,Android 流程分析 蓝牙enable流程(stack/hidl)
  • 配置vue2项目中组件命名忽略大小写
  • ch.h:38:10:致命错误: rpc/rpc.h:没有那个文件或目录38 I#include <rpc/rpc.h>
  • 【Java基础面试题041】Java中的深拷贝和浅拷贝有什么区别?
  • 解决tomcat双击startup.bat乱码的几种方法
  • 前端+后端之网站部署(Front End and Backend Website Deployment)
  • TCP Analysis Flags 之 TCP Out-Of-Order
  • C++的第一个程序
  • 1228java面经
  • Mybatis插件better-mybatis-generator的下载与使用
  • 为什么深度学习和神经网络要使用 GPU?
  • 数据标注的流程
  • C#中的属性索引器(Indexer)
  • JavaScript 箭头函数