基于粒子群结合遗传算法PSO-GA优化算法设计自主VTOLMatlab代码,通过Unreal Engine模拟,BlenderGIS实现地形映射,整合实时空中交通数据
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。
🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。
🔥 内容介绍
一、引言
自主垂直起降(VTOL)无人机在现代航空领域具有广泛的应用前景,如物流配送、航空摄影、搜索救援等。为了提升其性能和自主决策能力,采用高效的优化算法至关重要。粒子群优化(PSO)和遗传算法(GA)相结合的 PSO - GA 优化算法能够综合两者优势,有效优化 VTOL 的设计参数。同时,利用 Unreal Engine 强大的模拟功能、BlenderGIS 实现地形映射以及整合实时空中交通数据,可以构建逼真的模拟环境,对优化后的 VTOL 进行全面测试和验证。
二、PSO - GA 优化算法原理
粒子群优化算法(PSO)
遗传算法(GA)
- 基本原理
:GA 模拟生物进化过程,通过选择、交叉和变异等遗传操作对种群进行迭代进化。种群中的每个个体代表一个可能的解,其适应度由目标函数评估。
- 遗传操作
:
- 选择
:根据个体适应度,采用轮盘赌选择法等方式,选择适应度高的个体进入下一代,使优良基因得以保留。
- 交叉
:对选中的个体进行基因交换,产生新的个体,模拟生物的交配过程,促进种群的多样性。
- 变异
:以一定概率对个体的某些基因进行随机改变,避免算法陷入局部最优。
- 选择
PSO - GA 优化算法结合
- 结合方式
:PSO - GA 优化算法结合了 PSO 的快速收敛性和 GA 的全局搜索能力。在算法开始时,利用 GA 进行全局搜索,快速定位到解空间中的有希望区域;然后,切换到 PSO 算法在该区域内进行局部搜索,以获得更精确的解。
- 优势
:这种结合方式能够避免 PSO 算法易陷入局部最优和 GA 算法收敛速度慢的缺点,提高优化效率和结果的质量。
三、基于 PSO - GA 的自主 VTOL 设计
VTOL 设计参数
- 硬件参数
:包括机翼形状、尺寸,发动机功率、推力,机身重量、重心位置等。这些参数直接影响 VTOL 的飞行性能,如速度、续航里程、机动性等。
- 控制参数
:如飞行姿态控制参数(俯仰、滚转、偏航控制增益),悬停控制参数等。合理的控制参数能够确保 VTOL 在不同飞行状态下的稳定性和精确性。
⛳️ 运行结果
📣 部分代码
properties (Nontunable)
mapGridSize = 0.2;
downsamplePercent = 0.1;
quadCopterROI = [-2 2 -2 2 -2 2];
sensorPoseWRTUAV = rigidtform3d([90 90 0],[0 0 0]);
end
properties(Access = private)
CurScan
vSet
absTform
viewId
end
methods(Access = protected)
function num = getNumOutputsImpl(obj)
% Define total number of outputs for system with optional
% outputs
num = 2;
end
% function [sz1, sz2, sz3] = getOutputSizeImpl(obj)
function [sz1, sz2] = getOutputSizeImpl(obj)
% Return size for each output port
sz1 = [1 1];
sz2 = [600000 3];
end
% function [dt1, dt2, dt3] = getOutputDataTypeImpl(obj)
function [dt1, dt2] = getOutputDataTypeImpl(obj)
% Return data type for each output port
dt1 = "boolean";
dt2 = "double";
end
% function [o1, o2, o3] = isOutputComplexImpl(obj)
function [o1, o2] = isOutputComplexImpl(obj)
% Return true for each output port with complex data
o1 = false;
o2 = false;
end
% function [o1, o2, o3] = isOutputFixedSizeImpl(obj)
function [o1, o2] = isOutputFixedSizeImpl(obj)
% Return true for each output port with fixed size
o1 = true;
o2 = true;
end
function setupImpl(obj)
% Perform one-time calculations, such as computing constants
obj.vSet = pcviewset;
obj.absTform = rigidtform3d;
obj.CurScan = pointCloud(zeros(32, 1083, 3));
obj.viewId = 1;
end
function [isMapDone, pcMap] = stepImpl(obj, ptcloud, count)
% Implement algorithm. Calculate y as a function of input u and
% discrete states.
isMapDone = false;
pcMap = nan(600000, 3);
% Convert the location values to point cloud object
curPc = pointCloud(ptcloud);
% Transform the point cloud based on the lidar sensor pose
% w.r.t. the UAV
% curPc = pctransform(curPc,obj.sensorPoseWRTUAV);
% Remove the quadcopter points from the point cloud
quadCopterIdx = findPointsInROI(curPc, obj.quadCopterROI);
allIndex = 1:curPc.Count;
ia = ismember(allIndex, quadCopterIdx);
curPc = select(curPc, ~ia', OutputSize="full");
curDownsampledPc = pcdownsample(curPc, "random", obj.downsamplePercent);
% Initialize the pcviewset object
if obj.viewId == 1
obj.vSet = addView(obj.vSet, obj.viewId, obj.absTform, "PointCloud", curPc);
obj.CurScan = curDownsampledPc;
obj.viewId = obj.viewId + 1;
return;
end
% Take every 5th scan
if rem(count,5) == 0
prevDownsampledPc = obj.CurScan;
relTform = pcregistericp(curDownsampledPc, prevDownsampledPc, Metric="planeToPlane");
obj.absTform = rigidtform3d( obj.absTform.A * relTform.A );
obj.vSet = addView(obj.vSet, obj.viewId, obj.absTform, "PointCloud", curPc);
obj.vSet = addConnection(obj.vSet, obj.viewId-1, obj.viewId, relTform);
obj.CurScan = curDownsampledPc;
obj.viewId = obj.viewId + 1;
end
if rem(count, 50) == 0
ptClouds = obj.vSet.Views.PointCloud;
absPoses = obj.vSet.Views.AbsolutePose;
pc = pcalign(ptClouds, absPoses, obj.mapGridSize);
pc = pctransform(pc, rigidtform3d([90 90 180], [0 0 0]));
pcshow(pc,Parent=gca);
end
if rem(count, 400) == 0
ptClouds = obj.vSet.Views.PointCloud;
absPoses = obj.vSet.Views.AbsolutePose;
ptCloudMap = pcalign(ptClouds, absPoses, obj.mapGridSize);
ptCloudMap = pctransform(ptCloudMap, rigidtform3d([90 90 180], [0 0 0]));
isMapDone = true;
pcMap(1:ptCloudMap.Count,:) = ptCloudMap.Location;
obj.vSet = pcviewset;
