💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞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 = -(2pi - theta) ;
%
% PHI1 = phi1u;
% PHI2 = phi2u;
% % 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:2i)*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 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合
2004

被折叠的 条评论
为什么被折叠?



