传统人工势场法---经典算法
生活随笔
收集整理的這篇文章主要介紹了
传统人工势场法---经典算法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
網(wǎng)上代碼很多,這個(gè)可以直接使用。
Xo=[0 0];%起點(diǎn)位置 k=50;%計(jì)算引力需要的增益系數(shù) K=0;%初始化 m=15;%計(jì)算斥力的增益系數(shù),都是自己設(shè)定的。 Po=0.5;%障礙影響距離,當(dāng)障礙和車(chē)的距離大于這個(gè)距離時(shí),斥力為0,即不受該障礙的影響。也是自己設(shè)定。 n=6;%障礙個(gè)數(shù) a=0.5; l=0.2;%步長(zhǎng) J=200;%循環(huán)迭代次數(shù) Xsum=[6 10;1 1.2;3 2.5;4 4.5;3 6;6 2;5.5 5.5;];%這個(gè)向量是(n+1)*2維,其中[10 10]是目標(biāo)位置,剩下的都是障礙的位置。也可以用XGOAL重新另寫(xiě)一行 Xj=Xo;%j=1循環(huán)初始,將車(chē)的起始坐標(biāo)賦給Xj %***************初始化結(jié)束,開(kāi)始主體循環(huán)****************** for j=1:J%循環(huán)開(kāi)始Goal(j,1)=Xj(1);%Goal是保存車(chē)走過(guò)的每個(gè)點(diǎn)的坐標(biāo)。剛開(kāi)始先將起點(diǎn)放進(jìn)該向量。Goal(j,2)=Xj(2); %調(diào)用計(jì)算角度模塊Theta=compute_angle(Xj,Xsum,n);%Theta是計(jì)算出來(lái)的車(chē)和障礙,和目標(biāo)之間的與X軸之間的夾角,統(tǒng)一規(guī)定角度為逆時(shí)針?lè)较?#xff0c;網(wǎng)上可以查具體函數(shù)Angle=Theta(1);%Theta(1)是車(chē)和目標(biāo)之間的角度,目標(biāo)對(duì)車(chē)是引力。angle_at=Theta(1);%為了后續(xù)計(jì)算斥力在引力方向的分量賦值給angle_at[Fatx,Faty]=compute_Attract(Xj,Xsum,k,Angle,0,Po,n);%計(jì)算出目標(biāo)對(duì)車(chē)的引力在x,y方向的兩個(gè)分量值。for i=1:nangle_re(i)=Theta(i+1);%計(jì)算斥力用的角度,是個(gè)向量,因?yàn)橛衝個(gè)障礙,就有n個(gè)角度。end %調(diào)用計(jì)算斥力模塊 [Frerxx,Freryy,Fataxx,Fatayy]=compute_repulsion(Xj,Xsum,m,angle_at,angle_re,n,Po,a);%計(jì)算出斥力在x,y方向的分量數(shù)組。 %計(jì)算出X,Y方向向量Fsumyj=Faty+Freryy+Fatayy;%y方向的合力Fsumxj=Fatx+Frerxx+Fataxx;%x方向的合力Position_angle(j)=atan(Fsumyj/Fsumxj);%合力與x軸方向的夾角向量 %計(jì)算車(chē)的下一步位置Xnext(1)=Xj(1)+l*cos(Position_angle(j));Xnext(2)=Xj(2)+l*sin(Position_angle(j));%保存車(chē)的每一個(gè)位置在向量中Xj=Xnext;%判斷if ((Xj(1)-Xsum(1,1))>0)&&((Xj(2)-Xsum(1,2))>0)%這個(gè)地方可以修改一下,改成相等會(huì)避免超出目標(biāo)點(diǎn)而繼續(xù)迭代下去K=j;%記錄迭代到多少次,到達(dá)目標(biāo)。break;%記錄此時(shí)的j值end%如果不符合if的條件,重新返回循環(huán),繼續(xù)執(zhí)行。 end%大循環(huán)結(jié)束 K=j; Goal(K,1)=Xsum(1,1);%把路徑向量的最后一個(gè)點(diǎn)賦值為目標(biāo) Goal(K,2)=Xsum(1,2); X=Goal(:,1); Y=Goal(:,2); x=[1 3 4 3 6 5.5 ];%障礙的x坐標(biāo) y=[1.2 2.5 4.5 6 2 5.5 ]; figure(1); axis([0 10 0 10]); plot(x,y,'ok',6,10,'vr',0,0,'ms'); hold on for i=1:Kpause(0.1);plot(X(i),Y(i),'.r'); end % 添加坐標(biāo)說(shuō)明 xlabel('x軸坐標(biāo)'); ylabel('y軸坐標(biāo)'); title('人工勢(shì)場(chǎng)法路徑規(guī)劃'); box off grid on function Y=compute_angle(X,Xsum,n)%角度向量計(jì)算for i=1:n+1%n是障礙數(shù)目deltaX(i)=Xsum(i,1)-X(1);deltaY(i)=Xsum(i,2)-X(2);r(i)=sqrt(deltaX(i)^2+deltaY(i)^2);if deltaX(i)>0theta=acos(deltaX(i)/r(i));elsetheta=pi-acos(deltaX(i)/r(i));endif i==1%表示是目標(biāo)angle=theta;elseangle=theta;end Y(i)=angle;%保存每個(gè)角度在Y向量里面,第一個(gè)元素是與目標(biāo)的角度,后面都是與障礙的角度end end function [Yatx,Yaty]=compute_Attract(X,Xsum,k,angle,~,~,~)%輸入?yún)?shù)為當(dāng)前坐標(biāo),目標(biāo)坐標(biāo),增益常數(shù),分量和力的角度 %把路徑上的臨時(shí)點(diǎn)作為每個(gè)時(shí)刻的Xgoal R=(X(1)-Xsum(1,1))^2+(X(2)-Xsum(1,2))^2;%路徑點(diǎn)和目標(biāo)的距離平方 r=sqrt(R);%路徑點(diǎn)和目標(biāo)的距離 Yatx=k*r*cos(angle);%angle=Y(1) 目標(biāo)對(duì)車(chē)的X,Y方向的引力=引力系數(shù)*路徑點(diǎn)和目標(biāo)的距離*X/Y分量 Yaty=k*r*sin(angle);end %斥力計(jì)算 function [Yrerxx,Yreryy,Yataxx,Yatayy]=compute_repulsion(X,Xsum,m,angle_at,angle_re,n,Po,a)%輸入?yún)?shù)為當(dāng)前坐標(biāo),Xsum是目標(biāo)和障礙的坐標(biāo)向量,增益常數(shù),障礙,目標(biāo)方向的角度 Rat=(X(1)-Xsum(1,1))^2+(X(2)-Xsum(1,2))^2;%路徑點(diǎn)和目標(biāo)的距離平方 rat=sqrt(Rat);%路徑點(diǎn)和目標(biāo)的距離 for i=1:nRrei(i)=(X(1)-Xsum(i+1,1))^2+(X(2)-Xsum(i+1,2))^2;%路徑點(diǎn)和障礙的距離平方rre(i)=sqrt(Rrei(i));%路徑點(diǎn)和障礙的距離保存在數(shù)組rrei中R0=(Xsum(1,1)-Xsum(i+1,1))^2+(Xsum(1,2)-Xsum(i+1,2))^2;r0=sqrt(R0);if rre(i)>Po%如果每個(gè)障礙和路徑的距離大于障礙影響距離,斥力令為0Yrerx(i)=0;Yrery(i)=0;Yatax(i)=0;Yatay(i)=0;else%if r0<Poif rre(i)<Po/2Yrer(i)=m*(1/rre(i)-1/Po)*(1/Rrei(i))*(rat^a);%分解的Fre1向量Yata(i)=a*m*((1/rre(i)-1/Po)^2)*(rat^(1-a))/2;%分解的Fre2向量Yrerx(i)=(1+0.1)*Yrer(i)*cos(angle_re(i));%angle_re(i)=Y(i+1)Yrery(i)=-(1-0.1)*Yrer(i)*sin(angle_re(i));Yatax(i)=Yata(i)*cos(angle_at);%angle_at=Y(1)Yatay(i)=Yata(i)*sin(angle_at);elseYrer(i)=m*(1/rre(i)-1/Po)*1/Rrei(i)*Rat;%分解的Fre1向量Yata(i)=m*((1/rre(i)-1/Po)^2)*rat;%分解的Fre2向量Yrerx(i)=Yrer(i)*cos(angle_re(i));%angle_re(i)=Y(i+1)Yrery(i)=Yrer(i)*sin(angle_re(i));Yatax(i)=Yata(i)*cos(angle_at);%angle_at=Y(1)Yatay(i)=Yata(i)*sin(angle_at);endend%判斷距離是否在障礙影響范圍內(nèi) endYrerxx=sum(Yrerx);%疊加斥力的分量Yreryy=sum(Yrery);Yataxx=sum(Yatax);Yatayy=sum(Yatay); end 總的來(lái)說(shuō)就是先找出運(yùn)動(dòng)點(diǎn),障礙點(diǎn)和目標(biāo)點(diǎn)三者之間的關(guān)系,進(jìn)而算出三者之間的X,Y方向的向量和,找出運(yùn)動(dòng)點(diǎn)下一位置,達(dá)成循環(huán)。運(yùn)動(dòng)點(diǎn)每一次運(yùn)動(dòng)都執(zhí)行上述循環(huán),直到運(yùn)動(dòng)到目標(biāo)點(diǎn)。這個(gè)算法只能算簡(jiǎn)單的了解一下,早已經(jīng)不能滿(mǎn)足現(xiàn)在的需求總結(jié)
以上是生活随笔為你收集整理的传统人工势场法---经典算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于尚硅谷视频p135配置完yarn-s
- 下一篇: 数字图像处理MFC程序设计之图像的打开显