【滤波跟踪】基于不变扩展卡尔曼滤波器对装有惯性导航系统和全球定位系统IMU+GPS进行滤波跟踪附matlab代码

news2025/7/31 21:28:06

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测 雷达通信  无线传感器

信号处理 图像处理 路径规划 元胞自动机 无人机  电力系统

⛄ 内容介绍

惯性导航系统(INS)具有完全自主性,但其导航定位精度随时间下降,因而难以长时间独立工作;全球定位系统(GPS)是全球实时高精度的导航系统,但GPS受制于人且信号易受到干扰;GPS/INS组合导航系统克服了各自缺点且组合后的导航精度高于两个系统单独工作的精度.但当GPS/INS组合系统应用到"城市峡谷"地域时,由于信号受遮挡等原因,使得GPS无法提供足够并且稳定的定位精度来修正INS的误差.此外,目前在地表以下(如城市地铁)还不能使用GPS定位技术.INS/GPS/伪卫星(PLS)组合系统是解决这些问题的一条有效途径:采用伪卫星定位技术能够增加卫星可见星的数目并改善其几何图形分布,提高导航系统的定位精度和可靠性

⛄ 部分代码

clear; close all;

addpath('filters');

addpath('helper');

addpath('thirdparty/shadedErrorBar');

% Load / process data

[T_X, omega, accel, accel_b, T_GPS, XYZ_GPS] = loadPoseGPS();

test_N = length(omega); % Sets the number of IMU readings

w = omega(1:test_N,:);

a = accel(1:test_N,:);

b_g = zeros(test_N,3);

b_a = accel_b(1:test_N,:);

t_x = T_X(1:test_N,:);

meas_used = T_GPS <= t_x(end);

t_gps = T_GPS(meas_used,:);

xyz_gps = XYZ_GPS(meas_used,:); 

% -------------------------------------------------------------------------

% Initialize filter

skew = @(u) [0 -u(3) u(2);

        u(3) 0 -u(1);

        -u(2) u(1) 0];

ekf = EKF();

inekf = LIEKF();

% Get first observation that happens after a prediction

obsid = 1;

while(t_gps(obsid) < t_x(1))

    obsid = obsid + 1;

end

pos_ekf = zeros(3,test_N);

pos_inekf = zeros(3,test_N);

std_ekf = zeros(3,test_N);

std_inekf = zeros(3,test_N);

for i = 2:test_N

    if i == 1

        dt = t_x; 

    else

        dt = t_x(i) - t_x(i - 1);

        

        %Assume gyro/IMU are basically synchronous

        ekf.prediction(w(i,:)',a(i,:)',dt);

        inekf.prediction(w(i,:)',a(i,:)',dt);

        

        

        %Measurement update

        if(i < test_N)

            if(t_gps(obsid) > t_x(i) && t_x(i+1) > t_gps(obsid))

                gps = [xyz_gps(obsid,1); xyz_gps(obsid,2); xyz_gps(obsid,3)];

                ekf.correction(gps);

                inekf.correction(gps);

                obsid = min(obsid + 1, length(t_gps));

            end

        end

        

        lieTocartesian(inekf)

        

        pos_ekf(:,i) = ekf.mu(1:3);

        variances = sqrt(diag(ekf.Sigma));

        std_ekf(:,i) = Log(eul2rotm(ekf.mu(1:3)'));

        

        pos_inekf(:,i) = inekf.mu(1:3,5);

        vars = sqrt(diag(inekf.sigma_cart));

        std_inekf(:,i) = vars(7:9);

        

        if(mod(i,1000)==0)

           fprintf('Iteration: %d/%d\n',i,test_N); 

        end

    end

end

meas_used = T_GPS <= t_x(end);

% load gt

[~, ~, ~, ~, ~, x_gt, ~, y_gt, ~, z_gt] = loadGroundTruthAGL();

x_gt = x_gt - x_gt(1); y_gt = y_gt - y_gt(1); z_gt = z_gt - z_gt(1);

t_gt = linspace(0,T_X(end),length(x_gt));

% -------------------------------------------------------------------------

% traj plot

figure('DefaultAxesFontSize',14)

hold on;

plot3(XYZ_GPS(:,1), XYZ_GPS(:,2), XYZ_GPS(:,3),'b','LineWidth', 2);

plot3(x_gt, y_gt, z_gt,'--k','LineWidth', 4);

plot3(pos_ekf(1,:), pos_ekf(2,:), pos_ekf(3,:),'g','LineWidth', 2);

plot3(pos_inekf(1,:), pos_inekf(2,:), pos_inekf(3,:),'r','LineWidth', 2);

legend('gps', 'gt', 'EKF', 'InEKF', 'location', 'southeast')

hold off;

axis equal;

figure('DefaultAxesFontSize',14)

hold on;

plot3(XYZ_GPS(:,1), XYZ_GPS(:,2), XYZ_GPS(:,3),'b','LineWidth', 2);

plot3(x_gt, y_gt, z_gt,'--k','LineWidth', 4);

plot3(pos_inekf(1,:), pos_inekf(2,:), pos_inekf(3,:),'r','LineWidth', 2);

legend('gps', 'gt', 'InEKF', 'location', 'southeast')

hold off;

axis equal;

% -------------------------------------------------------------------------

% axis plot

figure;

subplot(3,1,1);

hold on;

plot(t_gps, XYZ_GPS(meas_used,1), 'b', 'LineWidth', 1);

plot(t_gt, x_gt, 'k--', 'LineWidth', 2);

shadedErrorBar(T_X(1:test_N), pos_ekf(1,:), 3*std_ekf(1,:), 'lineProps', {'g', 'LineWidth', 1})

shadedErrorBar(T_X(1:test_N), pos_inekf(1,:), 3*std_inekf(1,:), 'lineProps', {'r', 'LineWidth', 1})

legend('X_{GPS}','X_{GT}','X_{EKF}', 'X_{InEKF}', 'Location', 'eastoutside');

axis([0,T_X(test_N),-200,200])

%

subplot(3,1,2);

hold on;

plot(t_gps, XYZ_GPS(meas_used,2), 'b', 'LineWidth', 1);

plot(t_gt, y_gt, 'k--', 'LineWidth', 2);

shadedErrorBar(T_X(1:test_N), pos_ekf(2,:), 3*std_ekf(2,:), 'lineProps', {'g', 'LineWidth', 1})

shadedErrorBar(T_X(1:test_N), pos_inekf(2,:), 3*std_inekf(2,:), 'lineProps', {'r', 'LineWidth', 1})

legend('Y_{GPS}','Y_{GT}','Y_{EKF}', 'Y_{InEKF}', 'Location', 'eastoutside');

axis([0,T_X(test_N),-250,350])

%

subplot(3,1,3);

hold on;

plot(t_gps, XYZ_GPS(meas_used,3), 'b', 'LineWidth', 1);

plot(t_gt, z_gt, 'k--', 'LineWidth', 2);

shadedErrorBar(T_X(1:test_N), pos_ekf(3,:), 3*std_ekf(3,:), 'lineProps', {'g', 'LineWidth', 1})

shadedErrorBar(T_X(1:test_N), pos_inekf(3,:), 3*std_inekf(3,:), 'lineProps', {'r', 'LineWidth', 1})

legend('Z_{GPS}','Z_{GT}','Z_{EKF}', 'Z_{InEKF}', 'Location', 'eastoutside');

axis([0,T_X(test_N),-30,60])

function u = unskew(ux)

    u(1,1) = -ux(2,3);

    u(2,1) = ux(1,3);

    u(3,1) = -ux(1,2);

end

function w = Log(R)

    w = unskew(logm(R));

end

⛄ 运行结果

⛄ 参考文献

[1]罗汶锋. 基于自适应簇的卡尔曼滤波定位跟踪算法[D]. 华南理工大学.

❤️ 关注我领取海量matlab电子书和数学建模资料

❤️部分理论引用网络文献,若有侵权联系博主删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16181.html

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

相关文章

核苷酸类化合物库 脂类化合物库参与细胞调控

核苷及核苷酸是机体内的一种重要的内源物质&#xff0c;参与细胞的多种生命进程&#xff0c;如 DNA 和 RNA 合成&#xff0c;信号转导及代谢等。核苷及核苷酸类似物是人工合成的&#xff0c;经过一定化学修饰的物质&#xff0c;可以模拟机体内核苷及核苷酸&#xff0c;参与细胞…

Git合并出现MERGING有效解决方法

Git合并出现MERGING有效解决方法错误描述解决办法参考链接错误描述 我在操作git合并时候意外出现了MERGING&#xff0c;很懵逼&#xff0c;如图所示&#xff1a; 遇到这个问题也是很头疼了&#xff0c;百度了很多方法有说是&#xff1a;“在命令行输入&#xff1a;git reset …

“以赛助教”进校园,CCF大数据与计算智能大赛成高校人才探索实践AI技术的第二课堂!

随着第十届CCF大数据与计算智能大赛&#xff08;简称2022 CCF BDCI&#xff09;的报名通道关闭、《大咖说系列专题报告》收官&#xff0c;“以赛助教”系列活动也正式宣告结束。 CCF大数据与计算智能大赛&#xff08;CCF BDCI&#xff09;由中国计算机学会于2013年创办&#x…

verilog 流水线控制

文章目录Verilog 流水线控制1、关键问题、实现方式及其对比2、实现方式2.1、控流水线输入&#xff1a;根据每一拍的 din_en_d* 打拍&#xff0c;没有最终的 else block2.2、控流水线输入&#xff1a;根据每一拍的 din_en_d* 打拍&#xff0c;有最终的 else block2.3、控流水线每…

真香!宝藏学习方式还可以这样,家人们绝不能错过

文 / 谷雨&#xff08;微信公众号&#xff1a;王不留&#xff09; 《谷雨&#xff1a;告诉大家一个小秘密》一文&#xff0c;辛苦码字半夜&#xff0c;阅读量却扑街&#xff0c;我想根本原因是标题名字起得太差。 前几天看了一个不知真假的截屏&#xff0c;说到小红书上的关键词…

Linux挂载Windows端NFS服务(实现板端Linux与PC互传文件)

Linux挂载Windows端NFS服务&#xff08;实现板端Linux与PC互传文件&#xff09; 1. kernel编译时打开NFS客户端服务 在宿主机打开kernel文件夹&#xff0c;先make clean&#xff0c;然后make menuconfig&#xff0c;进入配置界面&#xff1a; 使用/查找NFS&#xff0c;找到Ne…

终于有阿里P8从开发、运维两个角度总结出了Redis实战手册

从开发、运维两个角度总结了Redis实战经验&#xff0c;深入浅出地剖析底层实现&#xff0c;包含大规模集群开发与运维的实际案例、应用技巧。 前言Redis作为基于键值对的NoSQL数据库&#xff0c;具有高性能、丰富的数据结构、持久化、高可用、分布式等特性&#xff0c;同时Redi…

Windows10安装Docker(基于WSL2,包含WSL2安装教程)

WSL2 wsl是windows自带的功能&#xff0c;只需要开启Windows功能即可安装子系统 可以通过以下命令获取发行版名字 wsl --list --online通过以下命令安装 wsl --install -d ${发行版名字} 如 wsl --install -d Ubuntu-20.04安装后会弹出来子系统设置用户名密码 运行以下命令…

matlab解下列微分方程

解下列微分方程 &#xff08;1&#xff09;ydsolve(‘Dyxy’,‘y(0)1’,‘x’) y -x-12exp(x) x[1 2 3] x 1 2 3 -x-12exp(x) ans 3.4366 11.7781 36.1711 &#xff08;2&#xff09;x’2x3y,y’2xy,x(0)-2,y(0)2.8,0<t<10,做相平面图 新建M函数 function dyweifen1(…

d盘不见了怎么恢复?数据恢复,一键操作

d盘是我们日常生活中常用的一种硬盘&#xff0c;平时我们会用到 d盘来存储我们平时要用到的文件资料&#xff0c;如文档、图片、视频等。而由于我们日常使用它时都是在 Windows系统下&#xff0c;所以就很容易忽略 d盘的重要性了。当遇到 d盘不见的情况&#xff0c; d盘不见了怎…

php宝塔部署实战ptcms小说管理系统源码带采集规则

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 有个朋友发消息跟我说&#xff0c;他下载了一套ptcms的小说系统&#xff0c;在搭建的时候一直部署不好&#xff0c;这套系统还带有采集功能的&#xff0c;让我帮他看看&#xff0c;我抽空看了并测试了一下&#x…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-梯度下降求解逻辑回归

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 我们以最著名也最常用的梯度下降法为例。 现在有一个带两个特征并且没有截距的逻辑回归y(x1,x2)y(x_{1},x_{2})y(x1​,x2​)&#xff0c;两个特征…

【java】 对命名规范的思考——VO,BO,PO,DO,DTO是什么

作为Java开发人员免要接触VO&#xff0c;BO&#xff0c;PO&#xff0c;DO&#xff0c;DTO&#xff0c;但很多朋友对这些概念一直以来都是云里雾里&#xff0c;本来是规范性的东西&#xff0c;使用起来却反而导致更加混乱了。先附上我自己常用的命名习惯&#xff1a; 数据对象&…

IVIF:multi-scale densenet

UNFusion: A unified multi-scale densely connected network for infrared and visible image fusion &#xff08;UNFusion: 用于红外和可见光图像融合的统一多尺度密集连接网络&#xff09; 大多数基于深度学习的方法主要侧重于卷积操作来提取局部特征&#xff0c;但没有充…

推荐系统最通俗介绍

文章目录1.推荐系统概念2.推荐系统发展历史3.个性化推荐系统框架4.部分案例4.1 搜狐视频个性化推荐架构4.2 今日头条推荐系统架构4.3 Netflix推荐系统架构图5. 视频推荐系统流程设计总结资料整理&#xff0c;来源于北大刘宏志教授讲座内容。 在介绍推荐系统前&#xff0c;我们先…

【目标检测】池化层(pooling)的反向传播是怎么实现的

目录&#xff1a;池化层的反向传播是怎么实现的一、前言二、平均池化二、最大池化四、最大池化的数学原理一、前言 卷积神经网络中一个不可导的环节就是Pooling池化操作&#xff0c;因为Pooling池化操作使得feature map的尺寸发生变化&#xff0c;假如做222\times 222的池化&a…

一.node的事件处理;二.node的全局对象;三.node的readline模块;四.node的Web编程

目录 一.node的事件处理 1.node采用的事件驱动模式来进行事件处理的&#xff1a;只有当事件被触发时才执行相关程序 2.node是单线程运行的&#xff1a;采用事件轮询方式&#xff0c;不断的查询事件队列中的消息&#xff0c;然后根据消息执行对应的回调函数 3.node事件机制中…

硬核Vue3响应式原理解析,为你保驾护航渡过寒冬

前言 大家好&#xff0c;我是落叶小小少年&#xff0c;虽然比较菜&#xff0c;虽然才开始写作分享&#xff0c;我始终相信 核心demo更容易理解深的技术点每一次基础的学习都是对知识的巩固 因为从年初就开始使用Vue3了&#xff0c;现在才来学习Vue3&#xff0c;但是也不算晚…

yolo5 训练无人人机识别系统

环境搭建&#xff1a; 安装驱动 点击鼠标右键&#xff0c;如果出现NVIDIA图标&#xff0c;点开&#xff0c;出现如下图片 我的显卡是1650&#xff0c;根据显卡的型号去官网找相应的驱动下载就好了。驱动官网 安装好之后&#xff0c;打开命令行cmd&#xff0c;输入如下指令&a…

登录功能(基于SpringBoot+MP+Vue实现的功能)

目录 前言 一、UserMapper层代码分析 二、UserService层代码分析 1.UserService接口 2.UserServiceImpl实现类 3.UserController层代码分析 4.拦截器设置 5.展示效果图 总结 前言 登录功能是web开发中常见的功能&#xff0c;也是学后端必须要练得一个功能&#xff0c;本…