多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)

news2025/4/27 6:37:55

 🍒🍒🍒欢迎关注🌈🌈🌈

📝个人主页:我爱Matlab


👍点赞➕评论➕收藏 == 养成习惯(一键三连)🌻🌻🌻

🍌希望大家多多支持🍓~一起加油 🤗

💬语录:将来的我一定会感谢现在奋斗的自己!

🍁🥬🕒摘要🕒🥬🍁

多旋翼无人机已被广泛应用于军事与民用领域。导航系统是多旋翼无人机的重要组成部分,是其实现安全与稳定飞行的基础。采用INS/GPS组合导航系统可实现高精度导航,该组合导航系统具有优势互补、导航机构冗余的特点,其实质是一个多传感器导航信息优化处理系统。无人机的主要导航参数就是依靠多传感器信息融合获得的,因此信息融合技术是组合导航系统的关键技术,目前已成为国内外学者研究的热点问题。随着多旋翼无人机向自主化和智能化发展,多旋翼无人机对其自身导航系统的性能提出了更高的要求。但是受多旋翼无人机自身成本的制约,导航系统中选用的传感器精度较低。针对这一矛盾,本文提出将无人机自带的微型惯导系统与GPS通过信息融合技术相结合,构成INS/GPS组合导航系统,由此能够提升导航系统的整体性能。本文的研究工作围绕组合导航系统的设计展开。除此之外,本文以课题组自行研制的全新结构多旋翼小型无人机为研究平台,展开对机载多传感器组合导航系统信息融合这一关键技术的研究。

✨🔎⚡运行结果⚡🔎✨

 

 

 

 

 

 

 

 

 

 

 

 

💂♨️👨‍🎓Matlab代码👨‍🎓♨️💂

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Description:
%   SINS/GPS Intergration Navigation System test version 2.0
%   Indirect kalman filter(反馈校正法)
%


close all
clear
clc

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% load Uav true trajectory data.
addpath UavTrajectorySim;

disp(' ')
disp('Available UAV Truth Trajectory Data Files:')
dir_mat_files = dir('UavTrajectorySim\*.mat');
for nFile=1:length(dir_mat_files)
    fprintf('   %d: %s\n',nFile,dir_mat_files(nFile).name);
end
% nFileChoice = input('Choose a UAV Truth data file (e.g. 1<Enter>): ');
try
%     load(dir_mat_files(nFileChoice).name)
    load(dir_mat_files(1).name)
catch
    error('Selected UAV Truth Trajectory data file (%d) is invalid.\n',nFileChoice);
end

gvar_earth;

% 单次更新中使用的子样数
nn = 2;
% 采样时间
ts = 0.01;
nts = nn*ts;


% 初始姿态、速度、位置
att0 = [0, 0, 90]'*arcdeg;
vn0  = [0, 0, 0]';
pos0 = [34*arcdeg, 108*arcdeg, 100]'; % lattitude, longtitude, height
qbn0 = a2qua(att0);


% 姿态四元数、速度、位置
qbn = qbn0;
vn = vn0;
pos = pos0;

eth = earth(pos, vn);


% *** 添加误差 *** 
% 失准角
phi = [0.1, 0.2, 1]'*arcmin;
qbn = qaddphi(qbn, phi);

% 陀螺零偏,角度随机游走
eb_ref = [0.1, 0.15, 0.2]'*dph;
eb = [0.01, 0.015, 0.02]'*dph;
web = [0.001, 0.001, 0.001]'*dpsh;

% 加计零偏,速度随机游走
db_ref = [800, 900, 1000]'*ug;
db = [80, 90, 100]'*ug;
wdb = [1, 1, 1]'*ugpsHz;

Qk = diag([web', wdb', zeros(1, 9)]')^2*nts;

rk = [[0.1, 0.1, 0.1], [5/Re, 5/Re, 5]]';
Rk = diag(rk)^2;

% 协方差矩阵,x = [phi, delta_vn, delta_p, eb, db]
P0 = diag([[0.1, 0.1, 10]*arcdeg, [1, 1, 1], [10/Re, 10/Re, 10]...
           [0.1, 0.1, 0.1]*dph, [80, 90, 100]*ug]')^2;

% 量测矩阵
Hk = [zeros(6,3), eye(6), zeros(6, 6)];

% Kalman filter initialization
kf = kfinit(Qk, Rk, P0, zeros(15), Hk);

% 与模拟轨迹时长一致
kTime = fix(t_SD/ts);   
err = zeros(kTime, 10);
xkpk = zeros(kTime, 2*kf.n + 1);

pos_ref = zeros(kTime,3);
pos_est = zeros(kTime,3);
pos_gps = zeros(kTime,3);

kk = 1;
t = 0;
for k = 2 : nn : kTime
    t = t + nts;
    
    % 获取模拟轨迹对应的imu输出: 角增量和速度增量(参考值)
    wm(1:nn,:) = imu_SD.wm(k-nn+1:k,:);
    vm(1:nn,:) = imu_SD.vm(k-nn+1:k,:);
    
    % 为IMU参考输出添加噪声
    [wm1, vm1] = imuadderr(wm, vm, eb, web, db, wdb, ts);
    
    % 惯导更新:姿态四元数、速度、位置 
    [qbn, vn, pos, eth] = insupdate(qbn, vn, pos, wm1, vm1, ts);
    
    % 基于模型预测:导航误差系统模型卡尔曼滤波
    kf.Phikk_1 = eye(15) + kfft15(eth, q2mat(qbn), sum(vm1, 1)'/nts)*nts;
    kf = kfupdate(kf);
    
    % 模拟GPS量测数据
    gps = [avp_SD.vn(k,:)'; avp_SD.pos(k,:)'] + rk.*randn(6, 1);
    pos_gps(kk,:) = gps(4:6)';
    % 量测更新 5Hz
    if mod(t, 0.2) < nts
        Zk = [vn', pos']' - gps;
        kf = kfupdate(kf, Zk, 'M');
    end
    
    % Indirect Kalman filter:feedback to IMU (反馈校正法)
    qbn = qdelphi(qbn, kf.Xk(1:3));
    vn  = vn - kf.Xk(4:6);
    pos = pos - kf.Xk(7:9);
    pos_est(kk,:) = pos';
    % 反馈校正:由于反馈项的存在导致卡尔曼滤波的先验估计值始终为零. Ref: 王辰熙
    kf.Xk(1:3) = 0;
    kf.Xk(4:6) = 0;
    kf.Xk(7:9) = 0;
%     kf.Xk(10:12) = 0;
%     kf.Xk(13:15) = 0;
    
        
    % compute the error between estimation & truth data 
    % Note that this 'error' is not the 'state vector' in the Kalman equ. 
    % In indirect kalman filter, the 'state vector' means the error of 
    % the IMU update (respect to True data.)
    qbn_ref = a2qua(avp_SD.att(k,:));
    vn_ref = avp_SD.vn(k,:)';
    pos_ref(kk,:) = avp_SD.pos(k,:);
    err(kk, :) = [qq2phi(qbn, qbn_ref)', (vn - vn_ref)', (pos - pos_ref(kk,:)')', t];
    xkpk(kk, :) = [kf.Xk', diag(kf.Pk)', t]';
    
    kk = kk + 1;
    
%     % 程序运行时显示当前进度
%     if mod(t, 50) == 0
% %         disp(fix(t));
%         disp('...');
%     end

end

% 为了让err有足够的空间,在初始化时我们将其长度设置为len。由于采用多子样算
% 法或者别的某些缘故,err通常“装不满”,该操作便是为了把多余的0拿掉。
err(kk:end, :) = [];
xkpk(kk:end, :) = [];
pos_ref(kk:end,:) = [];
pos_est(kk:end,:) = [];
pos_gps(kk:end,:) = [];
tt = err(:, end);

%% 以下是绘图程序
figure;
subplot(3,3,[1,4]);  
% 横轴是经度Lontitu,纵轴是纬度Latitude
plot(pos_gps(:,2)/arcdeg,pos_gps(:,1)/arcdeg, 'dg','LineWidth',0.1); hold on;
plot(pos_est(:,2)/arcdeg,pos_est(:,1)/arcdeg, 'r','LineWidth',4); hold on;
plot(pos_ref(:,2)/arcdeg,pos_ref(:,1)/arcdeg, 'b','LineWidth',1); hold on;
plot(pos_ref(1,2)/arcdeg,pos_ref(1,1)/arcdeg, 'oc','LineWidth',4);
% axis equal;
grid on;
xlabel('\it\lambda\rm /(\circ)');
ylabel('\itL\rm /(\circ)');
legend('GPS meas.','Est. pos.','True pos.', 'Start');
title('UAV Position')

subplot(3,3,2);
plot(tt, err(:, 1:2)/arcdeg);
grid on;
axis tight;
xlabel('t/s');
ylabel('\it\phi\rm/(\circ)');
legend('\it\phi\rm_E', '\it\phi\rm_N');
title('Pitch & Roll Est. error')

subplot(3,3,3);
plot(tt, err(:, 3)/arcdeg);
grid on;
axis tight;
% ylim([-10,10])
xlabel('t/s');
ylabel('\it\phi\rm_U\rm/(\circ)');
legend('\it\phi\rm_U');
title('Yaw Est. error')

subplot(3,3,5);
plot(tt, err(:, 4:6));
grid on;
axis tight;
xlabel('t/s');
ylabel('\delta\itv^n\rm/(m.s^{-1})');
legend('\delta\itv\rm_E', '\delta\itv\rm_N', '\delta\itv\rm_U');
title('Velocity Est. error')

subplot(3,3,6);
plot(tt, [err(:, 7)*Re, err(:, 8)*Re*cos(pos(1)), err(:, 9)]);
grid on;
axis tight;
ylim([-10,10]); 
xlabel('t/s');
ylabel('\delta\itp\rm/m');
legend('\delta\itL', '\delta\it\lambda', '\delta\ith');
title('Position Est. error')


subplot(3,3,7);  
plot(tt,pos_gps(:,3), ':g','LineWidth',0.1); hold on;
plot(tt,pos_est(:,3), 'r','LineWidth',2); hold on;
plot(tt,pos_ref(:,3), 'b','LineWidth',1); 
grid on;
axis tight;
xlabel('t/s');
ylabel('\ith\rm /(m)');
legend('GPS meas.','Est. Alt.','True Alt.');
title('UAV Altitude')

subplot(3,3,8);
plot(tt, xkpk(:, 10:12)/dph);
grid on;
axis tight;
xlabel('t/s');
ylabel('\it\epsilon\rm/(\circ.h^{-1})');
legend('\it\epsilon_x', '\it\epsilon_y', '\it\epsilon_z');
title('Gyro biases')

subplot(3,3,9);
plot(tt, xkpk(:, 13:15)/ug);
grid on;
axis tight;
xlabel('t/s');
ylabel('\it\nabla\rm/\mu\itg');
legend('\it\nabla_x', '\it\nabla_y', '\it\nabla_z');
title('Accelerometer biases')

% 均方误差收敛图
spk = sqrt(xkpk(:, 16:end-1 ));

msplot(321, tt, spk(:, 1:2)/arcdeg, '\it\phi\rm/(\circ)');
legend('\it\phi\rm_E', '\it\phi\rm_N');

msplot(322, tt, spk(:, 3)/arcdeg, '\it\phi\rm_U\rm/(\circ)');
legend('\it\phi\rm_U');

msplot(323, tt, spk(:, 4:6), '\delta\itv^n\rm/(m.s^{-1})');
legend('\delta\itv\rm_E', '\delta\itv\rm_N', '\delta\itv\rm_U');

msplot(324, tt, [spk(:, 7)*Re, spk(:, 8)*Re*pos(1), spk(:, 9)],...
       '\delta\itp\rm/m');
legend('\delta\itL', '\delta\it\lambda', '\delta\ith');

msplot(325, tt, spk(:, 10:12)/dph, '\it\epsilon\rm/(\circ.h^{-1})');
legend('\it\epsilon_x', '\it\epsilon_y', '\it\epsilon_z');

msplot(326, tt, spk(:, 13:15)/ug, '\it\nabla\rm/\mu\itg');
legend('\it\nabla_x', '\it\nabla_y', '\it\nabla_z');

% 三维轨迹
figure(3)
plot3(pos_gps(:,2)/arcdeg, pos_gps(:,1)/arcdeg, pos_gps(:,3), ':g','LineWidth',0.1); hold on;
plot3(pos_ref(:,2)/arcdeg, pos_ref(:,1)/arcdeg, pos_ref(:,3),'b','LineWidth',2); hold on;
plot3(pos_est(:,2)/arcdeg, pos_est(:,1)/arcdeg, pos_est(:,3),'r','LineWidth',3); hold on;
plot3(pos_ref(1,2)/arcdeg, pos_ref(1,1)/arcdeg, pos_ref(1,3),'oc','LineWidth',10);
xlabel('\it\lambda\rm /(\circ)');
ylabel('\itL\rm /(\circ)');
zlabel('\ith\rm /(m)')
legend('GPS meas.','True pos.','Est. pos.','start')
grid on;
title('3D Trajectory')

 

完整代码:多旋翼无人机组合导航系统-多源信息融合算法

📜📢🌈参考文献🌈📢📜

[1]刘洪剑,王耀南,谭建豪,李树帅,钟杭.一种旋翼无人机组合导航系统设计及应用[J].传感技术学报,2017,30(02):331-336.

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

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

相关文章

GLAD:利用全息图实现加密和解密

概述 全息图能够通过两束相干光相干叠加获得。用其中一束光照射生成的全息图就可以得到另一束相干光&#xff0c;这样全息图就可以用作加密/解密的装置了。 系统描述 在本例中一个复杂的随机图样作为参考光源&#xff0c;用来恢复全息图样对应的物光源。加密过程中&am…

单目标应用:人工兔优化算法(Artificial Rabbits Optimization ,ARO)求解旅行商问题TSP(提供MATLAB代码)

一、算法简介 人工兔优化算法&#xff08;Artificial Rabbits Optimization &#xff0c;ARO&#xff09;由Liying Wang等人于2022年提出&#xff0c;该算法模拟了兔子的生存策略&#xff0c;包括绕道觅食和随机躲藏&#xff0c;并通过能量收缩在两种策略之间转换。绕道觅食策…

显示订单列表【项目 商城】

显示订单列表【项目 商城】前言显示订单列表1 持久层1.1 规划SQL语句1.2 实现接口与抽象方法1.3 配置SQL映射测试2 业务层2.1 规划异常2.2 编写接口与抽象方法2.3 实现抽象方法测试3 控制器3.1 处理异常3.2 设计请求3.3 处理请求测试4 前端页面测试前言 写作于 2022-10-14 17:…

【MySQL】安装与配置(内附安装包+未将对象引用设置到对象的实例的错误解决方法)

目录 一、数据库分类 &#xff08;1&#xff09;关系型数据库&#xff08;RDBMS&#xff09; &#xff08;2&#xff09;非关系型数据库 二、MySQL服务器安装 三、安装包文件分享 一、数据库分类 数据库大体可以分为关系型数据库和非关系型数据库 &#xff08;1&#xff0…

U盘复制错误0x80071ac3如何解决?

U盘是一款移动存储设备&#xff0c;但是在使用中也会遇到一些错误问题&#xff0c;比如文件复制、粘贴或移动时提示0x80071ac3错误代码要如何解决呢&#xff1f;下面就和小编一起来看看解决办法吧。 方法一&#xff1a; 1、有些用户是使用U盘时出现的问题&#xff0c;先按下快捷…

记宝塔使用webhook自动化同步gitee代码

1、服务器ssh密钥 1.1、输入命令查看服务器是否存在密钥&#xff1a; cd ~/.sshls id_xxx.pub的是公钥、id_xxx的是私钥 如果没有&#xff0c;就要先生成一下&#xff0c;生成ssh密钥参考https://gitee.com/help/articles/4181#article-header0 1.2、复制ssh公钥到码云公钥…

【Hack The Box】linux练习-- Blocky

HTB 学习笔记 【Hack The Box】linux练习-- Blocky &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f3…

UE4 回合游戏项目 22- 添加第二个玩家

在上一节&#xff08;UE4 回合游戏项目 21- 添加多种类型的敌人&#xff09;基础上新添加一个玩家角色 效果&#xff1a; 步骤&#xff1a; 1.打开进阶游戏资源&#xff0c;解压“回合迁移_第七节&#xff08;只是新人物包&#xff09;” 2.解压后双击打开工程 3.选中“ziyuan…

如何通过快解析实现外网远程访问JupyterNotebook

什么是Jupyter Notebook&#xff1f;官网介绍&#xff1a;Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。简单地说&#xff0c;Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面…

Spring Boot——yml和properties详解

文章目录1. 配置文件作用2. 配置文件的格式和分类2.1 规则&#xff08;tips&#xff09;2.2 为配置文件安装提示插件3. properties 配置文件说明3.1 properties 基本语法3.2 关于 properties 中文乱码的问题处理&#xff1a;4. 读取 properties 配置文件4.1 读取单个配置文件5.…

Spring @DateTimeFormat日期格式化时注解浅析分享

文章目录总结写前面为什么用怎么用场景一场景二场景三场景四场景五方式一方式二总结写前面 关于它 DateTimeFormat&#xff1a; 可以接收解析前端传入字符时间数据&#xff1b;不能格式化接收的字符时间类型数据&#xff0c;需要的转换格式得配置&#xff1b;入参格式必须与后…

罗丹明PEG羟基,RB-PEG-OH,Rhodamine-PEG-OH

产品名称&#xff1a;罗丹明PEG羟基 英文名称&#xff1a;RB-PEG-OH&#xff0c;Rhodamine-PEG-OH&#xff0c;Rhodamine PEG hydroxyl&#xff0c;RB-PEG-OH CAS&#xff1a;1030-000-8 结构式&#xff1a; 罗丹明吸收波长570 nm,发射波长约595 nm。罗丹明B可追踪粉红色和红…

Git——Git介绍及安装步骤

目录 一、Git概述&#xff1a;分布式版本控制工具 1.1 版本控制介绍 1.1.3为什么需要版本控制&#xff1f; 1.2 版本控制工具 1.2.1 集中式版本控制工具 1.2.2 分布式版本控制工具 1.3 工作机制和代码托管中心&#xff08;远程库&#xff09; 二、Git安装 2.1 官网下载安装…

用物理光学建模演示点阵投影仪的工作原理

摘要 点阵投影仪是启用Apple Face ID的关键组件。 该系统通常由发光单元阵列&#xff0c;透镜和分束光栅组成。 透镜系统与光栅一起投射&#xff0c;并复制阵列光源图案。 在此示例中&#xff0c;我们构建了这种点阵投影仪系统并演示了其工作原理。为进行系统分析&#xff0c;我…

[Java]枚举类

文章目录&#x1f34a; 枚举类理解&#x1f34a; 自定义枚举类&#x1f34a; 使用 enum 关键字定义枚举类&#x1f34a; Enum类的常用方法&#x1f96d; toString()&#x1f96d; Enum.valueOf(Class enumClass, String name)&#x1f96d; valueOf(String name)&#x1f96d; …

艾美捷Bio-Helix BluPAD双LED蓝白光照胶台丨舒适、方便

艾美捷Bio-Helix BluPAD双LED蓝白光照胶台&#xff08;切胶仪&#xff0c;透射仪&#xff09;&#xff0c;适用于各种生命科学研究领域&#xff0c;用于观察和分析核酸和蛋白质。鉴于其对凝胶切割、数据成像和归档等观察后应用的最优化和人性化设计&#xff0c;希望为研究人员提…

搭建包含swift组件的openstack云平台详解

由于今天做实验。。。 安装完成虚拟机仅主机模式和nat模式双网卡后&#xff0c;开启网卡进入界面直接ping百度&#xff0c;ping通直接执行下面操作 开启虚拟机&#xff0c;切换到root模式关闭防火墙 查看防火墙是否开启&#xff0c;如果开启请关闭&#xff08;出现Active: ac…

广东的介绍

附录&#xff1a; 1、画图工具&#xff1a;https://www.ldmap.net/map.html?id97f83161-ce02-4e11-989b-fb6645469320 广东之地 因字幅有限&#xff0c;故先列举最端。 巧合点 分隔各地&#xff0c;却有相同的点&#xff0c;是否有相同的影响因素。广东最南&#xff0c;最…

免费搜题接口

免费搜题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转&a…

[附源码]计算机毕业设计JAVA基于web鲜花销售系统论文2022

[附源码]计算机毕业设计JAVA基于web鲜花销售系统论文2022 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; …