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


    💥💥💞💞欢迎来到本博客❤️❤️💥💥

    🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

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

    📋📋📋本文目录如下:🎁🎁🎁

    目录

    💥1 概述

    📚2 运行结果

    🎉3 参考文献

    🌈4 Matlab代码实现


    💥1 概述

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

    📚2 运行结果

      

       

    部分代码:

    % 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): ');
    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]';

    🎉3 参考文献

    部分理论来源于网络,如有侵权请联系删除。

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

    🌈4 Matlab代码实现

  • 相关阅读:
    保研经历分享(一)
    第2章Linux基础篇-VM和Linux的安装
    微信小程序---目录结构
    这是什么是
    echarts设置竖向不同区间范围颜色,并且x轴自定义轴线刻度范围
    分库分表之拆分键设计
    Go gRPC 入门
    阿里云OSS上传文件超时 探测工具排查方法
    镉系量子点 CdSe/ZnS QDs,硒化镉/硫化锌量子点(油溶性)
    linux jar包class热部署 工具 arthas安装及使用
  • 原文地址:https://blog.csdn.net/m0_64583023/article/details/133151041