Menu

quasi-static approach MATLAB code

UGV code:

 

 

function [ par,normaltra,normaldel] = FPol( fpol,xmin,xmax,XK )

 

 

L=1;

l=0.35;

Rc=0.1;

r=Rc;

H=0.336;

 

 

mr=50;

mc=300;

mb=20;

 

 

a=(L+l+l+Rc+Rc)/XK;

                   

a1=xmin;

 

a0=a1-(XK+1)*a;

 

 

for i=1:1:(XK+1)

    f(i)=a0;

    a0=a0+a;

end

x1=f';

 

x2=[xmin:a:xmax]';

 

 x2=[x2;xmax];

 

x=[x1;x2];

 

y=subs(fpol,x);

 

 

if length(x)>length(y)

    val=y;

    y(1:length(x))=val;

    y=y';

end

 

 

 

Ad=[(0):(pi/19):pi];

At=Ad;

    

 

n=length(x);

x1m = ones(n,1);

fx1m = ones(n,1);

 

ang=ones(n,1);

 

n=length(x);

Xprincipio=x(1:2);

Yprincipio=y(1:2);    

Rprincipio=polyfit(Xprincipio,Yprincipio,1); 

pdteprincipio=Rprincipio(1); 

Thetaprincipio=atan(pdteprincipio);

 

 ang(1)=Thetaprincipio;

 

 senoprincipio=abs(sin(Thetaprincipio));

cosenoprincipio=abs(cos(Thetaprincipio));

if Rprincipio(1)>=0

             x1m(1) = x(1) - Rc*senoprincipio;

             fx1m(1) = y(1) + Rc*cosenoprincipio;

end

if Rprincipio(1)<0

             x1m(1) = x(1) + Rc*senoprincipio;

             fx1m(1) = y(1) + Rc*cosenoprincipio;

end

 

n=length(x);

XFinal=x(n-1:n);

YFinal=y(n-1:n);

RFinal=polyfit(XFinal,YFinal,1);

pdteFinal=RFinal(1);

ThetaFinal=atan(pdteFinal);        

        

 

ang(n)=ThetaFinal;

 

senoFinal=abs(sin(ThetaFinal));

cosenoFinal=abs(cos(ThetaFinal));

        

if RFinal(1)>=0

   x1m(n) = x(n) - Rc*senoFinal;

   fx1m(n) = y(n) + Rc*cosenoFinal;

end

if RFinal(1)<0

   x1m(n) = x(n) + Rc*senoFinal;

   fx1m(n) = y(n) + Rc*cosenoFinal;

end

 

 

 

for i=2:n-1; 

        

       

X=x(i-1:i+1);

Y=y(i-1:i+1);

R=polyfit(X,Y,1);

pdte=R(1);

Theta=atan(pdte);

 

ang(i)=Theta;

        

 

seno=abs(sin(Theta));

coseno=abs(cos(Theta));

 

if R(1)>=0

   x1m(i) = x(i) - Rc*seno;

   fx1m(i) = y(i) + Rc*coseno;

end

if R(1)<0

   x1m(i) = x(i) + Rc*seno;

   fx1m(i) = y(i) + Rc*coseno;

end

end

 

 

 

 

D=ones(10);

 

for i=1:length(Ad)

    for j=1:length(At)

        D(i,j)=sqrt(((L-l*cos(At(j))-l*cos(Ad(i)))^2)+((l^2)*(sin(At(j))-sin(Ad(i)))^2));               

    end

end

 

c=length(Ad);

 

 

for i=(XK+2):length(x)

   

    for a=1:c

        for b=1:c

        

           Valor=zeros(n,1);

           v=i;

          

           while v>1

               v=v-1;

               Valor(v)=sqrt((((x1m(v)-x1m(i))^2)+(((fx1m(v)-fx1m(i))^2))));

               if Valor(v)>D(a,b) %Esto ocurre cuando nos hemos "pasado"

                                  %el punto

                 

                  if abs(Valor(v+1)-D(a,b))>abs(Valor(v)-D(a,b))

                      Result(a,b,i)=v;

                      v=0;

 

                  else

                      Result(a,b,i)=v+1;

                      v=0;

                  end          

               end

           end

        end

    end

end

 

 

for i=(XK+2):length(x)

    for a=1:c

        for b=1:c

            PT=Result(a,b,i);

        

            xcd=x1m(i);

            ycd=fx1m(i);

            xd=x(i);

            yd=y(i);

            xct=x1m(PT);

            yct=fx1m(PT);

            xt=x(PT);

            yt=y(PT);

           

         

           

            mu=atan((ycd-yct)/(xcd-xct));

            M=D(a,b);

           

        

            d=sqrt( (L^2)+(l^2)-(2*L*l*cos(At(b))));

            alpha1=asin((L/d)*sin(At(b)));

            b1=pi-alpha1-At(b);

            b2=Ad(a)-b1;

            h2=l*sin(b2);

            alpha2=asin(h2/M);

            mu2= alpha1+alpha2;

           

      

            landa=(2*pi)-mu2-At(b)-Ad(a)-mu;  

            teta=-pi+At(b)+mu+mu2;

           

 

            xbd= xcd-(l/2)*cos(landa);

            ybd=ycd+(l/2)*sin(landa);

           

    

            xbt= xct+(l/2)*cos(mu+mu2);

            ybt=yct+(l/2)*sin(mu+mu2);

           

            Cmx=xct+l*cos(mu2+mu)+(L/2)*cos(teta)-(H/2)*sin(teta);

            Cmy=yct+l*sin(mu2+mu)+(L/2)*sin(teta)+(H/2)*cos(teta);

           

      

            angt=ang(PT);     

            angd=ang(i);

           

            xe=xcd;

            ye=ycd;

           

            G2x=((mc*Cmx)+(xbd*mb)+(xbt*mb)+(mr*xct))/(mc+mr+2*mb);

            G2y=((mc*Cmy)+(ybt*mb)+(ybd*mb)+(mr*yct))/(mc+mr+2*mb);

                    

            G2Ex=xe-G2x;

            G2Ey=ye-G2y;

           

            G2Tx=xt-G2x;

            G2Ty=yt-G2y;

           

            G3x=((mc*Cmx)+(xbd*mb)+(xbt*mb)+(mr*xct)+(mr*xcd))/(mc+mr+mr+2*mb);       

            G3y=((mc*Cmy)+(ybt*mb)+(ybd*mb)+(mr*yct)+(mr*ycd))/(mc+mr+mr+2*mb);

                    

            G3Dx=xd-G3x;

            G3Dy=yd-G3y;

      

            G3Tx=xt-G3x;

            G3Ty=yt-G3y;

           

            A1=[cos(angt),                           -sin(angt),                       cos(angd),                     -sin(angd),          0];

            A2=[sin(angt),                           cos(angt),                        sin(angd),                     cos(angd),          0];

            A3=[r,                                   0 ,                                  0,                           0,                 1];

            A4=[-G2Ty*cos(angt)+G2Tx*sin(angt), G2Ty*sin(angt)+G2Tx*cos(angt), -G2Ey*cos(angd)+G2Ex*sin(angd), G2Ey*sin(angd)+G2Ex*cos(angd), -1];

            A5=[-G3Ty*cos(angt)+G3Tx*sin(angt), G3Ty*sin(angt)+G3Tx*cos(angt), -G3Dy*cos(angd)+G3Dx*sin(angd), G3Dy*sin(angd)+G3Dx*cos(angd), 0];

                   

            A=[A1;A2;A3;A4;A5];

           

            g=9.81;       

            C=[ 0 ; (2*mr+mc+2*mb)*g ; 0 ; G2Ex*(mr)*g ; 0];

           

            W=A\C;

           

           PAR(a,b,i)=W(5);

           NORMALTRA(a,b,i)=W(2);

           NORMALDEL(a,b,i)=W(4);

                   

           

        end

    end

end

 

 

 

   par=PAR;        

       normaltra=NORMALTRA;

       normaldel=NORMALDEL;

           

              

              

              

              

end  

             

          

           

   function [peso fidelan fitrase ]=grafica( par,normaltra,normaldel,xmin,xmax,XK )

 

 

 

 

ValorInicioAd=0;

ValorFinalAd=180;

RangoAd=ValorFinalAd-ValorInicioAd;

DivisionesAd=19;

 

ValorInicioAt=0;

ValorFinalAt=180;

RangoAt=ValorFinalAt-ValorInicioAt;

DivisionesAt=19;

 

 

 

Ad=[ValorInicioAd:(RangoAd/DivisionesAd):ValorFinalAd];

At=[ValorInicioAt:(RangoAt/DivisionesAt):ValorFinalAt];

 

 

Ad=Ad*(pi/180);

At=At*(pi/180);

 

 

L=1;

l=0.35;

Rc=0.1;

r=Rc;

H=0.336;

 iterancia=(L+2*l+2*Rc)/XK;

(xmax-xmin)/(iterancia*10);

 

inicio= XK+2;

 

q1=0.3;

q2=0.3;

q3=0.2;

q4=0.2;

 

for i=1:11

   

    for a=1:20

        for b=1:20

           

           

           par(a,b,i)=par(a,b,inicio);

           normaldel(a,b,i)=normaldel(a,b,inicio);

           normaltra(a,b,i)=normaltra(a,b,inicio);

 

   

        end

    end

 

inicio=inicio+(xmax-xmin)/(iterancia*10)

    inicio=fix(inicio)   

   

end

 

 

par0=par(10,10,1);

fid0=Ad(10);

fit0=At(10);

ntra=normaltra(10,10,1);

ndel=normaldel(10,10,1);

 

fidelan(1)=Ad(10);

fitrase(1)=At(10);

 

 

for i=1:10

   

 

    for a=1:20

        for b=1:20

   

            fid=Ad(a);

            fit=At(b);

         

            RTV(a,b)= (abs(par(a,b,i+1)-par0));

           

            FAV(a,b)=(abs(fid-fid0));

            RAV(a,b)=(abs(fit-fit0));

         

            

   

        

        end

    end

   

 

    div=max(RTV);

    div=max(div);

    RTV=RTV/div

   

    div=max(FAV);

    div=max(div);

    FAV=FAV/div

   

    div=max(RAV);

    div=max(div);

    RAV=RAV/div

   

   

    pesomatrix=q1*RTV+q2*RAV+q3*FAV

    peso(:,:,i)=pesomatrix;

    [vector fila]=min(pesomatrix)

    [valor colum]=min(vector)

    fil=fila(colum)

   

   

    fidelan(i+1)=Ad(fil)

    fitrase(i+1)=At(colum)

   

    par0=par(fil,colum,i+1);

    ntra=normaltra(fil,colum,i+1);

    ndel=normaldel(fil,colum,i+1);

    fid0=Ad(fil);

    fit0=At(colum);

   

   

 figure(i)

   surf(peso(:,:,i))

   title(i)

   hold on

  

end

 

end