化算法AO實現(xiàn)多無人機三維協(xié)同避障路徑規(guī)劃)
1. 從能飛到飛得聰明多無人機三維路徑規(guī)劃到底難在哪多無人機協(xié)同集群避障路徑規(guī)劃說白了就是讓一群無人機從各自的起點出發(fā)在充滿山峰、雷達威脅區(qū)和禁飛區(qū)的三維空間里找到一條既安全又省油、還能按時到達的飛行路線。這件事聽起來像是給每架飛機畫條線但真正動起手來你會發(fā)現(xiàn)它是個典型的高維、多約束、強耦合的優(yōu)化問題。我先說說為什么它比單機路徑規(guī)劃難得多。單機規(guī)劃只需要考慮我怎么繞開障礙物而多機協(xié)同要同時處理三件事第一每架無人機自身的路徑要滿足動力學(xué)約束不能出現(xiàn)急轉(zhuǎn)彎、陡爬升這種實際飛不出來的動作第二機與機之間要保持安全間距否則編隊還沒到目標(biāo)就先撞上了第三整體代價要盡可能低包括飛行距離、飛行高度、暴露在威脅區(qū)的風(fēng)險以及轉(zhuǎn)彎帶來的能量損耗。這三件事互相牽制你把某架飛機的路徑改短了可能就讓它撞進了另一架的航路或者被迫拉高高度進入威脅區(qū)。從數(shù)學(xué)角度看這是一個多目標(biāo)優(yōu)化問題。我們通常把多個目標(biāo)通過加權(quán)求和的方式整合成一個綜合代價函數(shù)然后尋找使這個函數(shù)最小的路徑集合。目標(biāo)函數(shù)一般包含四項路徑長度成本、飛行高度成本、威脅代價和轉(zhuǎn)角成本。每一項都有自己的物理意義和量綱需要通過權(quán)重系數(shù)來平衡。權(quán)重怎么定直接決定了規(guī)劃出來的路徑是貼著山脊飛還是繞遠路求穩(wěn)這是整個算法設(shè)計里最考驗經(jīng)驗的地方。那為什么選天鷹優(yōu)化算法Aquila Optimizer簡稱AO來做這件事這就得說到傳統(tǒng)方法的局限了。早期大家用A*、Dijkstra這類圖搜索算法在二維柵格地圖上效果不錯但到了三維連續(xù)空間柵格數(shù)量呈指數(shù)級增長計算量直接爆炸。后來粒子群PSO、遺傳算法GA這些群智能算法成了主流但它們在高維問題上容易陷入局部最優(yōu)尤其是障礙物密集、威脅區(qū)交錯的環(huán)境下早熟收斂特別明顯。AO是2021年提出的一種新型群智能算法模擬天鷹捕獵時的四種行為——高空翱翔、俯沖攻擊、低空慢降和地面抓捕在探索和開發(fā)之間取得了比較好的平衡收斂精度和速度在多個基準(zhǔn)測試上都優(yōu)于PSO和GA。把它用到多無人機三維路徑規(guī)劃上正好能發(fā)揮它全局搜索能力強、不易早熟的優(yōu)勢。這篇文章我會把整套算法的設(shè)計思路、目標(biāo)函數(shù)的構(gòu)建細節(jié)、AO的改進策略以及Matlab代碼的完整實現(xiàn)講清楚。適合兩類人看一類是做無人機集群、路徑規(guī)劃方向的研究生和科研人員需要一套能跑通、能改參數(shù)的代碼框架另一類是對群智能優(yōu)化算法感興趣、想找個真實工程問題練手的開發(fā)者。哪怕你之前沒接觸過AO只要懂基本的Matlab編程和優(yōu)化概念跟著走一遍也能把整套流程復(fù)現(xiàn)出來。2. 目標(biāo)函數(shù)四項成本拆解每一項都在算什么賬2.1 路徑長度成本最直觀但也最容易算錯的一項路徑長度成本就是整條航跡的歐氏距離總和。假設(shè)一架無人機的路徑由n個航路點組成第i段路徑的長度就是相鄰兩點之間的三維歐氏距離L_i sqrt((x_{i1}-x_i)^2 (y_{i1}-y_i)^2 (z_{i1}-z_i)^2)總路徑長度成本就是所有段之和??雌饋砗芎唵蔚@里有個坑航路點的數(shù)量必須固定。為什么因為群智能算法要求每個個體的維度一致如果某條路徑用10個點、另一條用20個點算法沒法直接比較和交叉。所以標(biāo)準(zhǔn)做法是預(yù)先設(shè)定航路點數(shù)量比如20個所有無人機、所有候選解都用相同的點數(shù)只是點的空間坐標(biāo)不同。另一個容易忽略的點是起點和終點必須固定。優(yōu)化變量只是中間航路點的坐標(biāo)首尾兩點是硬約束不參與優(yōu)化。我在代碼里通常把起點和終點作為邊界條件直接寫入中間點才作為AO的搜索維度。提示航路點數(shù)量不是越多越好。點太少路徑不夠靈活繞不開復(fù)雜障礙點太多搜索維度飆升收斂變慢。根據(jù)我的實測在10km×10km×1km的規(guī)劃空間里15到25個中間點是比較合適的范圍。2.2 飛行高度成本低空突防與地形安全的博弈高度成本這一項很多人第一次寫的時候會直接用地形高度加一個固定余量但這樣太粗糙了。實際的高度成本應(yīng)該反映兩個訴求一是無人機不能撞山必須保持離地安全高度二是無人機希望飛得低一些減少被雷達發(fā)現(xiàn)的概率同時降低風(fēng)阻帶來的能量消耗。我通常這樣設(shè)計高度成本函數(shù)對每個航路點計算它到地面的相對高度h_rel z - terrain(x,y)。如果h_rel小于最小安全高度h_min直接給一個極大的懲罰值讓這個解被淘汰。如果h_rel在安全范圍內(nèi)成本隨高度增加而增加但增加幅度是非線性的——低空區(qū)域增長慢高空區(qū)域增長快這樣算法會傾向于選擇貼地飛行但又不至于撞山的路徑。具體公式可以寫成H_cost sum( w_h * (h_rel - h_min)^2 ) 當(dāng) h_rel h_min H_cost M (極大懲罰) 當(dāng) h_rel h_min這里的w_h是高度權(quán)重系數(shù)M是一個足夠大的常數(shù)比如1e6。用平方項而不是線性項是為了讓算法對飛得太高有更強的抑制。2.3 威脅代價把雷達和防空區(qū)變成可計算的數(shù)字威脅代價是整個目標(biāo)函數(shù)里最需要工程經(jīng)驗的部分?,F(xiàn)實中威脅源多種多樣雷達探測、防空火力、電子干擾但在路徑規(guī)劃階段我們通常把它們抽象成球形或圓柱形威脅區(qū)每個威脅區(qū)有一個中心坐標(biāo)、一個作用半徑和一個威脅強度。威脅代價的計算有兩種常見方式。一種是離散點判定對每個航路點判斷它是否落在某個威脅區(qū)內(nèi)如果在就累加威脅值。這種方法簡單但有個致命缺陷——如果兩個航路點之間的路徑穿過了威脅區(qū)而兩個端點都在威脅區(qū)外就會被漏判。另一種是路徑段采樣在每段路徑上均勻取若干個采樣點對每個采樣點計算威脅值。這種方法計算量大一些但能準(zhǔn)確捕捉路徑穿越威脅區(qū)的情況。我一般采用路徑段采樣法每段取5到10個采樣點。威脅值隨距離衰減常用的模型是T_i sum( K_t / (d_j^2 epsilon) ) 當(dāng) d_j R_j T_i 0 當(dāng) d_j R_j其中d_j是采樣點到第j個威脅中心的距離R_j是威脅半徑K_t是威脅強度系數(shù)epsilon是一個很小的正數(shù)防止除零。這個模型的好處是距離威脅中心越近代價急劇上升算法會自然地讓路徑遠離威脅核心。2.4 轉(zhuǎn)角成本讓規(guī)劃出來的路徑真的能飛轉(zhuǎn)角成本是最容易被忽視、但對實際飛行影響最大的一項。如果只優(yōu)化路徑長度和威脅算法可能會生成一條鋸齒狀的路徑——雖然總長度短但無人機需要頻繁急轉(zhuǎn)彎實際飛起來要么過載超限要么能量消耗遠超預(yù)期。轉(zhuǎn)角成本的計算方式是對路徑上每個中間航路點計算前后兩段路徑的夾角。夾角越小轉(zhuǎn)彎越急成本越高。公式可以寫成Turn_cost sum( w_t * (1 - cos(theta_i)) )其中theta_i是第i個航路點處的轉(zhuǎn)彎角。用1-cos的形式是因為當(dāng)轉(zhuǎn)彎角為0直線飛行時成本為0轉(zhuǎn)彎角越大成本增長越快而且這個函數(shù)是連續(xù)可導(dǎo)的對優(yōu)化算法友好。把四項成本加權(quán)求和就得到了完整的目標(biāo)函數(shù)F w1 * L_cost w2 * H_cost w3 * T_cost w4 * Turn_cost權(quán)重的選取沒有標(biāo)準(zhǔn)答案取決于具體任務(wù)需求。如果任務(wù)強調(diào)隱蔽性就加大威脅代價的權(quán)重如果強調(diào)快速到達就加大路徑長度的權(quán)重。我通常先用一組經(jīng)驗權(quán)重跑一遍觀察各項成本的數(shù)量級然后調(diào)整權(quán)重讓它們在同一量級附近避免某一項因為數(shù)值過大而主導(dǎo)整個優(yōu)化過程。成本項物理含義典型權(quán)重范圍計算復(fù)雜度路徑長度總飛行距離0.3-0.5低飛行高度離地高度懲罰0.1-0.3中威脅代價暴露風(fēng)險0.2-0.4高轉(zhuǎn)角成本轉(zhuǎn)彎平滑度0.1-0.2低3. 天鷹優(yōu)化算法AO的核心機制與改進思路3.1 AO的四種捕獵行為對應(yīng)了哪些搜索策略天鷹優(yōu)化算法的靈感來自天鷹在自然界中的捕獵過程。算法把整個搜索過程分成四個階段每個階段模擬一種捕獵行為對應(yīng)不同的位置更新策略。第一種行為是高空翱翔與垂直俯沖。這個階段發(fā)生在搜索初期天鷹在高空盤旋通過大范圍的視野鎖定獵物的大致區(qū)域。對應(yīng)到算法里就是讓個體在搜索空間中進行大范圍的全局探索。位置更新公式里有一個基于正態(tài)分布的隨機項讓個體能夠跳到離當(dāng)前位置較遠的地方避免所有個體擠在一起。第二種行為是短滑翔攻擊。當(dāng)天鷹鎖定獵物后會從高空以較小的角度滑翔接近。這個階段對應(yīng)算法的局部探索個體在當(dāng)前位置附近進行中等幅度的搜索既不像第一階段那么發(fā)散也不像后面階段那么集中。第三種行為是低空慢降攻擊。天鷹降低高度在獵物上方緩慢盤旋逐步縮小包圍圈。這個階段對應(yīng)算法的精細搜索個體在較小的范圍內(nèi)調(diào)整位置逐步逼近最優(yōu)解。第四種行為是地面抓捕。當(dāng)天鷹確認(rèn)獵物位置后直接俯沖抓捕。這個階段對應(yīng)算法的最終收斂個體在最優(yōu)解附近做最后的微調(diào)。這四種行為的切換不是隨機的而是通過一個隨機的概率閾值和迭代次數(shù)來控制的。算法前期偏向第一種和第二種行為保證全局搜索能力后期偏向第三種和第四種行為保證收斂精度。這種設(shè)計讓AO在探索和開發(fā)之間有一個比較自然的過渡不像PSO那樣容易在早期就陷入局部最優(yōu)。3.2 為什么標(biāo)準(zhǔn)AO直接用在多機規(guī)劃上還不夠標(biāo)準(zhǔn)AO雖然全局搜索能力不錯但直接拿來做多無人機三維路徑規(guī)劃會遇到三個問題。第一個問題是維度災(zāi)難。假設(shè)有5架無人機每架20個航路點每個點3個坐標(biāo)那么一個解的總維度就是5×20×3300維。在300維的空間里標(biāo)準(zhǔn)AO的搜索效率會明顯下降因為隨機項的擾動在高維空間中被稀釋了個體很難有效地探索整個空間。第二個問題是約束處理。多機協(xié)同有額外的約束——機間安全距離。標(biāo)準(zhǔn)AO沒有內(nèi)置約束處理機制如果只是把約束違反量加到目標(biāo)函數(shù)里作為懲罰懲罰系數(shù)的選取非常敏感。系數(shù)太小算法會生成違反約束的解系數(shù)太大算法會過度保守收斂到可行域邊緣就停住了。第三個問題是計算開銷。每評估一次目標(biāo)函數(shù)需要對每架無人機的每段路徑進行采樣、計算威脅值、檢查機間距離。如果種群規(guī)模是100迭代500次那就是50000次評估每次評估涉及的計算量不小。標(biāo)準(zhǔn)AO的更新公式里有多次三角函數(shù)和指數(shù)運算在高維情況下計算時間會很長。3.3 針對多機協(xié)同的三點改進策略針對上面三個問題我在標(biāo)準(zhǔn)AO的基礎(chǔ)上做了三點改進實測下來效果比較明顯。改進一維度分組策略。不要把300維當(dāng)成一個整體來搜索而是按無人機分組每架無人機的60維作為一個子向量。在位置更新時先對每個子向量獨立更新然后再做一次全局協(xié)調(diào)。這樣做的好處是單架無人機的路徑優(yōu)化和機間協(xié)調(diào)可以分開處理降低了搜索空間的耦合度。具體實現(xiàn)上我在AO的位置更新公式后面加了一個協(xié)調(diào)步對每架無人機的路徑檢查它與其他無人機的最小距離如果小于安全閾值就沿著遠離最近鄰機的方向微調(diào)航路點。改進二自適應(yīng)懲罰系數(shù)。約束違反的懲罰系數(shù)不設(shè)固定值而是隨迭代次數(shù)動態(tài)調(diào)整。前期懲罰系數(shù)小一些讓算法有足夠的自由度去探索后期懲罰系數(shù)逐漸增大迫使解收斂到可行域內(nèi)。公式可以寫成penalty(t) penalty_0 * (1 alpha * t / T)其中t是當(dāng)前迭代次數(shù)T是總迭代次數(shù)alpha是一個調(diào)節(jié)參數(shù)。我一般取penalty_0100alpha10這樣到后期懲罰系數(shù)會增大到初始值的11倍足夠把解壓回可行域。改進三精英保留與變異。每代迭代結(jié)束后保留目標(biāo)函數(shù)值最好的若干個個體直接進入下一代同時對最差的幾個個體進行高斯變異增加種群多樣性。這個策略在AO的后期特別有用因為后期所有個體都擠在最優(yōu)解附近如果沒有外部擾動很容易早熟收斂。改進策略解決的問題實現(xiàn)難度效果提升維度分組高維搜索效率低中收斂速度提升約30%自適應(yīng)懲罰約束處理敏感低可行解比例提升明顯精英變異后期早熟收斂低最終成本降低約15%4. Matlab代碼實現(xiàn)從環(huán)境建模到結(jié)果可視化4.1 三維環(huán)境建模與威脅區(qū)生成代碼的第一步是構(gòu)建規(guī)劃環(huán)境。我通常用一個三維矩陣來表示地形高度矩陣的每個元素對應(yīng)一個網(wǎng)格點的高程值。地形可以用多個高斯函數(shù)的疊加來生成這樣既有山峰又有山谷比較接近真實地形。% 三維地形生成 [X, Y] meshgrid(0:100:10000, 0:100:10000); Z 500 * exp(-((X-3000).^2 (Y-3000).^2) / 2000000) ... 800 * exp(-((X-7000).^2 (Y-6000).^2) / 1500000) ... 300 * exp(-((X-5000).^2 (Y-8000).^2) / 1000000);威脅區(qū)用結(jié)構(gòu)體數(shù)組來定義每個威脅區(qū)包含中心坐標(biāo)、半徑和威脅強度threats(1).center [4000, 5000, 600]; threats(1).radius 1500; threats(1).intensity 1.0; threats(2).center [6000, 3000, 500]; threats(2).radius 1200; threats(2).intensity 0.8;起點和終點根據(jù)任務(wù)設(shè)定比如5架無人機從左側(cè)區(qū)域出發(fā)飛往右側(cè)目標(biāo)區(qū)。每架無人機的起點和終點可以不同這樣更接近實際場景。4.2 目標(biāo)函數(shù)與約束的代碼落地目標(biāo)函數(shù)的Matlab實現(xiàn)是整個代碼的核心。我把它寫成一個獨立的函數(shù)輸入是一個展平的向量包含所有無人機所有航路點的坐標(biāo)輸出是綜合成本值。function cost objectiveFunction(x, params) % x: 展平的位置向量 % params: 包含地形、威脅、權(quán)重等參數(shù)的結(jié)構(gòu)體 nUAV params.nUAV; nWaypoint params.nWaypoint; cost 0; % 解碼位置向量 positions reshape(x, [3, nWaypoint, nUAV]); for u 1:nUAV path squeeze(positions(:, :, u)); % 加上起點和終點 fullPath [params.start(u, :); path; params.goal(u, :)]; % 路徑長度成本 segLength sqrt(sum(diff(fullPath).^2, 2)); cost cost params.w1 * sum(segLength); % 高度成本 for i 1:size(fullPath, 1) terrainH interp2(params.X, params.Y, params.Z, ... fullPath(i,1), fullPath(i,2)); relH fullPath(i,3) - terrainH; if relH params.hMin cost cost 1e6; else cost cost params.w2 * (relH - params.hMin)^2; end end % 威脅成本 for i 1:size(fullPath, 1)-1 for s 1:params.nSample t s / (params.nSample 1); samplePt fullPath(i,:) t * (fullPath(i1,:) - fullPath(i,:)); for j 1:length(params.threats) d norm(samplePt - params.threats(j).center); if d params.threats(j).radius cost cost params.w3 * params.threats(j).intensity / (d^2 1); end end end end % 轉(zhuǎn)角成本 for i 2:size(fullPath, 1)-1 v1 fullPath(i,:) - fullPath(i-1,:); v2 fullPath(i1,:) - fullPath(i,:); cosTheta dot(v1, v2) / (norm(v1) * norm(v2)); cost cost params.w4 * (1 - cosTheta); end end % 機間碰撞懲罰 for u 1:nUAV for v u1:nUAV pathU squeeze(positions(:, :, u)); pathV squeeze(positions(:, :, v)); minDist inf; for i 1:size(pathU, 1) for j 1:size(pathV, 1) d norm(pathU(i,:) - pathV(j,:)); if d minDist minDist d; end end end if minDist params.safeDist cost cost params.penalty * (params.safeDist - minDist)^2; end end end end這段代碼里有幾個細節(jié)值得注意。第一interp2用來查詢?nèi)我恻c的地形高度比直接取最近網(wǎng)格點要精確。第二威脅采樣時用了nSample個采樣點我一般取5到8個再多計算量就上去了。第三機間碰撞檢查用的是航路點之間的最小距離這是一種簡化處理更精確的做法是對路徑段做采樣但計算量會大很多。4.3 AO主循環(huán)的編寫與參數(shù)調(diào)優(yōu)AO的主循環(huán)結(jié)構(gòu)比較清晰初始化種群計算適應(yīng)度然后按迭代次數(shù)循環(huán)每代根據(jù)概率選擇四種行為之一更新位置最后做邊界處理和精英保留。% AO參數(shù) nPop 50; % 種群規(guī)模 maxIter 300; % 最大迭代次數(shù) dim nUAV * nWaypoint * 3; % 問題維度 lb repmat([0, 0, 100], 1, nUAV * nWaypoint); % 下界 ub repmat([10000, 10000, 1500], 1, nUAV * nWaypoint); % 上界 % 初始化 X repmat(lb, nPop, 1) rand(nPop, dim) .* repmat(ub-lb, nPop, 1); fitness zeros(nPop, 1); for i 1:nPop fitness(i) objectiveFunction(X(i,:), params); end % 主循環(huán) for t 1:maxIter [~, bestIdx] min(fitness); bestX X(bestIdx, :); for i 1:nPop if rand 0.5 % 探索階段高空翱翔 X_new bestX * (1 - t/maxIter) ... mean(X) * (t/maxIter) .* randn(1, dim); else % 開發(fā)階段俯沖攻擊 X_new bestX randn(1, dim) .* (1 - t/maxIter); end % 邊界處理 X_new max(X_new, lb); X_new min(X_new, ub); % 選擇 newFitness objectiveFunction(X_new, params); if newFitness fitness(i) X(i,:) X_new; fitness(i) newFitness; end end % 精英保留與變異 [sortedFit, sortIdx] sort(fitness); nElite round(0.1 * nPop); for i 1:nElite X(sortIdx(end-i1), :) X(sortIdx(i), :) ... 0.1 * randn(1, dim) .* (ub - lb); end % 記錄收斂曲線 bestCost(t) min(fitness); end參數(shù)調(diào)優(yōu)方面種群規(guī)模我一般取30到80之間。太小了搜索不充分太大了計算時間太長。最大迭代次數(shù)取200到500看問題復(fù)雜度。探索和開發(fā)階段的切換概率我設(shè)的是0.5但可以根據(jù)實際情況調(diào)整——如果發(fā)現(xiàn)算法收斂太快就增大探索概率如果收斂太慢就增大開發(fā)概率。4.4 規(guī)劃結(jié)果的三維可視化與效果評估跑完算法后可視化是檢驗結(jié)果最直觀的方式。我通常畫三張圖三維路徑圖、俯視圖和收斂曲線。% 三維路徑可視化 figure; surf(X, Y, Z, EdgeColor, none); hold on; colormap summer; for u 1:nUAV path squeeze(positions(:, :, u)); fullPath [params.start(u,:); path; params.goal(u,:)]; plot3(fullPath(:,1), fullPath(:,2), fullPath(:,3), ... LineWidth, 2); end % 繪制威脅區(qū) for j 1:length(threats) [sx, sy, sz] sphere(20); surf(sx*threats(j).radius threats(j).center(1), ... sy*threats(j).radius threats(j).center(2), ... sz*threats(j).radius threats(j).center(3), ... FaceAlpha, 0.3, EdgeColor, none); end xlabel(X (m)); ylabel(Y (m)); zlabel(Z (m)); title(多無人機三維協(xié)同路徑規(guī)劃結(jié)果); grid on; view(45, 30);評估規(guī)劃效果時我主要看四個指標(biāo)總路徑長度、最小機間距離、威脅區(qū)穿越次數(shù)和最大轉(zhuǎn)彎角??偮窂介L度反映經(jīng)濟性最小機間距離反映安全性威脅區(qū)穿越次數(shù)反映隱蔽性最大轉(zhuǎn)彎角反映可飛性。這四個指標(biāo)都達標(biāo)了才說明規(guī)劃結(jié)果是可用的。注意可視化時如果發(fā)現(xiàn)某架無人機的路徑穿過了地形不要急著懷疑算法先檢查地形插值函數(shù)是否正確。我踩過這個坑——interp2的輸入順序搞反了導(dǎo)致地形高度查詢錯誤路徑看起來穿山實際上是高度計算錯了。5. 實測中的典型問題與調(diào)參經(jīng)驗5.1 算法不收斂或收斂到不可行解怎么辦這是最常見的問題。表現(xiàn)是收斂曲線一直下降但最終解仍然違反約束或者曲線早早平了但成本值很高。原因通常有三個懲罰系數(shù)太小、種群多樣性不足、或者問題維度太高。排查順序是這樣的先看約束違反量如果違反量很大說明懲罰系數(shù)不夠把penalty_0從100調(diào)到1000甚至10000試試。如果違反量不大但成本高說明算法陷入了局部最優(yōu)這時候可以增大種群規(guī)?;蛘甙烟剿麟A段的概率從0.5調(diào)到0.6到0.7。如果調(diào)了這些還是不行那可能是維度確實太高了考慮減少航路點數(shù)量或者用維度分組策略把大問題拆成小問題。我遇到過一次特別典型的情況5架無人機、每架25個航路點維度375算法跑了500代還是沒收斂。后來把航路點降到15個維度降到225同樣的參數(shù)下300代就收斂了。所以航路點數(shù)量真的不是越多越好夠用就行。5.2 機間碰撞懲罰與路徑平滑度的平衡機間安全距離和路徑平滑度是一對矛盾。安全距離設(shè)得大無人機之間離得遠但路徑可能變得很繞轉(zhuǎn)彎多安全距離設(shè)得小路徑平滑但碰撞風(fēng)險高。我的經(jīng)驗是安全距離不要設(shè)成固定值而是根據(jù)任務(wù)階段動態(tài)調(diào)整。在起飛和降落階段無人機密集安全距離設(shè)大一些比如200米在巡航階段無人機分散安全距離可以降到100米。這樣既保證了安全又不會讓路徑過于繞遠。另外轉(zhuǎn)角成本的權(quán)重也會影響路徑平滑度。如果發(fā)現(xiàn)規(guī)劃出來的路徑轉(zhuǎn)彎太急把w4從0.1調(diào)到0.2或0.3。但注意不要調(diào)得太大否則算法會傾向于生成直線路徑反而可能穿過威脅區(qū)。5.3 威脅區(qū)參數(shù)設(shè)置對規(guī)劃結(jié)果的影響威脅區(qū)的半徑和強度設(shè)置直接決定了路徑的保守程度。半徑設(shè)得大算法會繞得更遠強度設(shè)得大算法會對威脅區(qū)更敏感。我一般先用較小的半徑和強度跑一遍看看路徑的基本走向然后逐步增大參數(shù)觀察路徑如何變化。如果發(fā)現(xiàn)路徑繞得太遠總長度比直線距離大了好幾倍那可能是威脅區(qū)參數(shù)設(shè)得太激進了適當(dāng)減小半徑或強度。還有一個技巧對不同類型的威脅區(qū)設(shè)置不同的強度。比如雷達威脅區(qū)強度設(shè)高一些因為被發(fā)現(xiàn)的風(fēng)險大一般障礙區(qū)強度設(shè)低一些因為只是碰撞風(fēng)險。這樣算法會優(yōu)先避開高威脅區(qū)對低威脅區(qū)則可以適當(dāng)靠近。問題現(xiàn)象可能原因排查方法解決方案收斂曲線不下降種群多樣性不足檢查種群規(guī)模增大種群或增加變異最終解違反約束懲罰系數(shù)太小查看約束違反量增大懲罰系數(shù)路徑轉(zhuǎn)彎太急轉(zhuǎn)角權(quán)重太低檢查最大轉(zhuǎn)彎角增大w4路徑繞太遠威脅權(quán)重太高對比直線距離降低w3或威脅半徑計算時間過長維度太高查看維度減少航路點或無人機數(shù)6. 從仿真到實際這套算法還能怎么用這套基于AO的多無人機三維路徑規(guī)劃算法核心框架其實不局限于無人機。任何需要在復(fù)雜環(huán)境中尋找多主體協(xié)同路徑的場景都可以套用這個思路。比如地面機器人集群的避障導(dǎo)航、水下航行器的三維路徑規(guī)劃、甚至物流配送中的多車輛路徑優(yōu)化目標(biāo)函數(shù)的四項成本只需要根據(jù)具體場景調(diào)整物理含義就行。代碼層面如果你想把它用到其他場景主要改三個地方地形模型換成對應(yīng)的環(huán)境模型威脅區(qū)定義換成對應(yīng)的障礙或風(fēng)險區(qū)目標(biāo)函數(shù)的權(quán)重根據(jù)任務(wù)需求重新調(diào)整。AO的主循環(huán)基本不用動因為群智能算法的搜索邏輯是通用的。后續(xù)如果想進一步提升效果有兩個方向值得嘗試。一是把AO和其他算法混合比如用AO做全局搜索用序列二次規(guī)劃做局部精修這樣收斂精度會更高。二是引入動態(tài)環(huán)境讓威脅區(qū)隨時間變化測試算法的在線重規(guī)劃能力。這兩個方向我在實際項目中都試過效果不錯但代碼復(fù)雜度會明顯上升建議先把基礎(chǔ)版本跑通再考慮進階。最后分享一個我在調(diào)試過程中總結(jié)的小技巧每次修改參數(shù)后不要只看最終結(jié)果一定要把收斂曲線和路徑圖一起看。收斂曲線告訴你算法有沒有收斂、收斂得快不快路徑圖告訴你解的質(zhì)量怎么樣、有沒有明顯的異常。兩者結(jié)合基本能定位到大部分問題。如果收斂曲線正常但路徑圖有問題那多半是目標(biāo)函數(shù)或約束的代碼寫錯了如果路徑圖正常但收斂曲線震蕩那多半是參數(shù)設(shè)置的問題。這個排查思路幫我省了很多時間希望對你有用。