problem in making Two link manipulator used inverse kinematics(jacobian)
    5 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    HEEJUN JANG
 el 4 de En. de 2019
  
    
    
    
    
    Respondida: Francisco J. Triveno Vargas
 el 11 de Sept. de 2024
            i dont know what is wrong... 
i used jacobian driven  DHtable 
i think animation part is not wrong
but find jacobian part has matter but i cant find that...
clc, clear, close all;
syms theta1 theta2 t
%% init
l1 = 1 ; l2 = 1;
d1 = 0; a1 = l1 ;alpha1 = 0; home1 = -60;
d2 = 0; a2 = l2 ;alpha2 = 0; home2 = 120;
%% find jacobian
A01 = DHtheta(theta1, d1, a1, alpha1,home1);
A12 = DHtheta(theta2, d2, a2, alpha2,home2);
T01 = A01;
T02 = simplify(A01*A12);
O02 = T02(1:3,4);
O01 = T01(1:3,4);
z = [0;0;1];
Jv1 = simplify(cross(z,O02));
Jv2 = simplify(cross(z,(O02-O01)));
J = [Jv1,Jv2;z,z];
%% trajectory planning
x0 = cosd(home1)+cosd(home1+home2);
y0 = sind(home1)+sind(home1+home2);
ax = amat(x0,0,0,x0,0,0,0,1);
ay = amat(y0,0,0,1,0,0,0,1);
xtraj = ax(1)*t.^5+ax(2)*t.^4+ax(3)*t.^3+ax(4)*t.^2+ax(5)*t+ax(6);
ytraj = ay(1)*t.^5+ay(2)*t.^4+ay(3)*t.^3+ay(4)*t.^2+ay(5)*t+ay(6);
xdottmp = diff(xtraj,t);
ydottmp = diff(ytraj,t);
treal = linspace(0,1,1000);
xd= double(subs(xtraj,t,treal));
yd= double(subs(ytraj,t,treal));
xdot= double(subs(xdottmp,t,treal));
ydot= double(subs(ydottmp,t,treal));
%% cal theta value
th1 = zeros(1000);
th2 = zeros(1000);
th1(1) = home1;
th2(1) = home2;
dotmat = zeros(2,1);
for k=1:1:1000
    tmpJ1 = subs(J,[theta1 theta2],[th1(k) th2(k)]);
    Ja = double(tmpJ1(1:2,1:2));
    dotmat(1,1) = xdot(k);
    dotmat(2,1) = ydot(k);
    thdottmp = Ja\dotmat;
    th1(k+1) = th1(k) + thdottmp(1)*0.001;
    th2(k+1) = th2(k) + thdottmp(2)*0.001;
end
%% animation
 figure;
h = plot(0,0,0,0);
axis([-0.5 1.5 -1 1]);axis equal;
for k=1:1:1000
    Xcoord1 = [0 cosd(th1(k))];
    Ycoord1 = [0, sind(th1(k))];
    Xcoord2 = [cosd(th1(k)), cosd(th1(k))+cosd(th1(k)+th2(k))];
    Ycoord2 = [sind(th1(k)), sind(th1(k))+sind(th1(k)+th2(k))];
    h(1).XData = Xcoord1;
    h(1).YData = Ycoord1;
    h(2).XData = Xcoord2;
    h(2).YData = Ycoord2;
    drawnow;
    if k==1
        pause;
    end
end
function A = DHtheta(theta, d, a, alpha,home)
thetaMat = [cosd(theta+home), -sind(theta+home), 0 , 0;
            sind(theta+home), cosd(theta+home), 0 , 0;
            0           0           1   0;
            0           0           0   1];
dMat = [ 1 0 0 0;
         0 1 0 0;
         0 0 1 d;
         0 0 0 1];
alphaMat = [ 1               0               0           0;
             0       cosd(alpha)      -sind(alpha)        0;
             0       sind(alpha)      cosd(alpha)         0;
             0              0               0           1];
aMat = [ 1 0 0 a;
         0 1 0 0;
         0 0 1 0;
         0 0 0 1];
A = thetaMat*dMat*aMat*alphaMat;
end
function a = amat(q0,q0dot,q02dot,qf,qfdot,qf2dot,t0,tf)
trjmat = [t0^5,     t0^4,   t0^3,  t0^2, t0,  1;
          5*t0^4, 4*t0^3, 3*t0^2,  2*t0,  1,  0;
          20*t0^3, 12*t0^2 6*t0,   2   ,  0,  0 ;
          tf^5,     tf^4,   tf^3,  tf^2, tf,  1;
          5*tf^4, 4*tf^3, 3*tf^2,  2*tf,  1,  0;
          20*tf^3, 12*tf^2 6*tf,   2   ,  0,  0 ];
qmat = [q0;q0dot;q02dot;qf;qfdot;qf2dot];
a = trjmat\qmat;
end
1 comentario
Respuestas (1)
  Francisco J. Triveno Vargas
 el 11 de Sept. de 2024
        Hi my friend, you can check the functions here.
Regards
Francisco
0 comentarios
Ver también
Categorías
				Más información sobre Assembly en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


