【飞行器】多源信息融合算法多旋翼无人机组合导航系统【含GUI Matlab源码 14831期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
在这里插入图片描述
🔊博主简介:985研究生,Matlab领域科研开发者;

🚅座右铭:行百里者,半于九十。

🏆代码获取方式:
优快云 Matlab武动乾坤—代码获取方式

更多Matlab路径规划仿真内容点击👇
Matlab路径规划(进阶版)

⛳️关注优快云 Matlab武动乾坤,更多资源等你来!!

⛄一、多源信息融合算法多旋翼无人机组合导航系统

1 多源信息融合算法概述
多源信息融合算法通过整合来自不同传感器的数据,提升导航系统的精度和鲁棒性。常见的融合方法包括卡尔曼滤波(KF)、扩展卡尔曼滤波(EKF)、无迹卡尔曼滤波(UKF)以及粒子滤波(PF)。这些算法能够处理噪声、传感器误差和动态环境变化。

2 多旋翼无人机组合导航系统架构
组合导航系统通常由以下模块构成:

  • 惯性测量单元(IMU):提供加速度和角速度信息,但存在积分漂移问题。
  • 全球导航卫星系统(GNSS):提供绝对位置信息,但在遮挡环境下不可靠。
  • 视觉传感器(如摄像头):通过视觉里程计或SLAM算法补充位置估计。
  • 气压计/磁力计:辅助高度和航向测量。

3 典型融合算法实现
卡尔曼滤波(KF/EKF)
适用于线性或近似线性系统。状态方程和观测方程如下:
[
\begin{cases}
x_k = F_{k-1}x_{k-1} + B_{k-1}u_{k-1} + w_{k-1} \
z_k = H_kx_k + v_k
\end{cases}
]
其中 (x_k) 为状态向量,(F) 为状态转移矩阵,(w) 和 (v) 分别为过程噪声和观测噪声。

无迹卡尔曼滤波(UKF)
通过Sigma点逼近非线性分布,避免线性化误差。适用于强非线性系统,如无人机剧烈机动时的姿态估计。

粒子滤波(PF)
基于蒙特卡罗方法,通过大量粒子近似概率分布。适用于非高斯噪声和多模态问题,但计算复杂度较高。

4 传感器数据同步与标定

  • 时间同步:采用硬件触发或软件时间戳对齐IMU、GNSS和视觉数据。
  • 空间标定:通过标定确定传感器间的外参(如相机与IMU的相对位姿)。

5 抗干扰与容错设计

  • 故障检测:通过卡方检验或残差分析识别传感器异常。
  • 自适应滤波:动态调整噪声参数以适应环境变化(如GNSS信号丢失时降低其权重)。

6 实际应用案例

  • 松耦合融合:GNSS位置输出直接与IMU数据融合,实现简单但精度受限。
  • 紧耦合融合:原始GNSS伪距、多普勒频移与IMU数据深度融合,提升复杂环境下的可靠性。

7 代码示例(EKF实现片段)

import numpy as np  

class EKF:  
    def __init__(self, F, H, Q, R, x0, P0):  
        self.F = F  # 状态转移矩阵  
        self.H = H  # 观测矩阵  
        self.Q = Q  # 过程噪声协方差  
        self.R = R  # 观测噪声协方差  
        self.x = x0 # 初始状态  
        self.P = P0 # 初始协方差  

    def predict(self):  
        self.x = np.dot(self.F, self.x)  
        self.P = np.dot(self.F, np.dot(self.P, self.F.T)) + self.Q  

    def update(self, z):  
        y = z - np.dot(self.H, self.x)  
        S = np.dot(self.H, np.dot(self.P, self.H.T)) + self.R  
        K = np.dot(self.P, np.dot(self.H.T, np.linalg.inv(S)))  
        self.x += np.dot(K, y)  
        self.P = self.P - np.dot(K, np.dot(S, K.T))  

8 性能优化方向

  • 计算效率:采用稀疏矩阵或固定滞后平滑降低实时性要求。
  • 深度学习辅助:使用神经网络预训练传感器误差模型或动态调整融合参数。

通过合理选择融合算法和传感器配置,多旋翼无人机组合导航系统可在复杂环境中实现厘米级定位精度。

⛄二、部分源代码

clear all

demo_0 = 1;
rad = pi/180;
deg = 180/pi;

pos = [30pi/180, 120pi/180, 200]';
vn = [10, 10, 10];

att0 = [10, 10, 10]‘*rad;
v0 = [10, 20, 30]’;
% ans = euler2dcm(att0)

b = fir1(20, 0.01, ‘low’);
b = b/sum(b);
% x = repmat([att0; vby]', length(b), 1);

% rv = [10, 2, 1]‘*pi/180;
% sqrt(rv’*rv)

wm = [1, 1, 1
2, 2, 2
3, 3, 3
4, 4, 4
5, 5, 5];
%
% wmm = wm(1:2, 😃
% wm1 = wm(2:3, 😃
% cross(wmm,wm1, 2)
% cs = [ [ 2, 0, 0, 0, 0]/3
% [ 9, 27, 0, 0, 0]/20
% [ 54, 92, 214, 0, 0]/105
% [ 250, 525, 650, 1375, 0]/504
% [2315, 4558, 7296, 7834, 15797]/4620 ];
%
% cs(3, 1:3)*wm(1:3, 😃
% wm(1:3, 😃

% eth = earth(pos, vn)
% skew(v0)

% u = [1, 2, 3]‘;
% u = u/norm(u);
% theta = 0.8pi;
%
% phi1 = theta;
% phi2 = -(2
pi - theta) ;
%
% PHI1 = phi1u;
% PHI2 = phi2
u;
% % norm(PHI)
% qq1 = rv2q(PHI1)’
% qq2 = rv2q(PHI2)’
%
% PHI1’*PHI1
% rk = [[0.1; 0.1; 0.1]; [10; 10; 10]]';
% Rk = diag(rk)^2;

% R =1 + 0.1.*randn(10000, 1);
% mean®
% var®
%
% clearvars -except R
% imu_err = imuerror();
name = ‘selfdefine’;
exist(‘name’, ‘var’) && ~strcmp(name, ‘’) && ~strcmp(name, ‘zero’)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 名称:Opitiaml Based Alignment (GPS velocity aided) version 1.0
% 功能:
%
% 缩写的含义:
% msr: measurement;
% ref: reference; 特指真实值
% sv: save;
% prv: previous; 对应变量在上次解算后的值或在本次解算开始时刻的值
% opt: optimal

% Author: Kun Gan, Tongji University
% Email : ciaotigre@126.com
% Date : 2020/12/1
%%
% 全局变量
close all
gvar_earth;

% ** 下载数据 **
% 数据包含
% 1. trajectory_ref.(pos, vn, att)
% 2. imu.ref.(acc, gyr)
% 轨迹仿真程序生成的数据,trajectory的长度会比imu长1。trajectory首个数据为
% t0时刻的avp_ref, imu首个数据为理想imu在t1时刻输出的(t0, t1]内角度和速
% 度增量。
load(‘trj_and_imu.mat’);

% ** 与测量数据相关的量 **
% imu输出频率 (Hz)
f_imu = 100;
ts_imu = 1/f_imu;
% gps输出频率 (Hz)
f_gps = f_imu;
ts_gps = 1/f_gps;
% 总数据长度 (个)
num_imu_data = size(imu_ref.acc, 1);

% *** 给imu数据添加误差 ***
imu_err = imuerrorset(‘selfdefine’);
% add imu error
[imu_msr.gyr, imu_msr.acc] = imuadderr(imu_ref.gyr, imu_ref.acc, …
imu_err.eb, imu_err.web, imu_err.db, imu_err.wdb, ts_imu);

% ** 设置全局变量 **
% 第一个"读入"的数据所对应的时刻以及在imu_ref和trajectory_ref中的位置 (s)
% 可以认为导航系统是在第start_time秒启动的
start_time = 0;
first_data_index = round(start_time/ts_imu) + 1;
% 对准时间长度 (s)
total_alignment_time = 92;

% 更新算法子样数 (个)
num_subsample = 2;
nts = num_subsample*ts_imu;

% 初始位置、速度、姿态
pos0 = trajectory_ref.pos(first_data_index, 😃‘;
vn0 = trajectory_ref.vn(first_data_index, 😃’;
att0 = trajectory_ref.att(first_data_index, 😃';

att0_ref = att0;
Cbn0_ref = a2mat(att0);
q0_ref = a2qua(att0);

% *** 一些变量在上一时刻的值 ***
% 速度、位置、姿态
% 目前还没有准备对初始时刻值添加误差
pos_prv = pos0;
vn_prv = vn0;
att_prv = att0;

% eth保存惯导解算需要的变量,例如wien, winn等。
eth_prv = earth(pos_prv, vn_prv);

% bt系和nt系相对惯性空间变化量
Cntn0_prv = eye(3);
Cbtb0_prv = eye(3);
qbtb0 = [1, 0, 0, 0]';

% 分配动态变量存储空间
phi_sv = zeros(round(total_alignment_time/ts_imu), 3);
phi0_sv = zeros(round(total_alignment_time/ts_imu), 3);

% 计数变量
% 当前时刻 s
current = 0;
% 当前循环时第i次循环
i = 0;
% index
k = 0;
%%
% 我们的终极目标是让算法能够在实际中运行,实际中情况大概是这样的:
% 1. t=0,惯导开机
% 2. t=ts_imu,imu在此时输出第一组速度增量vm(1)和角增量wm(1)
% 3. t=nts,imu输出凑足了执行一次惯导更新所需要的子样数,导航计算机立即执行
% 惯导更新程序并输出导航结果p(t),vn(t),att(t)
% 4. 导航计算机继续等待imu测得n组测量信息再进行惯导更新
while current < total_alignment_time
% 每过nts秒,imu就会测量出num_subsample组采样结果。获得足够imu输出后立
% 即在current时刻(亦称:当前时刻)进行导航更新
current = current + nts;

% current时刻,载体的位置、速度、姿态参考值
pos_ref = trajectory_ref.pos(k, :)';
vn_ref = trajectory_ref.vn(k, :)';
att_ref = trajectory_ref.att(k, :)';
qbn_ref = a2qua(att_ref);

% 用参考速度模拟当前时刻GPS速度,其中位置信息暂时不加误差
vn_gps = vn_ref + 0.*randn(3, 1);
pos_gps = pos_ref;

vn_gps_sv(i, :) = vn_gps;
% 用gps输出的速度作为组合导航系统给出的速度
vn = vn_gps;
pos = pos_gps;

% 从imu_ref中读出(current - nts, current]这段时间内imu输出的n组量测信息
wm = imu_msr.gyr(k-num_subsample+1 : k, :);
vm = imu_msr.acc(k-num_subsample+1 : k, :);

wm_sv(2*i-1:2*i, :) = wm;
vm_sv(2*i-1:2*i, :) = vm;
% 步长圆锥/划桨误差
[phim, dvbm] = cnscl(wm, vm);


% *** 计算alpha(n0)和beta(b0) ***
% alpha(n0)
% 1. 目前用vn0_ref计算alpha, 暂时不考虑滑动窗口。
% 2. 用gps输出的位置计算wien和gn
alpha_sigma = alpha_sigma + ... 
              Cntn0_prv*(cross(eth_prv.wien, vn_prv) - eth_prv.gn)*nts;
alpha = Cntn0*vn - vn0 + alpha_sigma;
% beta(b0)
beta = beta_prv + Cbtb0_prv*dvbm;

% QUEST 方法计算qbn0
[ qbn0, K ] = QUEST( beta, alpha, K_prv );

% 姿态解算
Cbn0 = q2mat(qbn0);
Cbn = Cntn0'*Cbn0*Cbtb0;
att = m2att(Cbn);
phi0_sv(i, :) = atterrnorml(q2att(qbn0) - att0_ref)*deg;
phi_sv(i, :) = atterrnorml(att - att_ref)*deg;

% 计算导航解算时所需要的相关参数
eth = earth(pos, vn);

% 将本次更新后的导航参数作为下次更新初值
pos_prv = pos;
vn_prv = vn;
att_prv = att;
eth_prv = eth;
Cntn0_prv = Cntn0;
Cbtb0_prv = Cbtb0;
alpha_prv = alpha;
beta_prv = beta;
K_prv = K;

end

% 注意:如果end前面加了空格就会出错!
phi_sv(i+1:end, 😃 = [];
phi0_sv(i+1:end, 😃 = [];
%% 绘图
time_axis = (1:1:i)nts;
time_axis_imu = (1:1:2
i)*ts_imu;

% Cbn误差
msplot(311, time_axis, phi_sv(:, 1), ‘pitch error / \circ’);
msplot(312, time_axis, phi_sv(:, 2), ‘roll error / \circ’);
msplot(313, time_axis, phi_sv(:, 3), ‘yaw error / \circ’);

%Cbn0 误差
msplot(311, time_axis, phi0_sv(:, 1), ‘pitch error / \circ’);
msplot(312, time_axis, phi0_sv(:, 2), ‘roll error / \circ’);
msplot(313, time_axis, phi0_sv(:, 3), ‘yaw error / \circ’);

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]王辰熙.多旋翼无人机组合导航技术研究[D].南京航空航天大学. 2017

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值