1. 初始化參數(shù)
主要參數(shù):
地圖大小
起始點和目標(biāo)點坐標(biāo)
clc clear all m = 30;n = 30; Spoint = [3 3]; %起始點坐標(biāo) Epoint = [29 22]; %目標(biāo)點坐標(biāo)
2. 構(gòu)建地圖
-inf表示不可到達(dá)的障礙物點
%%構(gòu)建地圖 for i = 1:m+2 if i == 1 for j = 1:n+2 Matrix(i,j) = -inf; end elseif i == m+2 for j = 1:n+2 Matrix(i,j) = -inf; end else for j = 1:n+2 if ((j == 1)|(j == n+2)) Matrix(i,j) = -inf; else Matrix(i,j) = inf; end end end end %%障礙 for j=2:10 Matrix(5,j)=-inf; for j=2:15 Matrix(24,j)=-inf; for j=9:24 %for j=6:24 Matrix(10,j)=-inf; for j=20:31 Matrix(15,j)=-inf; for j=5:20 Matrix(20,j)=-inf; for j=18:27 Matrix(28,j)=-inf; for i=2:6 Matrix(i,18)=-inf; for i=17:20 Matrix(i,5)=-inf; for i=23:25 Matrix(i,20)=-inf; for i=13:17 Matrix(i,13)=-inf; end end end end end end end end end end %end % 顯示地圖 %subplot(2,2,1); h1 = plot(Spoint(1),Spoint(2),'gO'); hold on h2 = plot(Epoint(1),Epoint(2),'rO');
3. A*算法搜索路徑
%%尋路 Matrix(Spoint(1),Spoint(2))=0; Matrix(Epoint(1),Epoint(2))=inf; G=Matrix; F=Matrix; openlist=Matrix; closelist=Matrix; parentx=Matrix; parenty=Matrix; openlist(Spoint(1),Spoint(2)) =0; %closelist(Epoint(1),Epoint(2))=inf; for i = 1:n+2 for j = 1:m+2 k = Matrix(i,j); if(k == -inf) %subplot(2,2,1); h3 = plot(i,j,'k.'); % elseif(k == inf) % show green feasible point % %subplot(2,2,1); % plot(i,j,'gh'); % else % %subplot(2,2,1); % plot(i,j,'gh'); end hold on end end axis([0 m+3 0 n+3]); %subplot(2,2,1); plot(Epoint(1),Epoint(2),'b+'); %subplot(2,2,1); plot(Spoint(1),Spoint(2),'b+'); while(1) num=inf; for p=1:m+2 for q=1:n+2 if(openlist(p,q)==0&&closelist(p,q)~=1) Outpoint=[p,q]; if(F(p,q)>=0&&num>F(p,q)) num=F(p,q); Nextpoint=[p,q]; end end end end closelist(Nextpoint(1),Nextpoint(2))=1; for i = 1:3 for j = 1:3 k = G(Nextpoint(1)-2+i,Nextpoint(2)-2+j); if(i==2&&j==2|closelist(Nextpoint(1)-2+i,Nextpoint(2)-2+j)==1) continue; elseif (k == -inf) G(Nextpoint(1)-2+i,Nextpoint(2)-2+j) = G(Nextpoint(1)-2+i,Nextpoint(2)-2+j); closelist(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=1; elseif (k == inf) distance=((i-2)^2+(j-2)^2)^0.5; G(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=G(Nextpoint(1),Nextpoint(2))+distance; openlist(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=0; % H=((Nextpoint(1)-2+i-Epoint(1))^2+(Nextpoint(2)-2+j-Epoint(2))^2)^0.5;%歐幾里德距離啟發(fā)函數(shù) H_diagonal=min(abs(Nextpoint(1)-2+i-Epoint(1)),abs(Nextpoint(2)-2+j-Epoint(2)));%比較復(fù)雜的對角線啟發(fā)函數(shù) H_straight=abs(Nextpoint(1)-2+i-Epoint(1))+abs(Nextpoint(2)-2+j-Epoint(2)); H=sqrt(2)*H_diagonal+(H_straight-2*H_diagonal); % H=max(abs(Nextpoint(1)-2+i-Epoint(1)),abs(Nextpoint(2)-2+j-Epoint(2)));%比較簡單的對角線函數(shù) F(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=G(Nextpoint(1)-2+i,Nextpoint(2)-2+j)+H; parentx(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=Nextpoint(1); parenty(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=Nextpoint(2); else distance=((i-2)^2+(j-2)^2)^0.5; if(k>(distance+G(Nextpoint(1),Nextpoint(2)))) k=distance+G(Nextpoint(1),Nextpoint(2)); % H=((Nextpoint(1)-2+i-Epoint(1))^2+(Nextpoint(2)-2+j-Epoint(2))^2)^0.5; %歐幾里德距離啟發(fā)函數(shù) H_diagonal=min(abs(Nextpoint(1)-2+i-Epoint(1)),abs(Nextpoint(2)-2+j-Epoint(2)));%比較復(fù)雜的對角線啟發(fā)函數(shù) H_straight=abs(Nextpoint(1)-2+i-Epoint(1))+abs(Nextpoint(2)-2+j-Epoint(2)); H=sqrt(2)*10*H_diagonal+10*(H_straight-2*H_diagonal); % H=max(abs(Nextpoint(1)-2+i-Epoint(1)),abs(Nextpoint(2)-2+j-Epoint(2)));%比較簡單的對角線函數(shù) F(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=k+H; parentx(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=Nextpoint(1); parenty(Nextpoint(1)-2+i,Nextpoint(2)-2+j)=Nextpoint(2); end end if(((Nextpoint(1)-2+i)==Epoint(1)&&(Nextpoint(2)-2+j)==Epoint(2))|num==inf) parentx(Epoint(1),Epoint(2))=Nextpoint(1); parenty(Epoint(1),Epoint(2))=Nextpoint(2); break; end end if(((Nextpoint(1)-2+i)==Epoint(1)&&(Nextpoint(2)-2+j)==Epoint(2))|num==inf) parentx(Epoint(1),Epoint(2))=Nextpoint(1); parenty(Epoint(1),Epoint(2))=Nextpoint(2); break; end end if(((Nextpoint(1)-2+i)==Epoint(1)&&(Nextpoint(2)-2+j)==Epoint(2))|num==inf) parentx(Epoint(1),Epoint(2))=Nextpoint(1); parenty(Epoint(1),Epoint(2))=Nextpoint(2); break; end end P=[]; s=1; while(1) if(num==inf) break; end %subplot(2,2,1); h4 = plot(Epoint(1),Epoint(2),'b+'); P(s,:)=Epoint; s=s+1; % pause(1); xx=Epoint(1); Epoint(1)=parentx(Epoint(1),Epoint(2)); Epoint(2)=parenty(xx,Epoint(2)); if(parentx(Epoint(1),Epoint(2))==Spoint(1)&&parenty(Epoint(1),Epoint(2))==Spoint(2)) %subplot(2,2,1); plot(Epoint(1),Epoint(2),'b+'); P(s,:)=Epoint; break; end end P(s+1,:)=Spoint; legend([h1,h2,h3,h4],'起始點','目標(biāo)點','障礙物','航跡點'); count=0; for i=2:12 for j=2:12 if(G(i,j)~=inf&&G(i,j)~=-inf) count=count+1; end end end count
4. 路徑優(yōu)化
%將得到的折現(xiàn)曲線擬合成光滑的曲線 P=P'; a=[]; b=[]; a=P(1,:); b=P(2,:); figure %subplot(2,2,3); plot(a,b); axis([0,n+3,0,n+3]); values = spcrv([[a(1) a a(end)];[b(1) b b(end)]],3); figure %subplot(2,2,4); plot(values(1,:),values(2,:),'r'); axis([0,m+3,0,m+3]);
5. 效果圖
A*路徑
優(yōu)化后路徑
6. 下載鏈接
直接復(fù)制到matlab即可使用,或者也可以點擊下載。
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
matlab
+關(guān)注
關(guān)注
189文章
3001瀏覽量
234117 -
算法
+關(guān)注
關(guān)注
23文章
4710瀏覽量
95383
原文標(biāo)題:Matlab航跡規(guī)劃仿真—A*算法
文章出處:【微信號:3D視覺工坊,微信公眾號:3D視覺工坊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
怎么使用Matlab進(jìn)行電機控制算法仿真?
板,畢竟不是自己的東西,總感覺不得要領(lǐng),達(dá)不到對方波驅(qū)動算法那種游刃有余的狀態(tài),看網(wǎng)上很多高手都會用matlab 對電機建模進(jìn)行Foc 算法仿真,現(xiàn)在疑惑的是
發(fā)表于 07-13 18:43
典型雷達(dá)航跡的仿真與實現(xiàn)
O 引言在各種雷達(dá)訓(xùn)練和信號模擬器中,都需要進(jìn)行航跡模擬及航跡顯示,以便于為仿真平臺提供信號源。對于便攜式雷達(dá)模擬器來說,無法使用PC,需用嵌入式系統(tǒng)來實現(xiàn)人機交互及信號處理。但當(dāng)前絕大部分的
發(fā)表于 07-10 08:11
基于遺傳算法的PID 控制及其MATLAB 仿真
本 文介紹了遺傳算法和基于遺傳算法的PID 控制設(shè)計, 并對設(shè)計MATLAB/SIMULINK 下進(jìn)行了仿真,取得了良好的控制效果。關(guān)鍵詞:遺傳算法
發(fā)表于 06-11 09:06
?102次下載
多傳感器異步航跡融合算法與仿真
針對分布式多傳感器數(shù)據(jù)融合系統(tǒng),提出了一種多傳感器異步航跡融合算法。由于不同傳感器的采樣時間各不相同,融合算法首先利用最小二乘法將局部航跡統(tǒng)一到融合中心的融合
發(fā)表于 08-07 09:47
?12次下載
基于半實物仿真系統(tǒng)的多假目標(biāo)航跡欺騙研究
根據(jù)半實物仿真的特點和優(yōu)點,本文提出了基于半實物仿真系統(tǒng)的多假目標(biāo)航跡欺騙研究的優(yōu)勢和價值。然后從實現(xiàn)多假目標(biāo)航跡欺騙的必要條件、航跡欺騙產(chǎn)
發(fā)表于 07-06 16:31
?25次下載

MATLAB教程_MATLAB仿真_MATLAB軟件下載
本專題為你詳述MATLAB編程與MATLAB仿真設(shè)計知識。內(nèi)容包括MATLAB入門教程,MATLAB畫圖,
發(fā)表于 10-19 17:44

基于改進(jìn)RRT算法的無人機航跡規(guī)劃
為了提高無人機的作戰(zhàn)效率,航跡規(guī)劃系統(tǒng)必須為無人機設(shè)計出安全系數(shù)高,能量消耗少,處理時間短,同時還必須滿足飛行器自身物理特性的威脅回避軌跡?;谏鲜鲅芯磕康模疚?/div>
發(fā)表于 07-25 11:54
?100次下載
基于復(fù)雜度分析的改進(jìn)A_算法飛行器航跡規(guī)劃_叢林虎
基于復(fù)雜度分析的改進(jìn)A_算法飛行器航跡規(guī)劃_叢林虎
發(fā)表于 03-17 15:11
?0次下載
基于模糊聚類的多雷達(dá)航跡關(guān)聯(lián)算法
了相似計算與矩陣迭代的次數(shù),最終達(dá)到了減小運算量的目的。仿真結(jié)果表明:所提算法在保證關(guān)聯(lián)正確率的前提下,耗時減小了54%,有效地提高了多雷達(dá)航跡關(guān)聯(lián)算法的效率。
發(fā)表于 12-18 17:07
?0次下載
一種用于內(nèi)層規(guī)劃的改進(jìn)粒子群算法
內(nèi)層規(guī)劃的改進(jìn)粒子群算法,在粒子群算法中引入變異因子,設(shè)計了特定的擾動算子,提高了航跡尋優(yōu)能力。仿真實驗表明,在相同約束的
發(fā)表于 12-19 16:01
?0次下載

模糊航跡關(guān)聯(lián)算法的分析及改進(jìn)
效果變差。為此,研究并改進(jìn)模糊綜合決策航跡關(guān)聯(lián)算法,通過引入模糊數(shù)學(xué)綜合評判中的雙層結(jié)構(gòu),提出雙層結(jié)構(gòu)模糊綜合決策航跡關(guān)聯(lián)算法。仿真結(jié)果表明
發(fā)表于 03-16 10:58
?6次下載

一類新算法研究智能飛行器航跡規(guī)劃問題
中,通過對A*算法的改進(jìn),建立起符合飛行器航跡規(guī)劃的兩種算法模型。通過兩種方案算法的比較,在兩種
發(fā)表于 03-12 11:24
?695次閱讀

評論