1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【无人机控制】多旋翼飞行器 (MAV) 的飞行动力学和控制模拟器附matlab代码

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

时间:2023-03-11 22:43:07

相关推荐

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

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

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

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

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

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

⛄ 内容介绍

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

⛄ 部分代码

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

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

% Copyright (C) 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 (davists@ita.br)');

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]. 兰州交通大学学报, (1):5.

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

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

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

⛳️ 代码获取关注我

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。