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

简介: 多旋翼无人机组合导航系统-多源信息融合算法(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.


相关文章
|
15天前
|
机器学习/深度学习 人工智能 算法
基于DCT和扩频的音频水印嵌入提取算法matlab仿真
本文介绍了结合DCT和扩频技术的音频水印算法,用于在不降低音质的情况下嵌入版权信息。在matlab2022a中实现,算法利用DCT进行频域处理,通过扩频增强水印的隐蔽性和抗攻击性。核心程序展示了水印的嵌入与提取过程,包括DCT变换、水印扩频及反变换步骤。该方法有效且专业,未来研究将侧重于提高实用性和安全性。
|
2天前
|
存储 算法
m基于LDPC编译码的matlab误码率仿真,对比SP,MS,NMS以及OMS四种译码算法
MATLAB 2022a仿真实现了LDPC译码算法比较,包括Sum-Product (SP),Min-Sum (MS),Normalized Min-Sum (NMS)和Offset Min-Sum (OMS)。四种算法在不同通信场景有各自优势:SP最准确但计算复杂度高;MS计算复杂度最低但性能略逊;NMS通过归一化提升低SNR性能;OMS引入偏置优化高SNR表现。适用于资源有限或高性能需求的场景。提供的MATLAB代码用于仿真并绘制不同SNR下的误码率曲线。
18 3
|
5天前
|
算法 数据安全/隐私保护 计算机视觉
基于DCT变换的彩色图像双重水印嵌入和提取算法matlab仿真
**算法摘要:** - 图形展示:展示灰度与彩色图像水印应用,主辅水印嵌入。 - 软件环境:MATLAB 2022a。 - 算法原理:双重水印,转换至YCbCr/YIQ,仅影响亮度;图像分割为M×N块,DCT变换后嵌入水印。 - 流程概览:两步水印嵌入,每步对应不同图示表示。 - 核心代码未提供。
|
5天前
|
机器学习/深度学习 算法 数据可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
10 0
|
6天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
6天前
|
算法 搜索推荐 数据挖掘
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
16 0
|
7天前
|
数据采集 机器学习/深度学习 存储
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
14 0
|
8天前
|
算法 数据安全/隐私保护 数据格式
基于混沌序列的图像加解密算法matlab仿真,并输出加解密之后的直方图
该内容是一个关于混沌系统理论及其在图像加解密算法中的应用摘要。介绍了使用matlab2022a运行的算法,重点阐述了混沌系统的特性,如确定性、非线性、初值敏感性等,并以Logistic映射为例展示混沌序列生成。图像加解密流程包括预处理、混沌序列生成、数据混淆和扩散,以及密钥管理。提供了部分核心程序,涉及混沌序列用于图像像素的混淆和扩散过程,通过位操作实现加密。
|
9天前
|
数据采集 算法 数据可视化
MATLAB、R用改进Fuzzy C-means模糊C均值聚类算法的微博用户特征调研数据聚类研究
MATLAB、R用改进Fuzzy C-means模糊C均值聚类算法的微博用户特征调研数据聚类研究
16 1
|
16天前
|
机器学习/深度学习 算法
m基于深度学习的QPSK调制解调系统频偏估计和补偿算法matlab仿真
MATLAB 2022a中展示了基于深度学习的QPSK调制解调系统频偏估计和补偿算法仿真结果。该算法运用神经网络模型实时估计并补偿无线通信中的频率偏移。QPSK调制将二进制信息映射到四个相位状态,解调通常采用相干解调。深度学习算法通过预处理、网络结构设计、损失函数选择和优化算法实现频偏估计。核心程序生成不同SNR下的信号,比较了有无频偏补偿的误码率,显示了补偿效果。
9 1