無人機集群對抗,是自動駕駛中路徑規劃的新問題,并且連續兩年出現在最近的中國大學生數學建模競賽中。可見,這是一個急需解決的數學問題(體現了官方的軍事戰略意志),同時,還沒有成熟解決方案的問題。
本人在自動駕駛無人艇領域也會碰到類似的路徑規劃的問題。海軍裝備每年組織的海上競賽中,多無人艇編隊的攔截、追蹤、護航、穿插,都是軍用無人艇的必考項目。
本文主要根據前期《無人機集群協同對抗仿真案例(2020數學建模MCM試題)》一題的工作研究,總結了一些基本方法。同時,這些方法,將會收錄到無人機集群協同對抗工具包中。
若谷:Matlab仿真----無人機集群協同對抗仿真案例(2020數學建模MCM試題)?zhuanlan.zhihu.com
有興趣的朋友,可以加微信,繼續溝通。
若谷:《自動駕駛行業交流群》及公約?zhuanlan.zhihu.com
零、無人機集群對抗問題的關鍵問題
無人機集群對抗是未來無人機作戰的重要模式,它是一群無人機對另一群無人機進行攔截而形成的空中協作式的纏斗,對抗中無人機具有自組織、自適應特點和擬人思維屬性,通過感知環境,對周圍態勢進行判斷,依據一定的行為規則,采取攻擊、避讓、分散、集中、協作、援助等有利策略,使得在整體上涌現出集群對抗系統的動態特性。
本文及后面一篇文章,將會重點分享無人機集群對抗仿真中的數學建模方法。
- 無人機集群協同對抗演化過程機理及其表述
由于集群對抗中信息的多元化和不完全、不確定性,對抗系統是一個復雜的動態隨機過程,空戰對抗態勢隨著時空不斷演化,每個無人機作為一個智能體必須依據不斷變化的態勢并依據一定的準則調整自己的策略,進行己方個體之間的合作、與對方的博弈。因此,在充分分析無人機集群對抗演化過程特點及其內涵的基礎上,理解無人機集群對抗的非線性動態過程演化機,利用系統動力學和復雜系統理論建立各種因素的相互作用和信息的傳遞關系的網絡拓撲架構,利于對無人機集群對抗過程的定量和定性分析。

2. 無人機自適應自主決策對抗行為
集群對抗中,無人機個體是直接動作發出和執行者,無人機個體不斷與環境進行交互并相互作用,促使對抗過程不斷演化。因此,集群對抗最終是要依賴于無人機的對抗規則,即無人機依據敵方態勢、友機態勢及自身飛行狀態、武器狀況、健康情況等因素,采取某種機動和攻擊策略,如攻擊敵機、威脅回避、支援友機、戰術協同,使在最大化對敵殺傷、對敵態勢、瓦解敵方意圖和最小化自身損失等方面的綜合效益取得最大化。

3. 無人機集群智能控制方法
暫時略
4. 無人機集群探測與識別
復雜而多變的集群對抗環境具有極大的狀態不確定性和極強的時間約束,對于敵我雙方大規模無人機個體和集群進行精確地探測和識別是對抗行為成功與否的先決條件。

5.無人機集群對抗態勢評估
態勢評估是對抗決策的依據,由于集群對抗威脅可以來自任意方向,數量多,友機與敵方飛機相互纏繞,信息量大,且存在不完全、不確定性,態勢評估比單機對抗情況復雜的多。這就需要集群中每個無人機利用其對周圍環境的感知信息和接收到的鄰近友機傳來的信息,根據所獲得的綜合數據信息進行數據挖掘,分析理解敵方的作戰意圖、戰術戰法。

6.無人機集群通信技術
暫時略
根據海軍裝備技術的發展綱要,軍用低軌通信衛星,是十五規劃的重點。
一、基于拐彎半徑限制的前進方向角度
function [Angle_Left, Angle_Right] = UAVForwardDirection_TurningRadius(UAV_Motion_Status, UAV_Speed, StepTime, TurningRadius)
% Function: 根據過去一步的運動方向(歷史軌跡,x,y,Angle_Motion),基于拐彎半徑的限制,以及步長和飛行速度,計算下一步的運動方向范圍。

function [Angle_Left, Angle_Right] = UAVForwardDirection_TurningRadius(UAV_Motion_Status, UAV_Speed, StepTime, TurningRadius)
%% Definition
% Input:
% UAV_Motion_Status:[x,y,Direction]*1, UAV的運動軌跡
% UAV_Speed: x m/s, 比如250m/s
% StepTime: x s仿真步長,比如0.2s
% TurningRadius: x km, N個紅色UAV運輸機,即紅色UAV的中心位置
% Output:
% Angle_Left, Angle_Right: 前行方向的左右邊界(指北為零,順時針為正,范圍是[0, 2*pi) )
% Function: 根據過去一步的運動方向(歷史軌跡,x,y,Angle_Motion),基于拐彎半徑的限制,以及步長和飛行速度,計算下一步的運動方向范圍。
%% Steps:
% 1 獲取BlueUAV_Trajectory的維度;
% 2 如果維度為1,直接向右方(默認的飛行方向),出行一個步長;
% 3 如果維度為2,向外延伸一個步長;
% 4 如果維度大于或等于3,向外延伸,取得方向,再延伸一個步長;
% Author: ruogu7(380545156@qq.com)
% Date: Sep, 28th.
% Latest update: Sep, 28th.
% Example:
% UAV_Motion_Status = [0 25 90]
% UAV_Speed = 0.25 % km/s
% StepTime = 0.4; % s
% TurningRadius = 0.5 % km
% [Angle_Left, Angle_Right] = UAVForwardDirection_TurningRadius(UAV_Motion_Status, UAV_Speed, StepTime, TurningRadius)
% Arc_length = UAV_Speed * StepTime;
Arc_Angel = Arc_length/(TurningRadius*2*pi);
TurnningAngle = Arc_Angel/2;% 前行方向的左右邊界(指北為零,順時針為正,范圍是[0, 2*pi)
% Angle_Left, Angle_Right
Temp_Angle_Left = UAV_Motion_Status(1,3)*pi/180 - TurnningAngle + 2*pi;
Angle_Left = Temp_Angle_Left - fix(Temp_Angle_Left/(2*pi))*(2*pi);Temp_Angle_Right = UAV_Motion_Status(1,3)*pi/180 + TurnningAngle + 2*pi;
Angle_Right = Temp_Angle_Right - fix(Temp_Angle_Left/(2*pi))*(2*pi);
二、兩個點的相對方位角
function [azimuth, dist ] = GetAzimuth_2points(point1, point2)
功能:求Point1相對與Point2的相對方位和距離
% point的格式:[x,y]
% azimuth: 指北方向為0度,然后順時針為正,直到360度,保留1位小數
function [azimuth, dist ] = GetAzimuth_2points(point1, point2)
%% 功能:求Point1相對與Point2的相對方位和距離
% point的格式:[x,y]
% azimuth: 指北方向為0度,然后順時針為正,直到360度,保留1位小數
% point1 = [-1 1];
% point2 = [1 -1];
% [azimuth, dist ] = GetAzimuth_2points(point1, point2)P_local = [point1(1)-point2(1) point1(2)-point2(2)];dist = sqrt(P_local(1)^2+P_local(2)^2);sin_value = P_local(2)/dist;
cos_value = P_local(1)/dist;if (P_local(1)>=0) && (P_local(2)>=0) % 第一象限azimuth = 90-asin(P_local(2)/dist) * 180/pi;return;
end
if (P_local(1)<=0) && (P_local(2)>=0) % 第二象限azimuth = asin(P_local(2)/dist)*180/pi+270 return;
end
if (P_local(1)<=0) && (P_local(2)<=0) % 第三象限azimuth = 180 + asin(-P_local(1)/dist) * 180 / pi;return;
end
if (P_local(1)>=0) && (P_local(2)<=0) % 第四象限azimuth = 180 - asin(P_local(1)/dist) * 180 / pi;return;
end
三、根據歷史軌跡,預測其軌跡
function BlueUAV_Location_next =Forecast_BlueUAV_Location(BlueUAV_Trajectory,BlueUAV_speed,N)
(預防后面求多個位置的根據要求,計算% Output: BlueUAV_Location_next(x,y)% function: 基于BlueUAV的軌跡,預測其下一時刻的位置
function BlueUAV_Location_next = Forecast_BlueUAV_Location(BlueUAV_Trajectory,BlueUAV_speed,N)
% BlueUAV_Trajectory:[x,y] * N
% BlueUAV_speed: 0.3km/s
% N: N個步長。(預防后面求多個位置的根據要求,計算
% Output: BlueUAV_Location_next(x,y)
% function: 基于BlueUAV的軌跡,預測其下一時刻的位置
% Steps:
% 1 獲取BlueUAV_Trajectory的維度;
% 2 如果維度為1,直接向右方(默認的飛行方向),出行一個步長;
% 3 如果維度為2,向外延伸一個步長;
% 4 如果維度大于或等于3,向外延伸,取得方向,再延伸一個步長;
% Author: ruogu7(380545156)
% Date: sep, 21th.
% Latest update: sep, 21th.
% Example:
% BlueUAV_Trajectory = [ 2 3 ; 3 4 ; 4 5; 5 6;]
% BlueUAV_speed = 0.25
% N = 1;
% BlueUAV_Location_next = Forecast_BlueUAV_Location(BlueUAV_Trajectory,BlueUAV_speed,N)
%
% import math.*Num_Points_BlueUAV_Trajectory = size(BlueUAV_Trajectory,1)
BlueUAV_Trajectory
if Num_Points_BlueUAV_Trajectory == 1% xBlueUAV_Location_next(1,1) = BlueUAV_Trajectory(1,1) + BlueUAV_speed * N;% yBlueUAV_Location_next(1,2) = BlueUAV_Trajectory(1,2);return;
end
if Num_Points_BlueUAV_Trajectory == 2% 確定方向[azimuth_BlueUAV, dist ] = GetAzimuth_2points(BlueUAV_Trajectory(2,:), BlueUAV_Trajectory(1,:))% xBlueUAV_Location_next(1,1) = BlueUAV_Trajectory(end,1) + BlueUAV_speed * N * cos((360-(azimuth_BlueUAV-90))*pi/180);% yBlueUAV_Location_next(1,2) = BlueUAV_Trajectory(end,2) + BlueUAV_speed * N * sin((360-(azimuth_BlueUAV-90))*pi/180);return;
end % 當軌跡點的數量等于3
if Num_Points_BlueUAV_Trajectory == 3% 確定方向% 連續兩個中點的相對方位,作為整體方位。Front_centor = [(BlueUAV_Trajectory(1,1) + BlueUAV_Trajectory(2,1))/2 (BlueUAV_Trajectory(1,2) + BlueUAV_Trajectory(2,2))/2]Back_centor = [(BlueUAV_Trajectory(2,1) + BlueUAV_Trajectory(3,1))/2 (BlueUAV_Trajectory(2,2) + BlueUAV_Trajectory(3,2))/2][azimuth_Red, dist ] = GetAzimuth_2points(Back_centor, Front_centor)% import math.*% x = 1:100;% y = -0.3*x + 2*randn(1,100);% [p,S] = polyfit(x,y,1);% azimuth_BlueUAV = math.atan(p(1))% xBlueUAV_Location_next(1,1) = BlueUAV_Trajectory(end,1) + BlueUAV_speed * N * cos((360-(azimuth_Red-90))*pi/180);% yBlueUAV_Location_next(1,2) = BlueUAV_Trajectory(end,2) + BlueUAV_speed * N * sin((360-(azimuth_Red-90))*pi/180);return;
end % 當軌跡點的數量多于3,則基于最后4個軌跡點,進行線性回歸
if Num_Points_BlueUAV_Trajectory > 3% 確定方向% 連續兩個中點的相對方位,作為整體方位。Front_centor = [(BlueUAV_Trajectory(1,1) + BlueUAV_Trajectory(2,1))/2 (BlueUAV_Trajectory(1,2) + BlueUAV_Trajectory(2,2))/2]Back_centor = [(BlueUAV_Trajectory(3,1) + BlueUAV_Trajectory(4,1))/2 (BlueUAV_Trajectory(3,2) + BlueUAV_Trajectory(4,2))/2][azimuth_Red, dist ] = GetAzimuth_2points(Back_centor, Front_centor)% import math.*% x = 1:100;% y = -0.3*x + 2*randn(1,100);% [p,S] = polyfit(x,y,1);% azimuth_BlueUAV = math.atan(p(1))% xBlueUAV_Location_next(1,1) = BlueUAV_Trajectory(end,1) + BlueUAV_speed * N * cos((360-(azimuth_Red-90))*pi/180);% yBlueUAV_Location_next(1,2) = BlueUAV_Trajectory(end,2) + BlueUAV_speed * N * sin((360-(azimuth_Red-90))*pi/180);return;
end