next up previous contents
Next: Appendix C Up: A PC-Based Simulator/Controller/Monitor Previous: Appendix A

Appendix B

The following is the simplified C code for the Jacobian of RRP:RRR manipulator. The Jacobian is derived by using Maple math engine. All the steps of derivation are listed. (The rest of Appendix B is not included)

This is Jacobian for RRP : RRR

file name : JRRP.mws

a1:=a1;

displaymath5067

a2:=a2;

displaymath5068

a3:=a3;

displaymath5069

a4:=0;

displaymath5070

a5:=0;

displaymath5071

a6:=0;

displaymath5072

d1:=d1;

displaymath5073

d2:=d2;

displaymath5074

d3:=d3;

displaymath5075

d4:=0;

displaymath5076

d5:=0;

displaymath5077

d6:=d6;

displaymath5078

alpha1:=alpha1;

displaymath5079

alpha2:=alpha2;

displaymath5080

alpha3:=alpha3;

displaymath5081

alpha4:=-Pi/2;

displaymath5082

alpha5:=Pi/2;

displaymath5083

alpha6:=0;

displaymath5084

theta1:=theta1;

displaymath5085

theta2:=theta2;

displaymath5086

theta3:=theta3;

displaymath5087

theta4:=theta4;

displaymath5088

theta5:=theta5;

displaymath5089

theta6:=theta6;

displaymath5090

tex2html_wrap_inline5209

displaymath5091

tex2html_wrap_inline5135

displaymath5092

tex2html_wrap_inline5137

displaymath5093

tex2html_wrap_inline5139

displaymath5094

tex2html_wrap_inline5141

displaymath5095

tex2html_wrap_inline5143

displaymath5096

AA:=evalm(A1&*A2&*A3&*A4&*A5&*A6):

AA1:=A1:

AA2:=evalm(A1&*A2):

AA3:=evalm(A1&*A2&*A3):

AA4:=evalm(A1&*A2&*A3&*A4):

AA5:=evalm(A1&*A2&*A3&*A4&*A5):

AA6:=evalm(A1&*A2&*A3&*A4&*A5&*A6):

Z0:=vector([0,0,1]):

Z1:=vector([AA1[1,3],AA1[2,3],AA1[3,3]]):

Z2:=vector([AA2[1,3],AA2[2,3],AA2[3,3]]):

Z3:=vector([AA3[1,3],AA3[2,3],AA3[3,3]]):

Z4:=vector([AA4[1,3],AA4[2,3],AA4[3,3]]):

Z5:=vector([AA5[1,3],AA5[2,3],AA5[3,3]]):

O0:=vector([0,0,0]):

O1:=vector([AA1[1,4],AA1[2,4],AA1[3,4]]):

O2:=vector([AA2[1,4],AA2[2,4],AA2[3,4]]):

O3:=vector([AA3[1,4],AA3[2,4],AA3[3,4]]):

O4:=vector([AA4[1,4],AA4[2,4],AA4[3,4]]):

O5:=vector([AA5[1,4],AA5[2,4],AA5[3,4]]):

O6:=vector([AA6[1,4],AA6[2,4],AA6[3,4]]):

O60:=evalm(O6-O0):

O61:=evalm(O6-O1):

O62:=evalm(O6-O2):

O63:=evalm(O6-O3):

O64:=evalm(O6-O4):

O65:=evalm(O6-O5):

CP0:=crossprod(Z0,O60):

CP1:=crossprod(Z1,O61):

CP2:=crossprod(Z2,O62):

CP3:=crossprod(Z3,O63):

CP4:=crossprod(Z4,O64):

CP5:=crossprod(Z5,O65):

J:=matrix([[CP0[1],CP1[1],Z2[1],CP3[1],CP4[1]

,CP5[1]],[CP0[2],CP1[2],Z2[2],CP3[2],CP4[2],CP5[2]],[CP0[3],CP1[3],Z2[

3],CP3[3],CP4[3],CP5[3]],[Z0[1],Z1[1],0,Z3[1],Z4[1],Z5[1]],[Z0[2],Z1[2

],0,Z3[2],Z4[2],Z5[2]],[Z0[3],Z1[3],0,Z3[3],Z4[3],Z5[3]]]):

J11:=J[1,1];

eqnarray3295

J12:=J[1,2];

eqnarray3376

J13:=J[1,3];

eqnarray3516

J14:=J[1,4];

eqnarray3530

J15:=J[1,5];

eqnarray3649

J16:=J[1,6];

displaymath5177

J21:=J[2,1];

eqnarray3785

J22:=J[2,2];

eqnarray3866

J23:=J[2,3];

eqnarray4006

-

-

-

-

-

-

-

J65:=J[6,5];

eqnarray4034

{J66:=J[6,6];

eqnarray4068

Then Jacobian is converted to a C Code

C(J,optimized);

t1 = sin(theta1);
t2 = cos(theta2);
t4 = cos(theta1);
t5 = cos(alpha1);
t6 = t4*t5;
t7 = sin(theta2);
t9 = t1*t2+t6*t7;
t10 = cos(theta3);
t12 = t1*t7;
t13 = cos(alpha2);
t15 = t2*t13;
t17 = sin(alpha1);
t18 = t4*t17;
t19 = sin(alpha2);
t21 = -t12*t13+t6*t15-t18*t19;
t22 = sin(theta3);
t24 = t9*t10+t21*t22;
t25 = cos(theta4); t27 = t9*t22;
t28 = cos(alpha3);
t30 = t21*t10;
t33 = t2*t19;
t36 = t12*t19-t6*t33-t18*t13;
t37 = sin(alpha3);
t39 = -t27*t28+t30*t28+t36*t37;
t40 = sin(theta4);
t43 = sin(theta5);
t45 = t27*t37;
t46 = t30*t37;
t47 = t36*t28;
t49 = cos(theta5);
t51 = (t24*t25+t39*t40)*t43-(-t45+t46-t47)*t49;
t52 = t51*d6;
t54 = t9*a3*t10;
t56 = t21*a3*t22;
t57 = t36*d3;
t59 = t1*a2*t2;
t60 = a2*t7;
t61 = t6*t60;
t62 = t18*d2;
t65 = t17*t7;
t67 = t17*t2;
t70 = t67*t13+t5*t19;
t72 = t65*t10+t70*t22;
t76 = t70*t10;
t80 = -t67*t19+t5*t13;
t82 = -t65*t22*t28+t76*t28+t80*t37;
t87 = t65*t22*t37;
t88 = t76*t37;
t89 = t80*t28;
t92 = (t72*t25+t82*t40)*t43-(-t87+t88-t89)*t49;
t102 = t92*d6+t65*a3*t10+t70*a3*t22+t80*d3+t17*a2*t7+t5*d2;
t104 = t52+t54+t56+t57+t59+t61-t62;
t107 = t4*t7;
t109 = t1*t5;
t111 = t1*t17;
t113 = t107*t19+t109*t33+t111*t13;
t114 = t45-t46+t47;
t117 = t87-t88+t89;
t123 = -t24*t40+t39*t25;
t128 = -t72*t40+t82*t25;
t134 = t4*t2-t109*t7;
t139 = -t107*t13-t109*t15+t111*t19;
t141 = t134*t10+t139*t22;
t143 = t134*t22;
t145 = t139*t10;
t148 = -t143*t28+t145*t28+t113*t37;
t152 = t143*t37;
t153 = t145*t37;
t154 = t113*t28;
t157 = (t141*t25+t148*t40)*t43-(-t152+t153-t154)*t49;
t158 = t157*d6;
t160 = t134*a3*t10;
t162 = t139*a3*t22;
t163 = t113*d3;
t165 = t4*a2*t2;
t166 = t109*t60;
t167 = t111*d2;
t170 = t158+t160+t162+t163+t165-t166+t167;
t176 = t152-t153+t154;
t184 = -t141*t40+t148*t25;
J[0][0] = -t52-t54-t56-t57-t59-t61+t62-a1*t1;
J[0][1] = -t18*t102-t5*t104;
J[0][2] = t113;
J[0][3] = t114*t92*d6-t117*t51*d6;
J[0][4] = t123*t92*d6-t128*t51*d6;
J[0][5] = 0.0;
J[1][0] = t158+t160+t162+t163+t165-t166+t167+a1*t4;
J[1][1] = t5*t170-t111*t102;
J[1][2] = t36;
J[1][3] = t117*t157*d6-t176*t92*d6;
J[1][4] = t128*t157*d6-t184*t92*d6;
J[1][5] = 0.0;
J[2][0] = 0.0;
J[2][1] = t111*t104+t18*t170;
J[2][2] = t80;
J[2][3] = t176*t51*d6-t114*t157*d6;
J[2][4] = t184*t51*d6-t123*t157*d6;
J[2][5] = 0.0;
J[3][0] = 0.0;
J[3][1] = t111;
J[3][2] = 0.0;
J[3][3] = t176;
J[3][4] = t184;
J[3][5] = t157;
J[4][0] = 0.0;
J[4][1] = -t18;
J[4][2] = 0.0;
J[4][3] = t114;
J[4][4] = t123;
J[4][5] = t51;
J[5][0] = 1.0;
J[5][1] = t5;
J[5][2] = 0.0;
J[5][3] = t117;
J[5][4] = t128;
J[5][5] = t92;

The folloeing is the Symbolic Inverse Jacobian. All the program do is to substitute the values of the elements of the jacobian matrix as a real numbers into the Inverse Jacobain.

This is Jacobian for RRP : RRR

file name : JRRP.mws

with(linalg):

a1:=a1;

displaymath5067

a2:=a2;

displaymath5068

a3:=a3;

displaymath5069

a4:=0;

displaymath5070

a5:=0;

displaymath5071

a6:=0;

displaymath5072

d1:=d1;

displaymath5073

d2:=d2;

displaymath5074

d3:=d3;

displaymath5075

d4:=0;

displaymath5076

d5:=0;

displaymath5077

d6:=d6;

displaymath5078

alpha1:=0;

displaymath6429

alpha2:=0;

displaymath6430

alpha3:=0;

displaymath6431

alpha4:=-Pi/2;

displaymath5082

alpha5:=Pi/2;

displaymath5083

alpha6:=0;

displaymath5084

theta1:=theta1;

displaymath5085

theta2:=theta2;

displaymath5086

theta3:=theta3;

displaymath5087

theta4:=theta4;

displaymath5088

theta5:=theta5;

displaymath5089

theta6:=theta6;

displaymath5090

tex2html_wrap_inline5209

displaymath6441

tex2html_wrap_inline5135

displaymath6442

tex2html_wrap_inline5137

displaymath6443

tex2html_wrap_inline5139

displaymath5094

tex2html_wrap_inline5141

displaymath5095

tex2html_wrap_inline5143

displaymath5096

AA:=evalm(A1*A2*A3*A4*A5*A6)

AA1:=A1:

AA2:=evalm(A1*A2):

AA3:=evalm(A1*A2*A3):

AA4:=evalm(A1*A2*A3*A4):

AA5:=evalm(A1*A2*A3*A4*A5):

AA6:=evalm(A1*A2*A3*A4*A5*A6):

Z0:=vector([0,0,1]):

Z1:=vector([AA1[1,3],AA1[2,3],AA1[3,3]]):

Z2:=vector([AA2[1,3],AA2[2,3],AA2[3,3]]):

Z3:=vector([AA3[1,3],AA3[2,3],AA3[3,3]]):

Z4:=vector([AA4[1,3],AA4[2,3],AA4[3,3]]):

Z5:=vector([AA5[1,3],AA5[2,3],AA5[3,3]]):

O0:=vector([0,0,0]):

O1:=vector([AA1[1,4],AA1[2,4],AA1[3,4]]):

O2:=vector([AA2[1,4],AA2[2,4],AA2[3,4]]):

O3:=vector([AA3[1,4],AA3[2,4],AA3[3,4]]):

O4:=vector([AA4[1,4],AA4[2,4],AA4[3,4]]):

O5:=vector([AA5[1,4],AA5[2,4],AA5[3,4]]):

O6:=vector([AA6[1,4],AA6[2,4],AA6[3,4]]):

O60:=evalm(O6-O0):

O61:=evalm(O6-O1):

O62:=evalm(O6-O2):

O63:=evalm(O6-O3):

O64:=evalm(O6-O4):

O65:=evalm(O6-O5):

CP0:=crossprod(Z0,O60):

CP1:=crossprod(Z1,O61):

CP2:=crossprod(Z2,O62):

CP3:=crossprod(Z3,O63):

CP4:=crossprod(Z4,O64):

CP5:=crossprod(Z5,O65):

tex2html_wrap_inline6544

readlib(C):

tex2html_wrap_inline6546

readlib(C);

displaymath6447

tex2html_wrap_inline6548

t1 = cos(theta1);
t2 = cos(theta2);
t3 = t1*t2;
t4 = cos(theta3);
t6 = t3*a3*t4;
t7 = t1*a2;
t8 = t7*t2;
t9 = t1*a3;
t10 = sin(theta3);
t11 = sin(theta2);
t12 = t10*t11;
t13 = t9*t12;
t14 = a3*t10;
t15 = sin(theta1);
t16 = t15*t2;
t17 = t14*t16;
t18 = a3*t15;
t19 = t11*t4;
t20 = t18*t19;
t21 = t15*a2;
t22 = t21*t11;
t23 = t6+t8-t13-t17-t20-t22;
t24 = t1*t1;
t25 = t24*a3;
t26 = t10*t2;
t29 = t24*a2;
t30 = t29*t11;
t31 = t15*t15;
t32 = t31*a3;
t35 = t31*a2;
t36 = t35*t11;
t38 = 1/(t25*t26+t25*t19+t30+t32*t26+t32*t19+t36);
t40 = 1/a1;
t42 = t9*t26;
t43 = t9*t19;
t44 = t7*t11;
t47 = t2*a3*t15*t4;
t48 = t21*t2;
t49 = t15*t11;
t50 = t14*t49;
t51 = t42+t43+t44+t47+t48-t50;
t55 = cos(theta5);
t57 = t55*t38*t40;
t61 = t2*t2;
t62 = t61*a3;
t63 = sin(theta4);
t64 = t4*t4;
t65 = t63*t64;
t66 = t62*t65;
t67 = t61*a2;
t68 = t63*t4;
t69 = t67*t68;
t70 = t10*t10;
t72 = t62*t70*t63;
t73 = cos(theta4);
t74 = t73*t10;
t75 = t67*t74;
t76 = t11*t11;
t78 = a3*t76*t65;
t80 = t76*t63;
t81 = t4*a2*t80;
t84 = t63*a3*t76*t70;
t85 = a2*t76;
t86 = t85*t74;
t88 = sin(theta5);
t90 = t14*t2;
t92 = a3*t11*t4;
t93 = a2*t11;
t95 = 1/(t90+t92+t93);
t97 = d6*t95*t40;
t100 = t6+t8+a1*t1-t13-t17-t20-t22;
t104 = t42+t43+t44+t47+t48-t50+a1*t15;
t111 = t2*t4;
t112 = t63*a1;
t114 = a1*t73;
t118 = t66+t69+t72+t75+t111*t112+t26*t114+t78+t81+t19*t114-t12*t112+t84+
t86; t121 = t73*t4;
t123 = t1*t11;
t129 = t63*t10;
t132 = t121*t16+t121*t123+t74*t3-t74*t49+t68*t3-t68*t49-t129*t123-t129*
t16; t143 = -t129*t3+t121*t3-t74*t123-t68*t123-t74*t16-t68*t16+t129*t49-t121*
t49; t149 = t15*t88*d6;
t150 = t73*t73;
t151 = t150*t64;
t152 = t151*t76;
t154 = t68*t11;
t158 = t74*t11;
t162 = t151*t61;
t164 = t63*t63;
t165 = t164*t64;
t166 = t165*t76;
t168 = t165*t61;
t170 = a3*t70;
t171 = t61*t73;
t174 = t18*t4;
t175 = t2*t73;
t176 = t175*t12;
t178 = t9*t4;
t179 = t11*t63;
t180 = t179*t26;
t182 = t76*t73;
t183 = t182*t10;
t185 = t164*t70;
t186 = t185*t76;
t188 = t9*t70;
t189 = t175*t11;
t191 = t9*t10;
t192 = t171*t4;
t194 = -t149*t152-t48*t154-t85*t121*t15-t48*t158+t85*t129*t15-t149*t162-
t149*t166-t149*t168-t170*t171*t15-2.0*t174*t176-2.0*t178*t180-t178*t18
3-t149* t186-t188*t189+t191*t192;
t195 = a3*t64;
t198 = t18*t70;
t199 = t179*t2;
t201 = t18*t64;
t203 = t150*t70;
t204 = t203*t76;
t207 = t61*t63*t10;
t209 = t64*t76;
t212 = t185*t61;
t214 = t203*t61;
t216 = t80*t4;
t218 = t9*t64;
t221 = t121*t2;
t223 = t129*t2;
t225 = t18*t10;\ t227 = t70*t61;
t230 = -t195*t182*t15+t198*t199-t201*t199-t149*t204-t174*t207-t9*t209*t63
-t149*t212-t149*t214-t7*t216+t218*t189-t7*t183+t44*t221-t44*t223+t225*
t216-t9* t227*t63; t233 = t76*t11;
t234 = t233*t150;
t235 = t234*t64;
t239 = t64*t4;
t240 = t25*t239;
t241 = t11*t164;
t242 = t241*t61; t244 = t25*t10;
t245 = t2*t150;
t246 = t245*t209;
t248 = t70*t10;
t249 = t25*t248;
t250 = t245*t76;
t252 = t61*t2;
t253 = t248*t252;
t254 = t253*t164;
t256 = t253*t150;
t258 = t239*t233;
t259 = t258*t164;
t261 = t25*t4;
t262 = t234*t70;
t264 = t258*t150;
t266 = t2*t164;
t267 = t266*t76;
t269 = t35*t235+t36*t214+t36*t212+t240*t242+t244*t246+
t249*t250+t25*t254+
t25*t256+t25*t259+t261*t262
+t25*t264+t249*t267;
t270 = t11*t150;
t271 = t270*t61;
t274 = t252*t164*t64;
t276 = t266*t209;
t278 = t32*t4;
t281 = t241*t227;
t283 = t270*t227;
t286 = t32*t248;
t288 = t32*t10;
t290 = t252*t150*t64;
t294 = t240*t271+t244*t274+t244*t276+
t278*t262+t32*t264+t278*t281+t278*
t283+t32*t254+t286*t250+t288*t290+
t32*t256+t288*t276;
t297 = t32*t239;
t300 = t233*t164;
t301 = t300*t70;
t306 = t300*t64;
t312 = t36*t168+t297*t242+t29*t235+t29*t301+t30*t168+
t30*t214+t261*t281+
t29*t306+t30*t162+
t30*t212+t35*t306+t36*t162;
t325 = t35*t301+t35*t262+t261*t301+t261*t283+t29*t262+
t288*t246+t288*t274
+t278*t301+t244*t290+t297*t271+t286*t267+t32*t259;
t329 = 1/t88;
t330 = 1/(t269+t294+t312+t325)*t329;
t341 = t1*t88*d6;
t351 = -2.0*t174*t180-t21*t216-t21*t183+t22*t221+
t8*t154+t8*t158+t7*t182*
t4+t341*t186-t7*t80*t10+t341*t152-t22*t223+t341*t214+t341*t204+t341*t1
62+t178* t207;
t373 = t341*t166+t341*t212-t195*t15*t76*t63-t198*t189-t170*t15*t61*t63-
t174*t183+t9*t227*t73+t225*t192+t341*t168+t9*t209*t73-t191*t216+t218*t
199+t201* t189+2.0*t178*t176-t188*t199;
t377 = t88*d6;
t378 = t377*t63;
t380 = t377*t73;
t386 = t24*t76;
t388 = t31*t61;
t390 = t24*t61;
t393 = t31*t76;
t406 = t185*t386+t185*t388+t203*t390+t151*t386+t203*t393+t151*t388+t165*
t390+t165*t393+t185*t390+t203*t386+t151*t393+t151*t390+t165*t386+t165*
t388+t185 *t393+t203*t388;
t407 = 1/t406;
t408 = t132*t407;
t409 = t143*t407;
Inverse_Jacobian[0][0] = t23*t38*t40;
Inverse_Jacobian[0][1] = t51*t38*t40;
Inverse_Jacobian[0][2] = 0.0;
Inverse_Jacobian[0][3] = t51*d6*t57;
Inverse_Jacobian[0][4] = -t23*d6*t57;
Inverse_Jacobian[0][5] = (t66+t69+t72+t75+t78+t81+t84+t86)*t88*t97;
Inverse_Jacobian[1][0] = -t100*t38*t40;
Inverse_Jacobian[1][1] = -t104*t38*t40;
Inverse_Jacobian[1][2] = 0.0;
Inverse_Jacobian[1][3] = -t104*d6*t57;
Inverse_Jacobian[1][4] = t100*d6*t57;
\ Inverse_Jacobian[1][5] = -t118*t88*t97;
Inverse_Jacobian[2][0] = 0.0;
Inverse_Jacobian[2][1] = 0.0;
Inverse_Jacobian[2][2] = 1.0;
Inverse_Jacobian[2][3] = -t132*t88*d6;
Inverse_Jacobian[2][4] = t143*t88*d6;
Inverse_Jacobian[2][5] = 0.0;
Inverse_Jacobian[3][0] = t1*t38;
Inverse_Jacobian[3][1] = t15*t38;
Inverse_Jacobian[3][2] = 0.0;
Inverse_Jacobian[3][3] = -(t194+t230)*t55*t330;
Inverse_Jacobian[3][4] = -(t351+t373)*t55*t330;
Inverse_Jacobian[3][5] = (t111*t378+t26*t380+t90+t92+t19*t380-t12*t378+ t93)*t95;
Inverse_Jacobian[4][0] = 0.0;
Inverse_Jacobian[4][1] = 0.0;
Inverse_Jacobian[4][2] = 0.0;
Inverse_Jacobian[4][3] = -t408;
Inverse_Jacobian[4][4] = t409;
Inverse_Jacobian[4][5] = 0.0;
Inverse_Jacobian[5][0] = 0.0;
Inverse_Jacobian[5][1] = 0.0;
Inverse_Jacobian[5][2] = 0.0;
Inverse_Jacobian[5][3] = t409*t329;
Inverse_Jacobian[5][4] = t408*t329;
Inverse_Jacobian[5][5] = 0.0;

tex2html_wrap_inline6550


next up previous contents
Next: Appendix C Up: A PC-Based Simulator/Controller/Monitor Previous: Appendix A

Abdelshakour Abuzneid
Fri Apr 18 16:15:07 EDT 1997