function Juntas=inversa(AncaX,AncaY,AncaZ,PeY,PeZ,virarD,virarE,manipulador);
n_elos=size(manipulador,1);                         %e necessario saber o numero de elos
syms O1 O2 O3 O4 O5 O6 O7;                          %crio simbolicos
Alteracoes=[ 	0                                   %(tem de ter o mesmo numero de linhas que Manipulador)
                0                                   %(estas duas primeiras linhas sao de posicionamento inicial)
                O1                                  % J1
                -O2-O3                              % J2
                O2                                  % J3
                O3                                  % J4
                O1                                  % J5
                0
                0
                O6                                  % J6
                0                                   % ponto medio
                O7                                  % J7
                0
                0
                O1                                  % J8
                O4                                  % J9
                O5                                  % J10
                -O5-O4                              % J11
                O1                                  % J12
                0
                0];

Ref=eye(4,4);                                       %referencial de origem
for i=1:n_elos;                                     %determino DH para todos os elos (i->numero do elo)
    theta=manipulador(i,1)+Alteracoes(i);           %   "
    alfa=manipulador(i,2);                          %   "
    CosAlfa=cos(alfa);                              %um desenrasca que eu arrangei
	if abs(CosAlfa)<1e-15;                          %por causa dos "comboios" de numeros
        CosAlfa=0;                                  %era o cos(pi/2) que dava 6e-17
    end;                                            %de volta ao normal
    l=manipulador(i,3);                             %   "
	d=manipulador(i,4);                             %   "
    DH(1,1,i)=cos(theta);                           %   "
  	DH(1,2,i)=-sin(theta)*CosAlfa;                  %   "
   	DH(1,3,i)=sin(theta)*sin(alfa);                 %   "
   	DH(1,4,i)=l*cos(theta);                         %   "
   	DH(2,1,i)=sin(theta);                           %   "
   	DH(2,2,i)=cos(theta)*CosAlfa;                   %   "
   	DH(2,3,i)=-cos(theta)*sin(alfa);                %   "
    DH(2,4,i)=l*sin(theta);                         %   "
    DH(3,1,i)=0;                                    %   "
   	DH(3,2,i)=sin(alfa);                            %   "
    DH(3,3,i)=CosAlfa;                              %   "
   	DH(3,4,i)=d;                                    %   "
   	DH(4,1,i)=0;                                    %   "
   	DH(4,2,i)=0;                                    %   "
    DH(4,3,i)=0;                                    %   "
    DH(4,4,i)=1;                                    %   "
   	Ref=Ref*DH(:,:,i);                              %aplico DH a R e obtenho "novo referencial" (orientaçao a frente da anterior)
    if i==10;
        PosA=Ref(:,4);
    end;
end;
PosP=Ref(:,4);
O1=atan(-AncaX/AncaZ);
    O1=subs(O1);
O6=virarD;
    O6=subs(O6);
O7=virarE;
    O7=subs(O7);
InAY=subs(simple(PosA(2)));
InAZ=subs(simple(PosA(3)));
stringAY=strcat(char(InAY),'=',int2str(-AncaY)); 
stringAZ=strcat(char(InAZ),'=',int2str(AncaZ)); 
[O2,O3]=solve(stringAY,stringAZ);                   %determinaçao dos angulos de junta em funçao da posiçao pretendida
redundancia1=max(size(O2));
if redundancia1==1;
    O2=subs(O2);
    O3=subs(O3);
end;
if redundancia1==2;
    T21=subs(O2(1));
    T22=subs(O2(2));
    if T21<T22;
        O2=subs(O2(1));                                 %substituo por valores nao string
        indice=1;
    else;
        O2=subs(O2(2));
        indice=2;
    end;
    if indice==1;
        O3=subs(O3(1));                                 %substituo por valores nao string
    else;
        O3=subs(O3(2));
    end;
end;
InPY=subs(simple(PosP(2)))+PeY;
InPZ=subs(simple(PosP(3)))-PeZ;
InPY=eval(InPY);
InPZ=eval(InPZ);
stringPY=strcat(char(InPY),'=0'); 
stringPZ=strcat(char(InPZ),'=0'); 
[O4,O5]=solve(stringPY,stringPZ);                   %determinaçao dos angulos de junta em funçao da posiçao pretendida
redundancia2=max(size(O5));
if redundancia2==1;
    O5=subs(O5);
    O4=subs(O4);
end;
if redundancia2==2;
    T51=subs(O5(1));
    T52=subs(O5(2));
    if T51<T52;
        O5=subs(O5(1));                                 %substituo por valores nao string
        indice=1;
    else;
        O5=subs(O5(2));
        indice=2;
    end;
    if indice==1;
        O4=subs(O4(1));                                 %substituo por valores nao string
    else;
        O4=subs(O4(2));
    end;
end;

%		        theta/z                             %etermino as alteraçoes/variaçoes no manipulador
Juntas=[ 	    0                                   %(tem de ter o mesmo numero de linhas que Manipulador)
                0                                   %(estas duas primeiras linhas sao de posicionamento inicial)
                O1                                  % J1
                -O2-O3                              % J2
                O2                                  % J3
                O3                                  % J4
                O1                                  % J5
                0
                0
                O6                                  % J6
                0                                   % ponto medio
                O7                                  % J7
                0
                0
                O1                                  % J8
                O4                                  % J9
                O5                                  % J10
                -O5-O4                              % J11
                O1                                  % J12
                0
                0];