✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
最初,一架无人机盘旋飞行,试图找到一朵云,一旦找到它,它就会调用更多的无人机绕着云飞行,并跟踪对应于污染物浓度 1.0 的云的边界。目标是让无人机在云层周围均匀分布。每架无人机可以飞行 30 分钟,之后需要返回基地 (0,0) 充电。
思路:为了在云周围均匀分布,无人机计算云的凸包(基于采样点)并根据其他无人机的位置加速/减速。如果云的周长变得太大,就会调用新的无人机绕云飞行。 避免碰撞规则:为了实现这一点,将每架无人机建模为一个电子,每架无人机对所有其他无人机(足够接近)施加排斥力。
function sim_start
% load cloud data
% choose a scenario
% load 'cloud1.mat'
close all;
load 'cloud1.mat'
% time and time step
t = 0;
dt = 1;
last_launch = 1; %time when the last UAV was launched
% open new figure window
figure
hold on % so each plot doesn't wipte the predecessor
%create initial UAVs
id_count = 1; %id for the next spawned UAV
num_uavs = 1; %number of active UAVs
uav(num_uavs,1) = UAVsim;
ang = rand*2*pi;
uav(1) = UAVsim(0,0,ang,1);%x,y,ang,id
old_msg = zeros(num_uavs,5); %keeps the messages that have to be processed for next iterration
spawn_new_uav = false; %if this becomes true, launch a new uav
for kk=1:3600
new_msg = zeros(num_uavs,5); %create an empty matrix for the new messages
t = t + dt;
spawn_new_uav = false;
i=1;
while i<=num_uavs
[x,y,p,id,new_uav] = uav(floor(i)).step(dt,t,cloud,old_msg);
new_msg(i,1:5) = [x,y,p,id,new_uav]; %get the message from the current UAV
if (new_uav)
spawn_new_uav = true;
end
if uav(i).state == 5
%if UAV ran out of battery
uav(i)=[];%remove the current UAV
i=i-1;
num_uavs = num_uavs-1;
end
i=i+1;
end
if num_uavs<1
%sanity check
return;
end
%plot the UAVs and the cloud
cla
title(sprintf('t=%.1f secs pos=(%.1f, %.1f) Concentration=%.2f',t, uav(1).get_real_x,uav(1).get_real_y,uav(1).p))
for i=1:num_uavs
text(uav(i).get_real_x()-14, uav(i).get_real_y()-5,sprintf('%d',uav(i).id));
if uav(i).t_alive>15
%I assumed that during take off, the UAV does not need to
%do collision avoidance (until it reaches the required
%height) so I do not plot a circle around it for the first
%15 seconds.
% this is useful in the case the cloud spreads over the
% base (0,0);
plot_circle(uav(i).get_real_x(),uav(i).get_real_y(),25);
end
end
cloudplot(cloud,t);
old_msg = new_msg;
if spawn_new_uav && (kk-last_launch>25)
last_launch = kk+1;
num_uavs = num_uavs+1;
id_count = id_count+1;
ang = rand*2*pi;
uav = [uav;UAVsim(0,0,ang,id_count)];
end
end
end
function plot_circle(x,y,r)
%plots a circle at (x,y) corrdinates with radius r;
%quality of the plotted circle is not very good but it is decent enough;
ang = 0:0.5:2*pi;
xp = r*cos(ang);
yp = r*sin(ang);
plot(x+xp,y+yp);
end
[1]李文超, 袁冬莉. 基于机动目标模型的无人机视场跟踪仿真研究[J]. 计算机测量与控制, 2011, 19(2):4.
[2]蔡中轩. 无人机群体分布式导引关键技术研究与系统实现[D]. 国防科技大学, 2017.
❤️ 关注我领取海量matlab电子书和数学建模资料
❤️部分理论引用网络文献,若有侵权联系博主删除