0
点赞
收藏
分享

微信扫一扫

【无人机编队】基于匈牙利算法无人机队形重构集群仿真Matlab代码

李雨喵 2022-01-04 阅读 97

1 简介

四旋翼无人机具有成本较低、设备简单、飞行时间灵活等特点,近些年被广泛应用于军事和民用领域,如目标侦察、应急救援、农业植保、无人机灯光表演。随着任务复杂度的增加,单架无人机往往难以满足任务需求,因此无人机集群控制及其应用由此成为目前的研究热点,多无人机集群能够提高执行任务效率和灵活度。无人机队形变换控制方法是实现多无人机编队飞行的前提,集群无人机队形重构问题是我们要考虑的一个重要问题,让每架无人机都能从初始位置无碰撞的到达最终位置,进而保证队形重构过程中代价最小或能耗最优。其中目标分配问题最多利用匈牙利算法进行解决,但是在多无人机轨迹规划时普遍存在计算难度大、规划时间增长、规划效率难以满足实际需求的问题。因此,探索计算简便、效率高的多无人机路径规划算法是目前迫切需要的。

(1)实验描述

十九架无人机组成的编队如图2.1所示,由F队形切换至Z队形,如果忽略本身以及外在约束条件的情况下,将会有多种不同的移动方案。但实际情形下无人机飞行距离越长,耗能也就越多,部分无人机到达目标的距离过长,消耗电力过多,从而提前降落。

图2.1: 编队实景图

使用传统匈牙利算法来解决队形变换的目标分配问题,其编队切换仿真图如下图,其中绿色方块表示无人机在F队形中的位置,红色圆点表示Z队形中无人机集群所要到达的各目标航点,黑色直线表示经分配后无人机由初始位置到达目标位置的直线路径。

 

图2.2: 匈牙利算法路径图

由上图可以看出,部分无人机到达目的地的直线路径过长,而大部分无人机初始位置与目标位置重合耗能少。移动路径长短不一,造成无人机耗能相差较大。所以我们需要寻求一种移动方式,使各个无人机移动路径长度趋于一致。

(2)实验要求

1、改进分配方案,使无人机在编队切换过程中飞行路径相近,飞行至目标航点时间一致,避免无人机耗能相差较大的问题。

2、集群无人机空中个别无人机能量不足或故障情况需退出,编队无人机数目发生变化,为维持编队队形需重新规划各无人机所在位置。

解决方案

集群无人机编队重构中考虑时间的一致性问题,可扩展研究切换过程中各无人机的距离约束,规划编队重构中各无人机路径长度,在同样移动速度下,使集群无人机在避免碰撞的情形下尽量同时到达目标点。通过考虑无人机编队切换的距离大小,若在编队切换中各个无人机移动的距离相近,那么在避免碰撞的情况下到达指定位置,使整个机群飞至目标航点时间趋于一致。

和匈牙利算法类似的是,我们同样使位于变换图形边缘的九个重合目标不发生移动,但其余十个目标均发生移动(匈牙利算法中除边缘九个点还存在两个重合点,详情可见图2)。通过一个10*10的代价矩阵(将移动距离设为代价),利用算法寻求出一个基于移动距离一致性为目标的优化分配方案。

2 部分代码

clear all
%C=[2 15 13 4;10 4 14 15;9 14 16 13;7 8 11 9];

symbol   = 'bo';  % 打点颜色符号(b. 蓝点; bo蓝圈)
symbol1 = 'wo';  % 打点颜色符号(w. 白点; wo白圈)
  
dt = 1; % 采样步距
v = 1; % 速度
max_time = 1000; % 最大运行时间

% 两点之间距离
width = 10;

% 做 8*8 矩阵 19 个点 字符:F
% array_f = [0 1 1 1 1 1 1 0;
%           0 0 1 0 0 0 0 0;
%           0 0 1 0 0 1 0 0;
%           0 0 1 1 1 1 0 0;
%           0 0 0 0 0 1 0 0;
%           0 0 1 0 0 0 0 0;
%           0 0 1 0 0 0 0 0;
%           0 1 1 1 0 0 0 0];
%        
% % 做 8*8 矩阵 19 个点 字符:Z
% array_z = [0 1 1 1 1 1 1 0;
%           0 1 0 0 0 1 0 0;
%           0 0 0 0 1 0 0 0;
%           0 0 0 1 0 0 0 0;
%           0 0 0 1 0 0 0 0;
%           0 0 1 0 0 0 0 0;
%           0 0 0 0 0 1 0 0;
%           1 1 1 1 1 1 0 0];
% 
% T0=zeros(8,3);
% T1=zeros(8,3);
% m=1;n=1;
% for i=1:8                   %% 去除共同点,得到无共同点的F、Z坐标集
%     for j=1:8
%         if array_f(i,j) ~= array_z(i,j) && array_f(i,j) == 1
%             T0(m,:) = [i,j,0];
%             m = m+1;
%         elseif array_f(i,j) ~= array_z(i,j) && array_z(i,j) == 1
%             T1(n,:) = [i,j,0];
%             n = n+1;
%         elseif array_z(i,j) == array_f(i,j) && array_z(i,j)==1           % 如果为共同点,将矩阵中标记 1变为2
%             array_z(i,j) = 2;
%             array_f(i,j) = 2;
%         end
%     end
% end

% array_f
% array_z
% T0
% T1

%------------------------------------------------------------------------
% 测试加中间重合点
array_f =[0     2     2     2     2     2     2     0;
    0     0     1     0     0     0     0     0;
    0     0     1     0     0     1     0     0;
    0     0     1     1     1     1     0     0;
    0     0     0     0     0     1     0     0;
    0     0     1     0     0     0     0     0;
    0     0     1     0     0     0     0     0;
    0     2     2     2     0     0     0     0;];

array_z =[0     2     2     2     2     2     2     0;
    0     1     0     0     0     1     0     0;
    0     0     0     0     1     0     0     0;
    0     0     0     1     0     0     0     0;
    0     0     0     1     0     0     0     0;
    0     0     1     0     0     0     0     0;
    0     0     0     0     0     1     0     0;
    1     2     2     2     1     1     0     0;];

T0 =[2     3     0;
    3     3     0;
    3     6     0;
    4     3     0;
    4     4     0;
    4     5     0;
    4     6     0;
    5     6     0;
    6     3     0;
    7     3     0;] ;
T1 =[2     2     0;
    2     6     0;
    3     5     0;
    4     4     0;
    5     4     0;
    6     3     0;
    7     6     0;
    8     1     0;
    8     5     0;
    8     6     0;];





%--------------------------------------------------------------------------------------------






%disp(array_z);
t=length(T1);

C=ones(t,t);           
   for i=1:t          
    for j=1:t 
      a=(T0(i,1)-T1(j,1))^2;
      b=(T0(i,2)-T1(j,2))^2;
      c=(T0(i,3)-T1(j,3))^2;
      d=sqrt(a+b+c);
      C(j,i)=d;
    end     
   end
 c =C; 
 disp(c);

%----------------------------------------------------------------------------------------
% 进行点匹配


% [Matching,Cost]=Hung4_Average(C);
% for i=1:t
%     for j=1:t
%         if Matching(i,j)==1
%             M(1,i) = C(i,j);
%         end
%     end
% end
% 
% ave_M = mean(M);
% 

[M,C_select,cost,Mean_square_erro] = zq_ave(C);
% 将匹配矩阵映射到一维数组中


disp('最优匹配为:');
disp(M);
disp('最优代价为:');
C_select
disp('最优解为:');
cost
disp('最优均方差为:');
Mean_square_erro

%---------------------------------------------------------------------------------------%
%     建模 

%场景的范围       
xmin = 0;xmax = width * 8 + 20;ymin = 0;ymax = width * 8 + 20; 

axis([xmin xmax ymin ymax]); %设定坐标范围
figure(1);
hold on ; %保留绘图内容

% 初始化矩阵
id_sta_addr = zeros(19,2);
id_sto_addr = zeros(19,2);
id_cur_addr = zeros(19,2);
id_tm = zeros(19, 1);         %保存移动时间
index = 1;

% 给飞机实时编号,行扫描 安置无人机初始位置 实际上就是按比例显示F
for i = 1: 8
for j = 1: 8 
       % start 坐标
       if array_f(i, j) == 1
           % 做矩阵点位置应该实际场景
          [id_sta_addr(index, 1), id_sta_addr(index, 2)] = calc(i, j, width);
           % 安置飞机
           plot(id_sta_addr(index, 1), id_sta_addr(index, 2), 'bo');
           index = index + 1;                    
       end
end
end  
for i = 1: 8
for j = 1: 8 
       % start 坐标
       if array_f(i, j) == 2         
           % 做矩阵点位置应该实际场景
          [id_sta_addr(index, 1), id_sta_addr(index, 2)] = calc(i,j, width);
           % 安置飞机
           plot(id_sta_addr(index, 1), id_sta_addr(index, 2), 'ro');
           index = index + 1;                    
       end
end
end

   
pause(2);
%%算法替代部分 这里只是模型验证

% 测试部分--------------------------------------------------
id_sto_addr = id_sta_addr;

% calc(2, 2, width); 中(2,2)表示无人机终止位置坐标,width表示位宽
%id_sto_addr(7, 1); 中(8,1)表示8 表示 ID, 1 表示 X坐标, 2 表示Y坐标
% 表示 ID 7的点 移动到(2,2) 的位置
for i=1:t
   p = M(1,i);
  [id_sto_addr(i, 1) , id_sto_addr( i, 2)] =calc(T1(p,1), T1(p,2), width);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%计算 各个无人机运行时间
for i=1:19
id_tm(i)=sqrt((id_sto_addr(i, 1)-id_sta_addr(i, 1))^2 + (id_sto_addr(i, 2)-id_sta_addr(i, 2))^2) / v; %计算这个 Step 的移动时间
end

%获取最大运行时间
max_tm = max(id_tm);
%max_tm_id = find(max_tm);

%状态 是否已经到达指定位置
id_status = zeros(19,1);
% id scan



id_cur_addr = id_sta_addr;

for t=0:dt:max_time  
    
   for index = 1:19
       % 单点移动
      [id_cur_addr(index, 1), id_cur_addr(index, 2), id_status(index)] = move(index,       ...
                                                                               id_sta_addr, ...
                                                                               id_sto_addr, ...
                                                                               id_cur_addr, ...
                                                                               id_status,   ...
                                                                               t,           ...
                                                                               id_tm,       ...
                                                                               v);

   end
   pause(0.1);
   
%判断是否为空矩阵
   if isempty(find(id_status == 0))
       break;
   end

end


fprintf(' 运行时间为:%d s \r\n', t);

3 仿真结果

4 参考文献

[1] 张思宇. 多无人机协同航迹规划及其控制方法研究[D].北京理工大学,2016.

[2] 卢燕梅,宗群,张秀云,鲁瀚辰,张睿隆.集群无人机队形重构及虚拟仿真验证[J].航空学报,2020,41(04):248-259.

[3] 毛琼,李小民,王正军.基于规则的无人机编队队形构建与重构控制方法[J].系统工程与电子技术,2019,41(05):1118-1126.

[4] 赵凌楚.多旋翼无人机编队队形变换算法研究[J].信息通信,2020(03):57-59.

[5] 林倩玉. 多无人机协同编队控制算法研究[D].哈尔滨工业大学,2018.

[6] 吴宇,梁天骄.基于改进一致性算法的无人机编队控制[J/OL].航空学报:1-18[2020-06-26].http://kns.cnki.net/kcms/detail/11.1929.V.20200521.1555.012.html.

[7] 马培蓓,雷明,纪军.基于一致性的多无人机协同编队设计[J].战术导弹技术,2017(02):86-90.

[8] 陈杰敏,吴发林,耿澄浩,徐珊.四旋翼无人机一致性编队飞行控制方法[J].航空兵器,2017(06):25-31.

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

5 完整MATLAB代码与数据下载地址

见博客第一条

举报

相关推荐

0 条评论