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