>> s = 'Rz(q1) Rx(q2) Ty(L1) Rx(q3) Tz(L2)'
s ='Rz(q1) Rx(q2) Ty(L1) Rx(q3) Tz(L2)'>> dh = DHFactor(s)INIT: Rz(q1) Rx(q2) Ty(L1) Rx(q3) Tz(L2)PARSED: Rz(q1).Rx(q2).Ty(L1).Rx(q3).Tz(L2)Rz(q1).Rx(q2).Ty(L1).Rx(q3).Tz(L2)initial merge + swapRz(q1).Rx(q2).Ty(L1).Rx(q3).Tz(L2)ReplaceToZ: Rx(q2) := Ry(+90)Rz(q2)Ry(-90)ReplaceToZ: Rx(q3) := Ry(+90)Rz(q3)Ry(-90)joint vars to ZRz(q1).Ry(+90).Rz(q2).Ry(-90).Ty(L1).Ry(+90).Rz(q3).Ry(-90).Tz(L2)0---------------------------------------Swap: Ry(-90) <-> Ty(L1)Eliminate: Ry(-90) Ry(+90)ReplaceY: Ry(-90)Tz(L2) := Tx(-L2)Ry(-90)Rz(q1).Ry(+90).Rz(q2).Ty(L1).Rz(q3).Tx(-L2).Ry(-90)1---------------------------------------Rz(q1).Ry(+90).Rz(q2).Ty(L1).Rz(q3).Tx(-L2).Ry(-90)1---------------------------------------** deal with Ry/TyReplaceToZ2: Ry(+90) := Rz(+90)Rx(+90)Rz(-90)ReplaceToZ2: Ty(L1) := Rz(+90)Tx(L1)Rz(-90)ReplaceToZ2: Ry(-90) := Rz(+90)Rx(-90)Rz(-90)Merge: Rz(q1) Rz(+90) := Rz(q1+90)Merge: Rz(-90) Rz(q2) := Rz(q2-90)Merge: Rz(-90) Rz(q3) := Rz(q3-90)Merge: Rz(q2-90) Rz(+90) := Rz(q2)Rz(q1+90).Rx(+90).Rz(q2).Tx(L1).Rz(q3-90).Tx(-L2).Rz(+90).Rx(-90).Rz(-90)1---------------------------------------Rz(q1+90).Rx(+90).Rz(q2).Tx(L1).Rz(q3-90).Tx(-L2).Rz(+90).Rx(-90).Rz(-90)1---------------------------------------** deal with Ry/TyRz(q1+90).Rx(+90).Rz(q2).Tx(L1).Rz(q3-90).Tx(-L2).Rz(+90).Rx(-90).Rz(-90)adding: DH(null, 0, 0, 0) += Rz(q1+90)adding: DH(q1+90, 0, 0, 0) += Rx(+90)adding: DH(null, 0, 0, 0) += Rz(q2)adding: DH(q2, 0, 0, 0) += Tx(L1)adding: DH(null, 0, 0, 0) += Rz(q3-90)adding: DH(q3-90, 0, 0, 0) += Tx(-L2)DH(q1+90, 0, 0, 90).DH(q2, 0, L1, 0).DH(q3-90, 0, -L2, 0).Rz(+90).Rx(-90).Rz(-90)In DHFactor, parseString is donedh =DH(q1+90, 0, 0, 90).DH(q2, 0, L1, 0).DH(q3-90, 0, -L2, 0).Rz(+90).Rx(-90).Rz(-90)>> dh.command('leg')ans =SerialLink([0, 0, 0, pi/2, 0; 0, 0, L1, 0, 0; 0, 0, -L2, 0, 0; ], 'name', 'leg', 'base', eye(4,4), 'tool', trotz(pi/2)*trotx(-pi/2)*trotz(-pi/2), 'offset', [pi/2 0 -pi/2 ])>> leg = eval(dh.command('leg'))leg =leg:: 3 axis, RRR, stdDH, slowRNE+---+-----------+-----------+-----------+-----------+-----------+| j | theta | d | a | alpha | offset |+---+-----------+-----------+-----------+-----------+-----------+| 1| q1| 0| 0| 1.5708| 1.5708|| 2| q2| 0| 0.1| 0| 0|| 3| q3| 0| -0.1| 0| -1.5708|+---+-----------+-----------+-----------+-----------+-----------+tool: t = (0, 0, 0), RPY/xyz = (0, -90, 0) deg>> leg.plot([0,0,0], 'nobase', 'noshadow','notiles')>> set(gca, 'Zdir', 'reverse'); view(137,48);
Erik
T = T*robot.tool;
dh = DHFactor(s);
dh.tool;
dh.command('leg');
leg = eval( dh.command('leg') );
leg.plot([0,0,0], 'nobase', 'noshadow', 'notiles'); %animate, line 114, no comment
transl(
leg.fkine([0.2,0,0]) );
transl( leg.fkine([0,0.2,0]) );
transl( leg.fkine([0,0,0.2]) );
%motion of one leg
xf = 50; xb = -xf; y = 50; zu = 20; zd = 50 ;
path = [xf y zd; xb y zd; xb y zu; xf y zu; xf y zd] * 1e-3 ;
p = mstraj(path, [], [0, 3, 0.25, 0.5, 0.25]', path(1,:), 0.01, 0);
qcycle = leg.ikine( SE3(p), 'mask', [1 1 1 0 0 0] );
leg.plot(qcycle, 'loop') ;
%motion of four legs
W = 0.1; L = 0.2;
legs(1) = SerialLink(leg, 'name', 'leg1');
legs(2) = SerialLink(leg, 'name', 'leg2', 'base', SE3(-L, 0, 0));
legs(3) = SerialLink(leg, 'name', 'leg3', 'base', SE3(-L, -W, 0)*SE3.Rz(pi));
legs(4) = SerialLink(leg, 'name', 'leg4', 'base', SE3(0, -W, 0)* SE3.Rz(pi));
while 1
legs(1).plot( gait(qcycle, k, 0, false) );
if k == 1, hold on; end
legs(2).plot( gait(qcycle, k, 100, false) );
legs(3).plot( gait(qcycle, k, 200, true) );
legs(4).plot( gait(qcycle, k, 300, true) );
drawnow
k = k+1;
end
tseg = [tseg; tseg];
peter