# 质点无人机顶层控制算法系统设计 **Repository Path**: sswun/uavMassDesign ## Basic Information - **Project Name**: 质点无人机顶层控制算法系统设计 - **Description**: 本系统旨在利用MATLAB强大的数值计算与仿真能力,设计并实现一个无人机顶层控制算法的验证系统。该系统包括无人机质点以及环境两大类主要对象,通过定义这些对象的属性、行为及交互函数,模拟无人机与无人车在不同环境条件下的控制效果,从而验证控制算法的可行性和有效性。 系统的优势在于其重点关注于算法本身,高度抽象化具有良好的迁移性。 代码可以在任何一台安装了MATLAB2023及以上的电脑上运行。 - **Primary Language**: Matlab - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-10-18 - **Last Updated**: 2025-10-21 ## Categories & Tags **Categories**: cae, mbse **Tags**: None ## README # **无人机顶层控制算法验证系统设计** 本系统旨在利用MATLAB强大的数值计算与仿真能力,设计并实现一个无人机顶层控制算法的验证系统。该系统包括无人机质点、无人车质点以及环境两大类主要对象,通过定义这些对象的属性、行为及交互函数,模拟无人机与无人车在不同环境条件下的控制效果,从而验证控制算法的可行性和有效性。 系统的优势在于**其重点关注于算法本身,高度抽象化,代码速度基本上只与计算机CPU计算能力、并行计算能力、内存大小及磁盘挂钩,因此其具有良好的迁移性。** **MATLAB版本的代码可以在任何一台安装了MATLAB2023及以上的电脑上运行**。 接下来我们简要介绍一下环境的组成结构及运行方式,详细的一些运行内容可见**Env\_test\_files文件夹,以及运行index.mlx文件,该文件夹中含有一些算法的使用示例**: ### step1:加载环境 ```matlab run path_add.m ``` **step2:无人机** `对于无人机类,其属性有飞行速度`*U*speed`,搜索范围`*U*range`,飞行最大高度`*U*max\-altitude`,负载重量`*U*load`,位置`*U*position`,电量`*U*power`,上升消耗系数`*k*up`,平飞消耗系数`*k*around`,下降消耗系数`*k*down`。` `其中飞行速度决定了无人机类单位时间内能够飞行的路程;搜索范围与任务执行类型相关;飞行最大高度决定了无人机在`XYZ`坐标系中`Z`轴方向的最大位置;负载重量会影响无人机飞行时电量的消耗;位置属性记录了无人机飞行过程中到达过的位置;电量为无人机飞行所需的能量;上升、平飞、下降消耗系数分别反映了无人机上升、平飞以及下降飞行时单位路程消耗的无人机电量。` ```matlab max_speed = 10; % 无人机最大速度 max_range = 60; % 无人机最大搜索范围 max_altitude = 310; % 无人机最大飞行海拔 max_power = 2000; % 无人机最大电量 max_load = 25; % 无人机最大负载 k_up = 0.05; % 无人机上升飞行时消耗系数 k_down = 0.01; % 无人机下降飞行时消耗系数 k_around = 0.03; % 无人机平飞时消耗系数 dt = 0.1; % 系统运行时间微元设置 uav_0 = uav(max_speed,max_range,max_altitude,max_power,max_load,k_up,k_down,k_around,dt); % 初始化无人机 uav_0 ``` ```matlabTextOutput uav_0 = uav - 属性: max_speed: 10 max_range: 60 max_altitude: 310 max_power: 2000 max_load: 25 k_up: 0.0500 k_down: 0.0100 k_around: 0.0300 dt: 0.1000 speed: 0 time: 0 power: 2000 load: 12.5000 position: [0 0 0] ``` 可以看到无人机属性已被初始化,且无人机初始位置位于\[0, 0, 0\]处,让我们重新初始化一下无人机。 ```matlab uav_0 = uav_0.current_properties_reset(8/10*max_speed,0,max_power,max_load/2,[-10,-10,1]); % 重新初始化 uav_0 ``` ```matlabTextOutput uav_0 = uav - 属性: max_speed: 10 max_range: 60 max_altitude: 310 max_power: 2000 max_load: 25 k_up: 0.0500 k_down: 0.0100 k_around: 0.0300 dt: 0.1000 speed: 8 time: 0 power: 2000 load: 12.5000 position: [-10 -10 1] ``` 让我们执行一段简单的无人机飞行任务,接下来我们让无人机从起点出发,飞过下表所列的点: | | | | | :-- | :-- | :-- | | *x*`轴坐标`
| *y*`轴坐标`
| *z*`轴坐标`
| | 0.00
| 0.00
| 0.00
| | 500.00
| 500.00
| 0.00
| | 219.37
| 354.68
| 28.79
| | 190.78
| 377.34
| 10.21
| | 382.76
| 138.01
| 17.56
| | 397.60
| 339.85
| 6.71
| | 93.44
| 327.55
| 22.54
| | 244.88
| 81.31
| 7.65
| | 222.79
| 59.50
| 15.18
| | 323.16
| 249.18
| 20.97
| | | | | ```matlab position_tofly = [0.00 0.00 0.00 500.00 500.00 0.00 219.37 354.68 28.79 190.78 377.34 10.21 382.76 138.01 17.56 397.60 339.85 6.71 93.44 327.55 22.54 244.88 81.31 7.65 222.79 59.50 15.18 323.16 249.18 20.97]; % 待飞行点坐标 for i=1:size(position_tofly, 1) uav_0 = uav_0.FlyToNextPoint(position_tofly(i,:), [], [], 1, 1); end uav_0 ``` ```matlabTextOutput uav_0 = uav - 属性: max_speed: 10 max_range: 60 max_altitude: 310 max_power: 2000 max_load: 25 k_up: 0.0500 k_down: 0.0100 k_around: 0.0300 dt: 0.1000 speed: [3043x1 double] time: [3043x1 double] power: [3043x1 double] load: [3043x1 double] position: [3043x3 double] ``` ```matlab % 将无人机位置绘制出来 figure scatter3(uav_0.position(:,1),uav_0.position(:,2),uav_0.position(:,3)) ``` 此外,无人机类还自带各种灵活的飞行方式。 **step3:无人机与环境交互** `场地类代表了无人机无人车运行的整体环境,主要为设定的地形特征。以森林环境生成为例` ```matlab % 场地范围限制 xmin=0; ymin=0; xmax=200; ymax=200; z_range=10; % 生成树的信息:x,y,z,体积量(0~1),状态(未燃烧0、燃烧1、燃烧且为着火点2, 长方体3,球体或椭球体4) n_tree = 30; % 正常树的数量 n_cuboid = 3; % 长方体的数量 n_Ellipsoid = 3; % 椭球体数量 information_tree = [ xmin,ymin,0,0.9,0; xmax,ymax,0,0.9,0; ]; n_tree = n_tree - size(information_tree,1); x_toadd = xmin+(xmax-xmin)*rand(n_tree,1); y_toadd = ymin+(ymax-ymin)*rand(n_tree,1); z_toadd = z_range*rand(n_tree,1); volume_toadd = 0.5+0.5*rand(n_tree,1); state = zeros(n_tree,1); information_tree=[information_tree;[x_toadd,y_toadd,z_toadd,volume_toadd,state]]; % 长方体信息 x_cuboid = xmin+(xmax-xmin)*rand(n_cuboid,1); y_cuboid = ymin+(ymax-ymin)*rand(n_cuboid,1); z_cuboid = z_range*rand(n_cuboid,1); volume_cuboid = [20*ones(n_cuboid, 1), 20*ones(n_cuboid, 1), 30*ones(n_cuboid, 1)]; state = 3*ones(n_cuboid, 1); information_cuboid = [x_cuboid, y_cuboid, z_cuboid, volume_cuboid, state]; % 椭球体信息 x_Ellipsoid = xmin+(xmax-xmin)*rand(n_Ellipsoid,1); y_Ellipsoid = ymin+(ymax-ymin)*rand(n_Ellipsoid,1); z_Ellipsoid = z_range*rand(n_Ellipsoid,1); volume_Ellipsoid = [20*ones(n_Ellipsoid, 1), 20*ones(n_Ellipsoid, 1), 30*ones(n_Ellipsoid, 1)]; state = 4*ones(n_Ellipsoid, 1); information_Ellipsoid = [x_Ellipsoid, y_Ellipsoid, z_Ellipsoid, volume_Ellipsoid, state]; % 生成树的节点以及场地节点 trees = []; for i=1:size(information_tree,1) temp_tree = tree(information_tree(i,4),information_tree(i,5),information_tree(i,1:3)); trees=[trees;temp_tree]; end for i=1:size(information_cuboid,1) temp_tree = tree(information_cuboid(i,4:6),information_cuboid(i,7),information_cuboid(i,1:3)); trees=[trees;temp_tree]; end for i=1:size(information_Ellipsoid,1) temp_tree = tree(information_Ellipsoid(i,4:6),information_Ellipsoid(i,7),information_Ellipsoid(i,1:3)); trees=[trees;temp_tree]; end field_tree = field([information_tree(:,1:3);information_cuboid(:,1:3);information_Ellipsoid(:,1:3)]); % 绘制图像 figure hold on draw_trees(trees, field_tree) hold off ``` 生成好环境以后,比如说我们要执行对该区域的覆盖搜索任务,则有以下流程: ```matlab % 找到各个树的2D位置 positions_2D = field_tree.positions(:,1:2); % 找到树的外接凸多边形坐标 hullpositions_2D = findConvexHull(positions_2D); r_s = 60; % 无人机搜索半径 task_region = region(hullpositions_2D(1:end-1,:),r_s); task_region = task_region.region_meshing; % 区域离散化 task_region.region_show; ``` ```matlab % 我们利用蛇形搜索算法对区域进行覆盖搜索 % 蛇形搜索算法 snakePath = generateSnakePath(task_region.points_for_drone); % 利用蛇形搜索算法生成无人机路径 % 初始化一个无人机,并执行飞行过程 altitude_Cruising = field_tree.zmax; % 巡航海拔高度 uav_1 = uav_0.current_properties_reset(8/10*max_speed,0,max_power,max_load/2,[-10,-10,1]); for i=1:length(snakePath) uav_1 = uav_1.FlyToNextPoint_flexible([snakePath(i,:),altitude_Cruising],[],[],trees,field_tree); end % 计算各评价指标,分析算法效果 path1 = uav_1.position(1:5:end,1:2); % 无人机路径 radius = 60; % 无人机搜索半径 polygon = task_region.profile; % 四边形 [coverageRate, ~] = calculateCoverageAndRedundancy(polygon, path1, radius); pathLength = calculatePathLength(path1); fprintf('覆盖率: %.2f%%\n', coverageRate * 100); ``` ```matlabTextOutput 覆盖率: 100.00% ``` ```matlab fprintf('路程长度: %.2f%\n', pathLength); ``` ```matlabTextOutput 路程长度: 1027.67 ``` ```matlab figure hold on draw_trees(trees, field_tree) scatter3(uav_1.position(:,1),uav_1.position(:,2),uav_1.position(:,3)) hold off ``` 读者可自行对系统进行拓展,以执行更加复杂的任务。