无人机编队自主避障系统

2024-01-02 13:22:31
? 为了充分发挥多机编队的优点,加强编队飞行的灵活性以应对复杂、突发的 应用场景,多机编队协同避障问题与多机自主编队跟踪控制问题成为亟待解决的 关键问题。本文以实现多机精确可靠编队飞行为研究重点,结合实际无人机编队 飞行任务需求,设计无人机精确编队协同避障与跟踪控制策略,综合解决编队个 体之间以及与周围环境障碍物的防撞安全性,在此基础上构建数值仿真系统,对 所研究方法进行仿真验证,充分挖掘复杂环境下多机编队飞行能力。
? 针对多飞行器快速响应任务需求,研究基于优化算法的多飞行器队形构成方 法,形成可行的编队飞行方案。
? 针对巡航阶段静态多障碍物环境及动态障碍物环境下实时避障的需求,开展 多机动态协同避障方法研究。
? 在多机编队飞行场景下,研究多机自主编队保持技术,完成多机自主协同编 队飞行任务,并开展多机编队保持控制仿真验证。
总体实施方案如下:
(1)针对多无人机编队快速任务响应队形变换需求,采用智能优化算法对 多机编队队形优化与重构进行研究,快速规划无人机编队队形重构过程中的运动 轨迹,满足实时性需求和不同任务的多机编队需求,以保证编队整体规划路径的 可飞行性。
(2)针对巡航阶段多机编队队形保持的需求,采用虚拟结构法来实现多机 自主分布式编队保持控制,在虚拟长机状态估计算法的基础上,设计了具有线性 混合器的分布式编队保持控制器。(3)针对协同避障问题,设计基于改进人工势场的无人机编队避障算法, 将人工势场应用到空间范围。建立人工势场后基于动力学条件进行编队飞行,目 标点对无人机施以引力,障碍物对无人机产生斥力,使无人机在障碍物环境中顺 利到达目的地,可以满足不同障碍物场景的多机编队飞行需求。同时,针对动态 障碍物环境,设计一种改进的动态窗口法以保证在遭遇突发威胁时多机编队能够 根据实时环境信息在有限的时间及计算资源的条件下,规划出躲避威胁的可行航 迹。
(4)本课题的仿真系统在 Matlab/Simulink 中进行搭建,首先根据已知的气 动力模型、几何数据模型、质量特性模型、控制律模型及作动器模型等构建飞行 器的单机控制仿真模型。然后基于该模型,通过编队控制器、避障控制器及轨迹 跟踪控制器等搭建编队控制与避障系统,在数值仿真上分析方案的可行性与控制 精度,对关键技术做出验证和评估结论。
三维无障碍物如下:
整个系统搭建结果如下:

部分代码如下:

function [ ] = formation2 (start,goal)
% close all;                 % 4follower and 1 leader
countmax=500000;
% goal=[500,500,50];
stop_goal=goal;
obstacleR=0.5;% 冲突判定用的障碍物半径
%% 初始化 位置pose、速度V、加速度控制量control
% start = [
%         300,290,0,0,0;
%         300,280,0,0,0;
%         300,270,0,0,0;
%         300,260,0,0,0;
%         300,300,0,0,0;
%         300,250,0,0,0;
%         300,240,0,0,0;
%         300,230,0,0,0;
%         300,220,0,0,0;
%         300,210,0,0,0;]; 
 %% follower相对leader的位置
% 评价函数参数 [heading,dist,velocity,predictDT]
evalParam=[0.05,0.2,0.1,3.0];
% 模拟实验的结果
result1=[];
result2=[];
result3=[];
result4=[];
result5=[];
result6=[];
result7=[];
result8=[];
result9=[];
result10=[];
x1=start(1,:)';
x2=start(2,:)';
x3=start(3,:)';
x4=start(4,:)';
x5=start(5,:)';%x5为长机
x6=start(6,:)';
x7=start(7,:)';
x8=start(8,:)';
x9=start(9,:)';
x10=start(10,:)';
% Main loop
handles = [];
uav_num =10;%获得无人机的数量

%     h1 = figure;
% plot3(410,410,20);
% max_edge_limit=410;
% set(gca,'XLim',[0 max_edge_limit]);
% set(gca,'YLim',[0 max_edge_limit]);
% set(gca,'ZLim',[0 max_edge_limit]);
% set(0,'CurrentFigure',h1);
% xlabel("x");
% ylabel("y");
% zlabel("z");
for i = 1:uav_num
    handle = drawBody(start(i,1),start(i,2),start(i,3),0,0,0,[]);
    handles = [handles,handle];
end

%% 功能:人工势场法避障程序
%% 输入:起点(start_num*3),终点(goal_num*3),障碍物(obs_num*3),障碍物半径(obs_num*1)
%% 输出:无
%% 时间:2022.11.8
function APFM_main(start,goal,obs_point,obs_radius)

%Path Planning
obstacles = transpose(obs_point);
iteration = 2000;                         %Iterations count
current_pos = transpose(start);
goal = transpose(goal);
previous_pos = current_pos;             %Intialising Previous position of the UAV  
Krep = 0.1;                             %Gain factor of repulsive potential field
Katt = 0.04;                             
delta = 0;
data_points = zeros(iteration,3); % storing the iteration values positions of UAV
F = zeros(3,length(obstacles));
Urep = 0;
figure(1)
title('Path Planning of a UAV')
for i=1:iteration
    p_Fr = 0;
    robot_height = current_pos(3,1);
    goal_height = goal(3,1);
    flag = 0;
    Fatt = potential_attraction(Katt, current_pos, goal);
    for k = 1: length(obstacles)
        % Measuring the horizantal distance between UAV and centre axis of the building 
        rou = sqrt((current_pos(1,1)-obstacles(1,k))^2+(current_pos(2,1)-obstacles(2,k))^2); 
        % differentiation of variable rou 
        d_rou = [current_pos(1,1)-obstacles(1,k); current_pos(2,1)-obstacles(2,k)]/rou; 
        
        % Threshold value to judge whether the UAV near to buidling or not?
        zeta = 3.5*obs_radius(k,1);
        n = 2;
        if rou<=zeta
            if robot_height <= obstacles(3,k)
                % Flag - that tells the UAV to move in xy plane
                % no increment in height. 
                flag = 1;
                Frep1 = Krep*((1/rou)-(1/zeta))*(1/rou^2)*dist_factor(current_pos, goal, n, flag)*d_rou;
                Frep2 = -(n/2)*Krep*((1/rou)-(1/zeta))^2*dist_factor(current_pos, goal, n-1, flag)*diff_distance_factor(current_pos, goal, n, flag);
                F(:,k) = vertcat(Frep1,0)+Frep2; 
                Fatt = Katt*[goal(1,1)-current_pos(1,1);goal(2,1)-current_pos(2,1); 0];
            else
                F(:,k) = 0;
            end
        elseif rou > zeta
            
            F(:,k) = 0;
        end
    end
    Frep = sum(F,2); % summation of all repulsive forces
    Ft = Fatt + Frep;
    if flag == 1
        flag = 0;
        % changing the 'z' axis based on the UAV position if robot is near to obstracle it only moves in xy plane.
        Ft(3,1) = 0; 
    end
    previous_pos = current_pos;
    current_pos = current_pos+Ft;
    data_points(i,:)=transpose(current_pos);
    title(sprintf('Iterations %d', i))
    % Plotting the UAV position in real time
    plot3(current_pos(1,1), current_pos(2,1), current_pos(3,1),"Marker","*","Color","black");
    pause(0.07)
    drawnow
end
%Plotting of graphs
% for i = 1:length(obstacles)
%     % Plotting other usefull plots to analyse the UAV behaviour
%     potential_plots(x,y,obstacles(:,i));
% end
end

此博客来源于本人做的一个项目。同时出产一个专利,更多的代码访问代码仓库 GitHub - promising76/multi-uavs

文章来源:https://blog.csdn.net/coldmood77/article/details/135266436
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。