【无人机控制】多旋翼飞行器 (MAV) 的飞行动力学和控制模拟器附matlab代码

您所在的位置:网站首页 1207控制器故障代码 【无人机控制】多旋翼飞行器 (MAV) 的飞行动力学和控制模拟器附matlab代码

【无人机控制】多旋翼飞行器 (MAV) 的飞行动力学和控制模拟器附matlab代码

2023-04-02 22:34| 来源: 网络整理| 查看: 265

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

多旋翼飞行器以其机械结构简单,成本低,操控灵活,等优点广泛应用于航拍,空中测绘,电力巡线,空中侦察领域,逐渐成为微型无人机中的研究热点.但是多旋翼无人机是一种高阶,非线性,强耦合的欠驱系统,控制技术是该领域一个重要的研究方向。IMAV-M是一个多旋翼飞行器(MAVs)的飞行动力学和控制模拟器,它被设想用来生成模拟运动变量和控制努力指令,以评估eVTOL飞机和无人机的控制、引导和导航方法。

⛄ 部分代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%    IMAV-M Simulator - A flight dynamics and control simulator for MAVs 

%    Copyright (C) 2020  Aeronautics Institute of Technology

%

%    This program is free software: you can redistribute it and/or modify

%    it under the terms of the GNU General Public License as published by

%    the Free Software Foundation, either version 3 of the License, or

%    (at your option) any later version.

%

%% Add to path

addpath('Plots');

addpath('Classes');

addpath('Conversions');

%% Clean and close

clc

clear

close all

tstart = tic;

%% Parameters

% Input parameters

load('Parameters.mat');

% MAV 

sMav.type = MAVType;

sMav.nr   = nr;

sMav.kf   = kf;

sMav.kt   = kt;

sMav.wmax = wmax;

sMav.km   = km;

sMav.Tm   = Tm;

sMav.l    = l;

sMav.delta= delta;

sMav.m    = m;

sMav.JB   = JB;

sMav.Jr   = Jr;

sMav.g    = g;

sMav.h    = Ts;

sMav.w    = zeros(nr,1);

sMav.r    = zeros(3,1);

sMav.v    = zeros(3,1);

sMav.vp   = zeros(3,1);

sMav.D    = eye(3);

sMav.W    = zeros(3,1);

oMav = CMav( sMav );

% Disturbance/Uncertainty 

sUncer.alpha_f = alpha_f;

sUncer.alpha_t = alpha_t;

sUncer.mg      = mg;

sUncer.tint    = -1;            % with -1, no interference at all

sUncer.mi      = 0;

sUncer.phi     = 90;

oUncer = CUncer( sUncer );

% Sensor platform 

sSensors.ba  = ba0;

sSensors.bg  = bg0;

sSensors.bm  = bm0;

sSensors.g   = g;

sSensors.mg  = mg;   

sSensors.sa  = sa;

sSensors.sg  = sg;

sSensors.sm  = sm;

sSensors.sba = sba;

sSensors.sbg = sbg;

sSensors.sbm = sbm;

sSensors.sr  = sr;

sSensors.Ts  = Ts;

sSensors.ya  = [0;0;g];

sSensors.yg  = zeros(3,1);

sSensors.ym  = mg;

sSensors.yr  = zeros(3,1); 

sSensors.yrp = zeros(3,1);

oSensors = CSensors( sSensors );

% Flight Control

sControl.K1      = K1;

sControl.K2      = K2;

sControl.K3      = K3;

sControl.K4      = K4;

sControl.Kc      = Kc;

sControl.JB      = JB;

sControl.Jr      = Jr;

sControl.m       = m;

sControl.g       = g;

sControl.nr      = nr;

sControl.l       = l;

sControl.delta   = delta;

sControl.kf      = kf;

sControl.kt      = kt;

sControl.k       = kt/kf;

sControl.Tmin    = Tmin;

sControl.Tmax    = Tmax;

sControl.Fmin    = Fmin;

sControl.Fmax    = Fmax;

sControl.zetamin = zetamin;

sControl.zetamax = zetamax;

sControl.r_      = zeros(3,1);

sControl.v_      = zeros(3,1);

sControl.p_      = 0;

sControl.wz_     = 0;

sControl.w_      = zeros(nr,1);

sControl.D_      = eye(3);

sControl.tau     = tau_ref_filter;

sControl.Ts      = Ts;

oControl = CControl( sControl );

% Trajectory planning/guidance 

sGuidance.nw    = nw;

sGuidance.wl    = wl;

sGuidance.Kpr   = Kpr;

sGuidance.Kpp   = Kpp;

sGuidance.Kdr   = Kdr;

sGuidance.Kdp   = Kdp;

sGuidance.rhor  = rhor;

sGuidance.rhop  = rhop;

sGuidance.dtl   = dtl;

sGuidance.Ts    = Ts;

sGuidance.dkl   = dtl/Ts;

sGuidance.l     = 1;

sGuidance.k     = 0;

sGuidance.r_    = zeros(3,1);

sGuidance.v_    = zeros(3,1);

sGuidance.p_    = 0;

sGuidance.wz_   = 0;

sGuidance.flag  = 0;

oGuidance = CGuidance( sGuidance );

% Navigation algorithm

sNavigation.tau = tau;

sNavigation.Ts  = Ts;

sNavigation.Ra  = Ra;

sNavigation.Rg  = Rg;

sNavigation.Rm  = Rm;

sNavigation.Rr  = Rr;

sNavigation.Qbg = Qbg;

sNavigation.mg  = mg;

sNavigation.x0  = x0;

sNavigation.P0  = P0;

            

oNavigation = CNavigation( sNavigation );

%% Initial interface

disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%');

disp('IMAV-M 1.0: SIMULATION OF FLIGHT DYNAMICS AND CONTROL OF MAVs');

disp('Mode A: for generating plots.'); 

disp(' ');

disp('Description: Pure MATLAB simulation including:'); 

disp(' ');

disp('             - plant and environment physics');

disp('             - sensors');

disp('             - guidance');

disp('             - flight control laws');

disp('             - attitude estimation (using mag, acc, gyro) and gps');

disp('             - only auto waypoint state, for generating plots');

disp(' ');

disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%');

disp('Author: Prof. Dr. Davi A. Santos ([email protected])');

disp('Institution: Aeronautics Institute of Technology (ITA/Brazil)');

disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%');

disp(' ');

input('Press ENTER to start...');

disp(' ');

%% Calibration

for k = 1:kfcalib 

    

    % Sensor measurements

    

    oSensors.vp = oMav.vp;

    oSensors.W  = oMav.W;

    oSensors.r  = oMav.r;

    oSensors.D  = oMav.D;

    

    oSensors = acc ( oSensors );

    oSensors = gyro( oSensors );

    oSensors = mag ( oSensors );

    oSensors = gps ( oSensors );

    

    

    % Navigation

    

    oNavigation.ya  = oSensors.ya;

    oNavigation.yg  = oSensors.yg;

    oNavigation.ym  = oSensors.ym;

    oNavigation.yr  = oSensors.yr;

    oNavigation.yrp = oSensors.yrp;

    

    

    oNavigation = NV( oNavigation );

    

    

end

%% Discrete-time loop

k=1;

while( 1 )

   

    

       

    

    %% Compute commands

    

        

    % input measurement

    oGuidance.r  = oNavigation.x(1:3); 

    oGuidance.v  = oNavigation.x(4:6); 

    aux          = D2a( q2D( oNavigation.x(10:13 )) );  

    oGuidance.p  = aux(3); 

    oGuidance.wz = oSensors.yg(3) - oNavigation.x(16); 

    % wayset verification

    oGuidance = wayset_verif( oGuidance );

    % wayset transition

    oGuidance = wayset_transit( oGuidance ); 

    % command generation

    oGuidance = plaw( oGuidance );

    % Commands to the flight controllers 

    oControl.r_    = oGuidance.r_;

    oControl.v_    = oGuidance.v_;

    oControl.p_    = oGuidance.p_; 

    oControl.wz_   = oGuidance.wz_;

  

    

    %% Flight control

    

    

    % Feedback variables 

    

    oControl.r     = oNavigation.x(1:3); 

    oControl.v     = oNavigation.x(4:6); 

    oControl.D     = q2D( oNavigation.x(10:13) );  

    oControl.W     = oSensors.yg - oNavigation.x(14:16);   

    

    

    % Position control law

    oControl = PC( oControl, 1 );

    

    % Attitude command computation

          

    oControl = ATC( oControl );

    

    

    % Attitude control law

     

    oControl = AC( oControl, 1 );

  

    

    % Control allocation algorithm

    

    oControl = CA( oControl );

    

   

    %% Environment and plant simulation

    

    

    % Disturbances 

    oUncer  = disturbances( oUncer );

    % Equations of motion

    oMav.Fd = oUncer.Fd;

    oMav.Td = oUncer.Td;

    oMav.w_ = oControl.w_;

    oMav = propeller( oMav );

    oMav = efforts  ( oMav );

    oMav = dynamics ( oMav );

    

    

    %% Magnetic interference simulation

    

    if oUncer.tint ~= -1 && k*Ts == oUncer.tint

      

        oUncer = interference( oUncer );

        

    end

    

    

    %% Sensor platform simulation

    

    oSensors.vp = oMav.vp;

    oSensors.W  = oMav.W;

    oSensors.r  = oMav.r;

    oSensors.D  = oMav.D;

    oSensors.bm = bm0 + oUncer.dm;

    

    oSensors = acc ( oSensors );

    oSensors = gyro( oSensors );

    oSensors = mag ( oSensors );

    oSensors = gps ( oSensors );

    

    %% Navigation algorithm

   

    

    oNavigation.ya  = oSensors.ya;

    oNavigation.yg  = oSensors.yg;

    oNavigation.ym  = oSensors.ym;

    oNavigation.yr  = oSensors.yr;

    oNavigation.yrp = oSensors.yrp;

    

    oNavigation = NV( oNavigation );

    

    

%% Monitoring 

    

    % Estimates

    

    red(:,k)  = oNavigation.x(1:3);

    ved(:,k)  = oNavigation.x(4:6);

    baed(:,k) = oNavigation.x(7:9);

    bged(:,k) = oNavigation.x(14:16);

    aed(:,k)  = 180/pi*D2a( q2D( oNavigation.x(10:13) ) );

    ead(:,k)  = 180/pi*oControl.ea;

    

    % True states

    

    rd(:,k)   = oMav.r; 

    vd(:,k)   = oMav.v;

    Wd(:,k)   = oMav.W;

    ad(:,k)   = 180/pi*D2a( oMav.D );

    

    % commands 

    

    rd_(:,k)  = oControl.r_;

    vd_(:,k)  = oControl.v_;

    ad_(:,k)  = 180/pi*D2a( oControl.D_ );

    wzd_(k)   = oControl.wz_;

    wd_(:,k)  = oControl.w_;

    FGd(:,k)  = oControl.FG_;

    TBd(:,k)  = oControl.TB_;  

%% Update time index (just for plotting)

    

    k = k + 1;

    if k == tf/Ts

        break;

    end

    

    

    

end 

%% Simulation time

tend = toc(tstart);

disp('Simulation finished! Duration:');

disp(' ');

disp(tend);

%% Plots

disp('Plotting...');

disp(' ');

t = 2*Ts:Ts:tf;

% position vs position command

plot1c(t,rd(1,:)','$r_1$',rd_(1,:)','$\bar{r}_1$');

plot1c(t,rd(2,:)','$r_2$',rd_(2,:)','$\bar{r}_2$');

plot1c(t,rd(3,:)','$r_3$',rd_(3,:)','$\bar{r}_3$');

% attitude vs attitude command

plot1c(t,ad(1,:)','$a_1$',ad_(1,:)','$\bar{a}_1$');

plot1c(t,ad(2,:)','$a_2$',ad_(2,:)','$\bar{a}_2$');

plot1c(t,ad(3,:)','$a_3$',ad_(3,:)','$\bar{a}_3$');

% force command 

plot3c(t,FGd','$F_1$','$F_2$','$F_3$');

% torque command

plot3c(t,TBd','$T_1$','$T_2$','$T_3$');

% 3D trajectory

plot3dc(rd,rd_,'Trajectory','Command');

   

% for evaluating/tuning the filters

plotEvalNavigation

⛄ 运行结果

⛄ 参考文献

[1] 孟佳东, 赵志刚. 小型四旋翼无人机建模与控制仿真[J]. 兰州交通大学学报, 2013(1):5.

[2] 冯旭光. 四旋翼无人机自主控制系统设计[D]. 内蒙古科技大学, 2014.

[3] 江杰, 冯旭光, 苏建彬. 四旋翼无人机仿真控制系统设计[J]. 电光与控制, 2015, 22(2):4.

[4] 方立东. 基于ARM有缆六旋翼研究与实现[D]. 南昌航空大学.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3