用户一默是一诺 發表於 2022-12-7 23:25:00

基于Flocking算法的多智能体编队matlab仿真

<p id="main-toc">UP目录</p>
<p id="">一、理论基础</p>
<p id="">二、核心程序</p>
<p id="">三、测试结果</p>
<hr>
<h1 id="%E4%B8%80%E3%80%81%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80">一、理论基础</h1>
<p> Flocking(有时也称为是warming或herding),拥有4项简单的规则,把它们组合在一起时,为自治主体群给出一个类似于鸟群、鱼群的群体行为的逼真形式。多智能体集群运动控制技术,是未来大规模无人机集群搜索、大规模自主编队表演技术、超远距无人机集群中继通信等一系列应用场景的技术基石。如何让分布式集群拥有超强避障能力,更是现有研究中的重点。现有的比较成熟的方案是以建模生物体集群运动为核心出发的,通过将障碍物比作虚拟的智能体来实现避障,这种方案又被称为Flocking算法。<br>在本方案中,考虑由N个α-智能体组成的智能群体, 其动态方程为:</p>
<p><img src="https://img2023.cnblogs.com/blog/2997677/202212/2997677-20221207232342730-1092243150.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在Flocking算法中,定向行为规则可以分为分离原则、列队原则、聚合原则、躲避原则<br>      分离原则:定向时要避免与本地flock同伴拥挤。即定时检测邻近同伴,避免拥挤;<br>      列队原则:驶向本地flock同伴的平均航向。即检测邻近同伴航向、速度,获取平均值并调整自己;<br>      聚合原则:定向时朝着本地flock同伴的平均位置移动。即检测邻近同伴,平均位置然后调整其匹配航向;<br>      躲避原则:使避免撞上局部区域内的障碍或敌人。即“向前看一段距离”,遇到障碍物、敌人调整航向、速度进行躲避。</p>
<h1 id="%E4%BA%8C%E3%80%81%E6%A0%B8%E5%BF%83%E7%A8%8B%E5%BA%8F">二、核心程序</h1>
<p>....................................................<br>clear;<br>close all;<br>clc;<br>%% Parameters 初始化参数<br>num_agents = 100;<br>t_gap=1;               % 迭代间隔<br>queue_gap=15;          % 队形间隔<br>queue_vy=12;<br>queue_vx=13;<br>queue_r=40;<br>r_c=20;                % 交互范围(半径)<br>k=1.2;               % 晶格的ratio<br>d=r_c/k;               % 晶格的scale(表示两两智能体之间的距离(论文中公式5))<br>v_0=2;               % 初始速度<br>v_limit=0;             % 最大速度<br>efs = 1;               % sigma-norms parameter <br>h=0.4;               % 设置bump function的分割点(公式10)<br>d_o = r_c;             <br>r_c_sigma = sigma_norm(r_c,efs);         % r_c的σ范数<br>d_sigma = sigma_norm(d,efs);             % d的σ范数<br>map_width = 400;                         % width of a squre map<br>map_res = 0.5;                           % width of a grid to play obstacles pixel<br>c1=0.2;c2=0.5;c3=0.2;c4=0.1;c5=10;c6=0.01;<br>x = zeros(num_agents,2);               % current position<br>x_1 = zeros(num_agents,2);               % previous position<br>v_1 = zeros(num_agents,2);               % previous velocity<br>x_r0= zeros(num_agents,2);               % x_r0:用来存储指定的队形信息<br>v_r_1st_point=300;<br>path_num = zeros(1000,2,num_agents);<br>v_r=;<br>%% 生成不同编队队形的智能体坐标<br> <br>% % 使α-agent群集呈现竖“一”(指定预期坐标)<br>for a=1:1:num_agents<br>    b=v_r_1st_point-(a-1)*queue_gap;      <br>    x_r1(a,2)=b;<br>end<br> <br>% % 使α-agent群集呈现V字形<br>for a=1:1:num_agents<br>    queue_vy=12;<br>    b=250-(a-1)*queue_vy;<br>    x_r2(a,2)=b;<br>    if a&lt;=num_agents/2<br>      c=100+queue_vx*(a-1);<br>      x_r2(a,1)=c;<br>    else<br>      c=100+queue_vx*(num_agents-a);<br>      x_r2(a,1)=c;<br>    end<br>end<br> <br>% % 坐标更新后的竖“一”<br>for a=1:1:num_agents<br>    b=v_r_1st_point-(a-1)*queue_gap;<br>    x_r3(a,2)=b;<br>    x_r3(a,1)=200+queue_vx*ceil(num_agents/2);<br>end<br> <br>% % 使α-agent群集呈现倒V字形<br>for a=1:1:num_agents<br>    b=250-(a-1)*queue_vy;<br>    x_r4(a,2)=b;<br>    if a&lt;=num_agents/2<br>      c=340+queue_vx*ceil(num_agents/2)-queue_vx*(a-1);<br>      x_r4(a,1)=c;<br>    else<br>      c=340+queue_vx*ceil(num_agents/2)-queue_vx*(num_agents-a);<br>      x_r4(a,1)=c;<br>    end<br>end<br> <br>% % 使α-agent群集呈现圆形<br>for a=1:num_agents<br>    theta=2*pi/num_agents;<br>    xo=;<br>    x_r5(a,1)=xo(1)+queue_r*sin(a*theta);<br>    x_r5(a,2)=xo(2)-queue_r*cos(a*theta);<br>end<br> <br>% % 坐标再次更新后的横“一”<br>for a=1:1:num_agents<br>    b=v_r_1st_point-(a-1)*queue_gap;<br>    x_r6(a,2)=b;<br>    x_r6(a,1)=580+2*queue_r;<br>end<br>%   x_r=; <br> <br>% %initializing agents 随机生成坐标<br>x_1(:,1)=20*rand(num_agents,1);                        % x_1第一列是agent的x初始坐标 <br>x_1(:,2) = map_width/2*rand(num_agents,1)+map_width/4;   % x_1第二列是agent的y初始坐标<br>counter = 0;                                             % 用于记录循环次数<br>%% main loop 主循环<br>while(true)<br>    counter=counter+1;<br>    u_alpha=zeros(num_agents,2);                % alpha-agents correspond to UAVs   初始化alpha agent<br>    u_gamma=zeros(num_agents,2);                % gamma-objects which model the effect of “collective objective” of a group初始化gamma agent<br>    dist_gap = get_gap(x_1);                  % 获取间隔距离<br>    dist_2 = squd_norm(dist_gap);               % 距离间隔平方和<br>    dist = sqrt(dist_2);                        % 对距离平方和开方获得距离<br>    dist_sigma=sigma_norm(dist_gap,efs);<br>    adj = bump_func(dist_sigma/r_c_sigma,h);    % 求邻接矩阵<br>    nbr = zeros(num_agents);                  % 初始化相邻agent矩阵参数<br>    nbr(dist&lt;=r_c) = 1;                         % 如果两个agent距离小于r_c就算是邻居<br>    nbr = nbr - diag(diag(nbr));                % set diagonal to 0 取中心元素<br>    adj = nbr.*adj;                           % 得到邻接矩阵<br>%% 计算过α-agent的控制输入<br>% % 这个控制输入主要包括两部分<br>% % 1.目标对α-agent的吸引力<br>% % 2.α-agent之间的相互作用力<br>   <br>   % % 计算γ-agent对每个α-agent的吸引力<br>   % u_gamma=-c1*limit(x_1-repmat(x_r,size(u_gamma,1),1),1)-c2*(v_1-repmat(v_r,size(u_gamma,1),1)); <br>   u_gamma=-c1*limit(x_1-x_r0,size(u_gamma,1))-c2*(v_1-repmat(v_r,size(u_gamma,1),1)); <br>   <br>   % % 计算α-agent之间的相互作用力<br>    for a=1:1:num_agents                % 选定一个α-agent<br>      for b=1:num_agents            % 通过循环的方式依次计算每个α-agent对选定α-agent的作用力的合力<br>            kk=x_1(b,:)-x_1(a,:);<br>            u_alpha(a,:)=u_alpha(a,:)+c3*adj(a,b)*phi_func(sigma_norm_2(kk,efs)-d_sigma)*sigma_norm_gradient(kk,efs)+c4*adj(a,b)*(v_1(b,:)-v_1(a,:));   % 将选定α-agent受到的合力一次叠加<br>%         u_alpha(a,:)=u_alpha(a,:)+c3*nbr(a,b)*action_function( sigma_norm_2(x_1(a,:)-x_1(b,:),efs),r_c_sigma,d_sigma,h )*sigma_norm_gradient(x_1(b,:)-x_1(a,:),efs)+c4*nbr(a,b)*(v_1(b,:)-v_1(a,:));<br>      end<br>    end<br>%% 根据gamma和alpha agent得到v和x(卡尔曼滤波),前提在一个运动周期内速度不变。<br>    u=u_gamma+u_alpha;                   % 计算控制输入         <br>    v = v_1 + u*t_gap;                   % 当前时刻的速度估计 = 前一时刻的速度 + 速度增量<br>    v_1=v;                               % 不考虑噪声,将估计值直接认为当前时刻的真实值<br>    x(:,1:2) = x_1(:,1:2) + 0.8*v_1*t_gap;   % 根据速度计算当前时刻的位置x,x_1表示前一时刻的位置<br>    x_1 = x;<br>    for nn = 1:1:num_agents<br>       path_num(counter,1,nn) = x(nn,1);<br>       path_num(counter,2,nn) = x(nn,2);<br>    end <br>%% 队形变换<br>   if (counter&lt;100)<br>      x_r1=x_r1+v_r*t_gap;<br>      x_r0=x_r1;<br>   elseif (counter&lt;200)<br>      x_r2=x_r2+v_r*t_gap;<br>      x_r0=x_r2;<br>   elseif counter&lt;300<br>      x_r3=x_r3+v_r*t_gap;<br>      x_r0=x_r3;<br>   elseif counter&lt;400<br>      x_r4=x_r4+v_r*t_gap;<br>      x_r0=x_r4;<br>   elseif counter&lt;500<br>      x_r5=x_r5+v_r*t_gap;<br>      x_r0=x_r5;<br>   else<br>      x_r6=x_r6+v_r*t_gap;<br>      x_r0=x_r6;<br>   end<br> <br>%% plot<br>    hold off<br>    plot(x(:,1),x(:,2),'ro');<br>    hold on<br>    axis();<br>    plot(x_r0(:,1),x_r0(:,2),'k*');<br>    if counter&gt;650<br>         break;<br>    end<br>    hold on<br> <br>%   text(340,150,'★');<br>    %% 通信agent画线<br>    for ii=1:1:num_agents<br>      for jj=1:1:num_agents<br>            if nbr(ii,jj)&gt;0<br>                plot(,);<br>            end<br>      end<br>    end<br>    %% <br>    scatter(x(:,1),x(:,2),20,'black')<br>%      plot(x_r1(:,1),x_r1(:,2),'r*');<br>    pause(0.1);<br>end<br>figure(1)<br>%hold off<br>for tt = 1:1:num_agents<br>for t = 1:1:1000<br>    plot(path_num(t,1,tt),path_num(t,2,tt),'k.','MarkerSize',1);<br>    hold on;<br>end<br>end</p>
<hr>
<h1 id="%E4%B8%89%E3%80%81%E6%B5%8B%E8%AF%95%E7%BB%93%E6%9E%9C">三、测试结果</h1>
<p><img src="https://img2023.cnblogs.com/blog/2997677/202212/2997677-20221207232436305-1665140779.png"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2023.cnblogs.com/blog/2997677/202212/2997677-20221207232443609-1733467340.png"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2023.cnblogs.com/blog/2997677/202212/2997677-20221207232449887-10777686.png"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2023.cnblogs.com/blog/2997677/202212/2997677-20221207232456627-618441402.png"></p>
<p>&nbsp;</p>
<p>&nbsp;UP0009</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/matlabfpga/p/16964902.html
頁: [1]
查看完整版本: 基于Flocking算法的多智能体编队matlab仿真