【路徑規(guī)劃】無人機編隊路徑規(guī)劃matlab源碼
關(guān)于編隊飛行研究的問題無外乎以下4個:
編隊隊形的生成:如何將多個無人機進行聯(lián)系起來,完成編隊隊形的生成。
編隊隊形的保持:當無人機編隊隊形形成之后,如何保持且按照系統(tǒng)設(shè)定的編隊隊形進行飛行。
編隊隊形的變換:如果需要變換無人機編隊飛行的隊形,如何變換無人機編隊的隊形,即換成隊形。
編隊隊形的避障:系統(tǒng)編隊飛行時,遇到障礙物時,如何運動飛行從而避開障礙物;

在研究無人機編隊飛行算法前,需要去了解各個無人機之間的通信方法,通信方式可以將機群的控制方法分為以下幾種:
集中式控制方法:編隊系統(tǒng)中的個體都會互相通信,互相傳遞速度、坐標位置、運動狀態(tài)等信息。采用此種控制方法的系統(tǒng)飛行效果較好,因為編隊系統(tǒng)中的每個無人機都知道編隊系統(tǒng)中所有的信息,能做出更加科學(xué)的飛行決策和路線。
但此方式所帶來的缺點較為明顯,無人機個體之間都需要進行多個通信,需要互相傳遞較為多的數(shù)據(jù)信息,對無人機個體的計算速度以及內(nèi)存都要求比較高。數(shù)據(jù)量較大還會導(dǎo)致無人機產(chǎn)生丟失關(guān)鍵信息的問題。
分布式控制方法:就不存在上述信息量較大導(dǎo)致丟失的情況,無人機編隊系統(tǒng)中的個體只需要和領(lǐng)域的無人機進行通信,通信數(shù)據(jù)包以及通信鏈路都比較少。與集中式控制方法相對,采用此種控制方法的編隊系統(tǒng)飛行效果會差一些。
正因為只無人機個體只需要和領(lǐng)域無人機通信,反而更好在實際應(yīng)用中實現(xiàn)該控制方法。除此之外,該控制方法不牽扯到無人機編隊系統(tǒng)其它無人機個體,可以極為方便的對無人機編隊系統(tǒng)中的無人機個體進行刪減或增加。
比如,當編隊無人機系統(tǒng)中的某個個體出現(xiàn)故障導(dǎo)致編隊系統(tǒng)中的個體缺失時,對系統(tǒng)整體的影響較小,并可以實時的補充上其他無人機個體,讓編隊系統(tǒng)快速恢復(fù)正常的工作狀態(tài)。
分散式控制方法中:編隊系統(tǒng)中的個體無人機之間不會進行通信,在編隊系統(tǒng)中,會約定好飛行固定點,系統(tǒng)中的無人機個體正常保持與固定點的相對關(guān)系就可以了。由此可見,采用此種控制方法的編隊系統(tǒng)計算量更小,但其帶來的編隊飛行效果是極差的,由于編隊系統(tǒng)中的無人機個體不相互通信,可能會帶來無人機之間的碰撞從而發(fā)生嚴重事故。

了解通信方式之后,下面可以介紹關(guān)于無人機編隊控制的一些控制方法:
1)跟隨領(lǐng)航的控制方法。首先設(shè)定無人機編隊系統(tǒng)中的一架作為領(lǐng)航無人機,其他個體為跟隨無人機,在編隊飛行時,跟隨無人機實時跟隨領(lǐng)航無人機進行飛行。在此種控制算法中,由于有領(lǐng)航無人機和跟隨無人機的這種相對運動模式,我們可以將無人機編隊系統(tǒng)的隊形控制問題轉(zhuǎn)換成跟隨無人機跟隨領(lǐng)航者的位置運動情況。
這種控制方法被許多學(xué)者研究并實現(xiàn),其優(yōu)點在于復(fù)雜的多個個體之間的問題可以轉(zhuǎn)換成單個個體的運動情況研究。降低了個體研究的數(shù)量。但缺點也很明顯,整個無人機編隊系統(tǒng)的穩(wěn)定性都由領(lǐng)航者決定,依賴性較強,一旦領(lǐng)航者出現(xiàn)問題,整個系統(tǒng)將出現(xiàn)崩潰,除此之外,編隊系統(tǒng)也容易受外界干擾的影響。
2)虛擬結(jié)構(gòu)法。虛擬結(jié)構(gòu)法的主要思想是將無人機編隊系統(tǒng)的隊形組成看作是剛性的虛擬結(jié)構(gòu),在無人機編隊飛行運動期間,單個無人機個體可以看做是固定在虛擬結(jié)構(gòu)上的固定位置上,一旦無人機編隊隊形發(fā)生改變,編隊系統(tǒng)中的無人機個體直接跟蹤保持虛擬結(jié)構(gòu)上的固定坐標點就可以完成設(shè)定好的編隊飛行巡檢路線。
3)人工勢場法。人工勢場法在無人機航線軌跡規(guī)劃上用的較多。這是一種利用物理吸引力和排斥力的概念的虛擬力方法,障礙物和目標點會對無人機會產(chǎn)生不同的力,目標點對無人機具有吸引力,障礙物對無人機具有排斥力,兩者的結(jié)合即合力對無人機產(chǎn)生加速力,從而控制無人機的運動。人工勢場法的優(yōu)點在于原理簡單和實時性較好,但對無人機的運動學(xué)約束問題無法進行處理,所以此類方法用在無人機編隊飛行的研究比較少。
clear all
close all
clc
syms x1
syms x2
grid on
hold on
axis equal
N = 4;
d = 1.5;
pos = 3*rand(2,N);
pos = [pos; rand(1,N)];
pos(1:2,1) = [5;0];
[pos,obst,target,dist_matrix,lambda,sec_dist,mu,Cr,d,tr1,tr2,tr3,tr4] = formazione_rombo(pos,d,[],[],1,0.02);
initial_pos = pos;
plot3(initial_pos(1,1),initial_pos(2,1),initial_pos(3,1),'s','MarkerSize',10, 'MarkerFaceColor','y','HandleVisibility','off');
plot3(initial_pos(1,2:4),initial_pos(2,2:4),initial_pos(3,2:4),'s','MarkerSize',10, 'MarkerFaceColor','g');
G = create_graph(pos,sqrt(2)*d);
while norm(pos(:,1)-target(:,1)) > 0.1
? ?pos(:,1) = adjustement(pos(:,1),obst,target,x1,x2,0,10*lambda,0.8,mu,Cr,G,1);
? ?pos = adjustement(pos,obst,[],x1,x2,dist_matrix,5*lambda,1,mu,Cr,G,2);
? ?G = create_graph(pos,sqrt(2)*d);
? ?check = checkDist(pos,dist_matrix,G)
? ?
? ?%ripristino la formazione se si sminchia troppo
? ?while check > 2
? ? ? ?pos = adjustement(pos,obst,[],x1,x2,dist_matrix,3*lambda,sec_dist,mu,Cr,G,1);
? ? ? ?G = create_graph(pos,sqrt(2)*d);
? ? ? ?check = checkDist(pos,dist_matrix,G)
? ?end
? ?
? ?tr1 = [[tr1] [pos(:,1)]];
? ?tr2 = [[tr2] [pos(:,2)]];
? ?tr3 = [[tr3] [pos(:,3)]];
? ?tr4 = [[tr4] [pos(:,4)]];
? ?disp(norm(pos(:,1)-target(:,1)));
end
G = create_graph(pos,sqrt(2)*d);
check = checkDist(pos,dist_matrix,G);
if check >0.15
? ?[pos,~,~,~,~,~,~,~,~,tr11,tr22,tr33,tr44] = formazione_rombo(pos,d,[],obst,2,0.02);
else
? ?tr11 = [];
? ?tr22 = [];
? ?tr33 = [];
? ?tr44 = [];
end
tr1 = [tr1 tr11];
tr2 = [tr2 tr22];
tr3 = [tr3 tr33];
tr4 = [tr4 tr44];
plot3(tr1(1,:),tr1(2,:),tr1(3,:),'--');
plot3(pos(1,1),pos(2,1),pos(3,1),'s','MarkerSize',10, 'MarkerFaceColor','y');
plot3(pos(1,2:4),pos(2,2:4),pos(3,2:4),'s','MarkerSize',10, 'MarkerFaceColor','r');
plot3(obst(1,:),obst(2,:),obst(3,:),'*b')
plot3(target(1,1),target(2,1),target(3,1),'-o','MarkerSize',15);
plot3(tr2(1,:),tr2(2,:),tr2(3,:),'--');
plot3(tr3(1,:),tr3(2,:),tr3(3,:),'--');
plot3(tr4(1,:),tr4(2,:),tr4(3,:),'--');
legend('Initial Position','Trajectory','Leader','Final Position','Obstacle','Final Target','FontSize',14);


?