四旋翼无人机飞行器(Unmanned Aerial Vehicle, UAV)是一种旋翼式直升机,它具有四个控制输入和六个控制输出,因此四旋翼无人机是一个欠驱动的旋翼直升机。四旋翼无人机的机身是互相交叉的十字结构刚体,四个螺旋桨通过 4 个独立控制的直流无刷电机控制转动以提供升力。
四旋翼无人机因为特殊的结构特点,具有其他普通固定翼飞机所没有的垂直起降、空中悬停、倒向飞行和侧向飞行的特点,与普通直升机相比,小型四旋翼无人机的结构简单而简洁,不需要像直升机那样的反扭矩桨,可以通过四个旋翼之间的力的作用抵消自身的反扭力矩,而且具有螺旋桨小、造价比较低廉、可维护性和可操作性强的特点。最重要的是四旋翼无人机具有比较简单的控制方式,只通过控制四个旋翼的转速就可以完成对其所有的姿态和位置的控制。四旋翼无人机可以应用到社会的生产生活中。在信号传输领域,可以作为中继器,起到航空信号中继和传输的作用;在目标跟踪领域,可以对搜索的目标进行全局和局部的定位,更好辅助目标搜索过程;在测绘领域,四旋翼无人机搭载摄像机,可以进行对地的测绘工作,搭载其他的专用设备等。所以四旋翼无人机的应用相当广泛,对于政府机构来说,可以利用四旋翼无人机进行交通管理、森林防火、抢险救灾等工作。对于媒体机构来说,可以利用四旋翼
无人机进行新闻素材的航空拍摄。对于科研机构来说,利用四旋翼无人机的特点,可以简便快速地进行野生生物拍摄、地质调查、环境评估等工作。同时四旋翼无人机已经大规模商用化,在违规房地产管理、电路检查、农业作业、环境感知等方面发挥了积极的作用。在军事领域四旋翼无人机也有重要的应用,可以用于秘密侦察、灾后救援等工作中。对于个人来说,可以体验遥控飞行、空中摄影等。基于此,越来越多的国内外学者投入到四旋翼无人机的研究工作中来,四旋翼无人机也成为了科技研究和社会应用的焦点。随着科技的进步和发展,四旋翼无人机在执行复杂任务方面发挥着越重要的作用,尤其是在无人机自主作业方面,这也对无人机的控制提出了更高的要求。单架或者多架四旋翼无人机在山地中执行多个飞行任务时面临着目标点随机变化、躲避障碍物等问题,因此在对四旋翼无人机控制的过程中必须要解决路径规划和跟踪控制的问题。无人机路径规划的意思是指在无人机起飞之前,综合考虑无人机的飞行性能、到达时间、油耗、过载和周围环境的约束,利用相关算法事先为无人机从飞行的起始点到终点规划出符合要求的最优或者次优的飞行路径的过程,它是飞行的任务规划系统(Mission Planning System)的关键技术之一,也是无人机能够实现自主导航、自主巡航的基础的技术保障。因此对于无人机路径规划的研究相当重要。
当前社会中,科学技术发展迅速,数字地图已经在人们的生产生活中实现了普及的程度,加上现在四旋翼无人机的控制技术的研究也比较成熟,已经大规模商用,所以四旋翼无人机在生活中的应用也越来越多,这些应用也对四旋翼无人机的使用技术提出了更高的要求。在以往的研究过程中,大部分的研究主要集中在四旋翼无人机的二维路径规划中,较少有关于三维路径规划方向的拓展,但是现阶段无人机应用范围比较广泛,对于三维路径规划的要求也越来越
高,所以在本文中对于四旋翼无人机三维路径规划的研究符合现实需求、具有重要意义。在研究四旋翼无人机的控制过程中,轨迹跟踪的控制是最基本也是最关键的,目前四旋翼无人机的轨迹跟踪控制主要有两个方面的困难,一是四旋翼无人机的建模很难达到非常精确的程度,因为无人机在飞行的过程中,经常会受到各种各样的干扰,所以四旋翼无人机的干扰来自两个方面,由建模不确定性导致的干扰和外界的气流扰动、陀螺效应等带来的干扰。第二个困难是来自四旋翼本身的特点,因为四旋翼无人机有六个控制状态,但是却只能调节四个旋翼的转速来控制四旋翼的姿态和位置,所以它是一个欠驱动的模型,再加上其特有的非线性和高度耦合,以及容易受到外界干扰的特点,也在一定程度上提高了控制的难度。
目前,对于四旋翼无人机的控制,大部分还是利用遥控进行人工控制为主,加以无人机的自主飞行辅助,但是遥控控制对操控人员的操作经验提出了很高的要求,而且要能够控制好四旋翼无人机的飞行,安全的完成飞行任务,必须要理解好牢固掌握四旋翼无人机的结构和飞行原理。从四旋翼无人机的自主飞行控制来看,无人机可以通过自身微处理器的运算,结合所处的环境情况,根据产生的理想的安全的轨迹去跟踪控制飞行。所以四旋翼无人机自主控制要比
人工的遥控控制在一定程度上要稳定一些,所以为了解决自主控制的难题,很多的科研人员都竞相开展了相关研究工作,也取得了很多有价值的成果。
分析现阶段四旋翼无人机在实际生活中的应用,比如农业植保无人机、电力巡线无人机、快递运送无人机等,这些方面都需要对无人机的轨迹跟踪控制进行研究,基于此,结合本文研究工作的前半部分的四旋翼无人机三维路径规划,以规划出的路径为期望轨迹,进行轨迹跟踪控制,使得无人机完成相关任务,轨迹跟踪控制的研究工作就有了很重要现实应用意义。
% Get probabilities and averages of continuous-time model from collected
% data
function AverageProperties(SaveFile)
% close all
% clearvars -except h GlobalTime Count Run Runs SaveFile Data Agents Environment Sim
% clc
fprintf('Averaging properties for all runs...\n\n')
% Load dataset
load(SaveFile)
%% BASIC PROPERTIES
% Numbers of runs averaged
Props.NumRuns = length(AllProps);
% Average mission time
Props.AvgMissionTime = sum(cat(1,AllProps.MissionTime))/length(AllProps);
% Mission success probability
Props.MissionSuccess = sum(cat(1,AllProps.MissionOutcome))/length(AllProps);
%% RUN LOOP
% Initialise arrays
TotalStateTimes = {};
TotalStateDistances = {};
TotalStateTransitions = {};
TotalSystemsFault = [0 0];
TotalActuatorFault = [0 0];
TotalGrabberFault = [0 0];
% Loop runs
for i = 1:length(AllProps)
% STATE-SPECIFIC PROPERTIES -------------------------------------------
% Loop states
for j = 1:size(AllProps(i).AvgStateTimes,1)
% Current state
% CurrentState = AllProps(i).AvgStateTimes{j,1};
CurrentState = AllProps(i).TotalStateTimes{j,1};
% Current time
% CurrentTime = AllProps(i).AvgStateTimes{j,2};
CurrentTime = AllProps(i).TotalStateTimes{j,2};
% Current total
CurrentTotal = AllProps(i).TotalStateTimes{j,3};
% Current distance
% CurrentDistance = AllProps(i).AvgStateDistance{j,2};
CurrentDistance = AllProps(i).TotalStateDistance{j,2};
% Check if current state already exists in total matrix
if isempty(TotalStateTimes) || ~ismember(CurrentState,TotalStateTimes(:,1))
% If state doesn't exist, add it and initialise with first
% total
TotalStateTimes{end+1,1} = CurrentState;
TotalStateTimes{end,2} = CurrentTime;
% TotalStateTimes{end,3} = 1;
TotalStateTimes{end,3} = CurrentTotal;
TotalStateDistances{end+1,1} = CurrentState;
TotalStateDistances{end,2} = CurrentDistance;
% TotalStateDistances{end,3} = 1;
TotalStateDistances{end,3} = CurrentTotal;
else
% If state exists, add current value to total
% Get index of current state in array
k = find(ismember(TotalStateTimes(:,1),CurrentState));
% Add to counter
TotalStateTimes{k,2} = TotalStateTimes{k,2} + CurrentTime;
% TotalStateTimes{k,3} = TotalStateTimes{k,3} + 1;
TotalStateTimes{k,3} = TotalStateTimes{k,3} + CurrentTotal;
TotalStateDistances{k,2} = TotalStateDistances{k,2} + CurrentDistance;
% TotalStateDistances{k,3} = TotalStateDistances{k,3} + 1;
TotalStateDistances{k,3} = TotalStateDistances{k,3} + CurrentTotal;
end
end
% STATE TRANSITIONS ---------------------------------------------------
for j = 1:size(AllProps(i).StateTransitions,1)
% Current pair
CurrentPair = AllProps(i).StateTransitions(j,:);
% Check if current pair already exists in total matrix
if isempty(TotalStateTransitions) || ~any(all(ismember(TotalStateTransitions(:,1:2),CurrentPair(1:2)),2))
% If state pair doesn't exist, add it and initialise it with
% first total
TotalStateTransitions(end+1,:) = CurrentPair;
else
% If state pair exists, add current value to total
k = find(all(ismember(TotalStateTransitions(:,1:2),CurrentPair(1:2)),2));
% Add to counter
TotalStateTransitions{k,3} = TotalStateTransitions{k,3} + CurrentPair{3};
end
end
% AVERAGE OCCURRENCE OF FAULTS ----------------------------------------
% Systems fault
TotalSystemsFault = TotalSystemsFault...
+ [sum(AllProps(i).SystemsFault) length(AllProps(i).SystemsFault)];
% Actuator fault
TotalActuatorFault = TotalActuatorFault + [AllProps(i).ActuatorFault 1];
% Grabber fault
TotalGrabberFault = TotalGrabberFault + [AllProps(i).GrabberFault 1];
end
%% AVERAGE TOTALLED DATA
% Get average of each state, ignoring cases where the state did not occur
for j = 1:size(TotalStateTimes,1)
Props.AvgStateTimes{j,1} = TotalStateTimes{j,1};
Props.AvgStateTimes{j,2} = TotalStateTimes{j,2}/TotalStateTimes{j,3};
Props.AvgStateDistances{j,1} = TotalStateDistances{j,1};
Props.AvgStateDistances{j,2} = TotalStateDistances{j,2}/TotalStateDistances{j,3};
end
% Get average occurrences of state transitions
ProbStateTransitions = TotalStateTransitions;
for j = 1:size(TotalStateTransitions,1)
NextStates = TotalStateTransitions(ismember(TotalStateTransitions(:,1),TotalStateTransitions(j,1)),2);
TransOcc = TotalStateTransitions(ismember(TotalStateTransitions(:,1),TotalStateTransitions(j,1)),3);
TransOcc = sum(cat(1,TransOcc{:}));
ProbStateTransitions{j,3} = TotalStateTransitions{j,3}/sum(TransOcc);
end
% Sort state transitions
Props.ProbStateTransitions = sortrows(ProbStateTransitions,1);
% Average occurrence of systems fault
Props.ProbSystemsFault = TotalSystemsFault(1)/TotalSystemsFault(2);
% Average occurence of actuator fault
Props.ProbActuatorFault = TotalActuatorFault(1)/TotalActuatorFault(2);
% Average occurence of actuator fault
Props.ProbGrabberFault = TotalGrabberFault(1)/TotalGrabberFault(2);
%% SAVE AVERAGED DATA TO SAVE STRUCTURE
save(SaveFile,'Props','AllProps')
[1]魏家辉, 姜春波, 陈浩,等. 基于Matlab的四旋翼无人机控制仿真[J]. 数码世界, 2018.
[2]李永义. 基于Cortex-M4的四旋翼无人机控制系统的研究与实现[D]. 大连理工大学.
[3]郭婕, 金海, 沈昕格. 基于神经网络PID算法的四旋翼无人机优化控制[J]. 电子科技, 2021, 34(10):5.
[4]李怡勇, 沈怀荣. 基于MATLAB的无人机线性控制器设计与仿真[C]// 系统仿真技术及其应用(第7卷)——'2005系统仿真技术及其应用学术交流会论文选编. 2005.
部分理论引用网络文献,若有侵权联系博主删除。