prima prova bracctio
Dependencies: Eigen MX64_senzaCorrente
Revision 0:82a5f03b7eb4, committed 2019-11-18
- Comitter:
- anfontanelli
- Date:
- Mon Nov 18 17:50:32 2019 +0000
- Commit message:
- arm created
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.gitignore Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,4 @@ +.build +.mbed +projectfiles +*.py*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ARM/ARAP180.cpp Mon Nov 18 17:50:32 2019 +0000
@@ -0,0 +1,1393 @@
+#include "ARAP180.h"
+#include "ARM_parameters.h"
+
+//*****************************************************************************
+
+ARAP180::ARAP180(){
+
+ q_sat_max(0) = M_PI/2;
+ q_sat_max(1) = M_PI;
+ q_sat_max(2) = M_PI;
+ q_sat_max(3) = M_PI/4;
+ q_sat_max(4) = M_PI;
+ q_sat_max(5) = M_PI/4;
+
+ q_sat_min(0) = -M_PI/2;
+ q_sat_min(1) = -M_PI/6;
+ q_sat_min(2) = -0.1;
+ q_sat_min(3) = -M_PI;
+ q_sat_min(4) = -M_PI;
+ q_sat_min(5) = -M_PI/4;
+
+ ID[0] = 1;
+ ID[1] = 2;
+ ID[2] = 3;
+ ID[3] = 4;
+ ID[4] = 5;
+
+ operatingMode[0] = 3;
+ operatingMode[1] = 3;
+ operatingMode[2] = 3;
+ operatingMode[3] = 3;
+ operatingMode[4] = 3;
+
+ enableVal[0] = 1;
+ enableVal[1] = 1;
+ enableVal[2] = 1;
+ enableVal[3] = 1;
+ enableVal[4] = 1;
+
+ motorSign(0) = 1;
+ motorSign(1) = -1;
+ motorSign(2) = 1;
+ motorSign(3) = 1;
+ motorSign(4) = -1;
+ motorSign(5) = 1;
+
+ offsets(0) = 0.0;
+ offsets(1) = 0.0;
+ offsets(2) = 0.0;
+ offsets(3) = 0.0;
+ offsets(4) = 0.0;
+ offsets(5) = 0.0;
+
+ dxl_port = new UARTSerial_half(PB_9,PB_8,PF_13, 1000000);
+ mx_MotorChain = new MX(ID, sizeof(ID)/sizeof(int), 1000000, dxl_port);
+}
+
+
+void ARAP180::initArmMotors(){
+ mx_MotorChain->SyncOperatingMode(operatingMode, -1);
+
+ //Accelleration init
+ printf("\n Inizializzo i profili di Accelerazione ");
+ setMaxAcc(100);
+
+
+
+ printf("\n Inizializzo i profili di Velocita' ");
+ setMaxVel(20);
+
+ mx_MotorChain->SyncTorqueEnable(enableVal, -1);
+ printf("Motori inizializzati!!\r\n");
+
+
+}
+
+
+void ARAP180::setMaxVel(float maxVel){
+
+ float Vel_profile[5] = {maxVel,maxVel,maxVel,maxVel,maxVel};
+ mx_MotorChain->SyncProfileVel(Vel_profile);
+
+}
+
+void ARAP180::setMaxAcc(float maxAcc){
+
+ float Acc_profile[5] = {maxAcc,maxAcc,maxAcc,maxAcc,maxAcc};
+ mx_MotorChain->SyncProfileAccel(Acc_profile);
+
+
+}
+
+
+void ARAP180::setJointPos(Vector6f q){
+
+
+ float Goal_position[5];
+
+ Goal_position[0] = utilities::rad2deg(q(0)) * motorSign(0) + offsets(0);
+ Goal_position[1] = utilities::rad2deg(q(1)) * motorSign(1) + offsets(1);
+ Goal_position[2] = utilities::rad2deg(q(2)) * motorSign(2) + offsets(2);
+ Goal_position[3] = utilities::rad2deg(q(3)) * motorSign(3) + offsets(3);
+ Goal_position[4] = utilities::rad2deg(q(4)) * motorSign(4) + offsets(4);
+
+
+ mx_MotorChain->SyncSetGoal(Goal_position);
+
+
+}
+
+
+Vector6f ARAP180::getJointPos(){
+
+ Vector6f getPosConverted = Vector6f::Zero();
+ float getPos[5];
+
+ mx_MotorChain->SyncGetPosition(getPos);
+
+
+ getPosConverted(0) = utilities::deg2rad(getPos[0] - offsets(0)) * motorSign(0);
+ getPosConverted(1) = utilities::deg2rad(getPos[1] - offsets(1)) * motorSign(1);
+ getPosConverted(2) = utilities::deg2rad(getPos[2] - offsets(2)) * motorSign(2);
+ getPosConverted(3) = utilities::deg2rad(getPos[3] - offsets(3)) * motorSign(3);
+ getPosConverted(4) = utilities::deg2rad(getPos[4] - offsets(4)) * motorSign(4);
+ getPosConverted(5) = (0.0 - offsets(4)) * motorSign(5);
+
+ return getPosConverted;
+
+}
+
+
+
+
+
+
+//Dyrect Kinematics Matrix Te
+Matrix4f ARAP180::forwardKinematics(Vector6f q){
+
+ Matrix4f A0 = Matrix4f::Zero();
+ float q1 = q[0];
+ float q2 = q[1];
+ float q3 = q[2];
+ float q4 = q[3];
+ float q5 = q[4];
+ float q6 = q[5];
+ float t2 = cos(q1);
+ float t3 = cos(q5);
+ float t4 = cos(q6);
+ float t5 = sin(q1);
+ float t6 = sin(q2);
+ float t7 = sin(q5);
+ float t8 = sin(q6);
+ float t9 = q2*-1.0;
+ float t10 = q2*1.0;
+ float t12 = -q2;
+ float t13 = -q3;
+ float t11 = a2*t6;
+ float t14 = t3*t5;
+ float t15 = t2*t3*1.0;
+ float t16 = q3+q4+t9;
+ float t17 = q2+t13;
+ float t19 = q3+q4+t12;
+ float t18 = cos(t17);
+ float t20 = sin(t17);
+ float t21 = cos(t16);
+ float t22 = sin(t16);
+ float t23 = cos(t19);
+ float t24 = sin(t19);
+ float t25 = a3*t18;
+ float t26 = a3i*t20*-1.0;
+ float t27 = a3i*t20*1.0;
+ float t28 = a4*t23*1.0;
+ float t29 = d5*t24*-1.0;
+ float t30 = d5*t24*1.0;
+ float t31 = t2*t7*t21;
+ float t32 = t5*t7*t21*-1.0;
+ float t33 = t5*t7*t21*1.0;
+ float t34 = t14+t31;
+ float t35 = t15+t32;
+ float t36 = a1+t11+t25+t26+t28+t29;
+ A0(0,0) = t4*t34+t2*t8*t22;
+ A0(0,1) = t8*t34*-1.0+t2*t4*t22;
+ A0(0,2) = t5*t7*-1.0+t2*t3*t23;
+ A0(0,3) = t2*t36;
+ A0(1,0) = t4*t35*-1.0+t5*t8*t22;
+ A0(1,1) = t8*t35+t4*t5*t22;
+ A0(1,2) = t2*t7+t14*t23;
+ A0(1,3) = t5*t36;
+ A0(2,0) = t8*t23*-1.0+t4*t7*t24;
+ A0(2,1) = t4*t23*-1.0-t7*t8*t24*1.0;
+ A0(2,2) = t3*t24;
+ A0(2,3) = a3*t20*-1.0+a4*t24*1.0-a3i*t18*1.0+d5*t23+a2*cos(q2);
+ A0(3,3) = 1.0;
+
+return A0;
+}
+
+//Jacobian matrix J
+Matrix6f ARAP180::jacobianMatrix(Vector6f q){
+
+ Matrix6f A0 = Matrix6f::Zero();
+ float q1 = q[0];
+ float q2 = q[1];
+ float q3 = q[2];
+ float q4 = q[3];
+ float q5 = q[4];
+ float q6 = q[5];
+ float t2 = cos(q1);
+ float t3 = cos(q2);
+ float t4 = cos(q5);
+ float t5 = sin(q1);
+ float t6 = sin(q2);
+ float t7 = sin(q5);
+ float t12 = -q2;
+ float t13 = -q3;
+ float t8 = t2*-1.0;
+ float t9 = t2*1.0;
+ float t10 = a2*t3;
+ float t11 = a2*t6;
+ float t15 = q2+t13;
+ float t17 = q3+q4+t12;
+ float t14 = a1+t11;
+ float t16 = cos(t15);
+ float t18 = sin(t15);
+ float t19 = cos(t17);
+ float t20 = sin(t17);
+ float t21 = a3*t16;
+ float t22 = a3i*t16*-1.0;
+ float t23 = a3i*t16*1.0;
+ float t24 = a3*t18*-1.0;
+ float t25 = a3*t18*1.0;
+ float t26 = a3i*t18*-1.0;
+ float t27 = a3i*t18*1.0;
+ float t28 = d5*t19;
+ float t29 = a4*t19*1.0;
+ float t30 = a4*t20*1.0;
+ float t31 = d5*t20*-1.0;
+ float t32 = d5*t20*1.0;
+ float t33 = t28+t30;
+ float t34 = t14+t21+t26;
+ float t35 = t29+t34;
+ float t40 = t22+t24+t33;
+ float t36 = t2*t35;
+ float t37 = t5*t35;
+ float t41 = t10+t40;
+ float t42 = t31+t35;
+ float t38 = -t36;
+ float t39 = -t37;
+ float t43 = t2*t42;
+ float t44 = t5*t42;
+ float t45 = t38+t43;
+ float t46 = t39+t44;
+ A0(0,0) = -t44;
+ A0(0,1) = t2*t41;
+ A0(0,2) = -t8*(t23+t25-t33);
+ A0(0,3) = t8*t33;
+ A0(0,4) = t19*(t37-t44)-t5*t20*t28*1.0;
+ A0(1,0) = t43;
+ A0(1,1) = t5*t41*1.0;
+ A0(1,2) = t5*(t23+t25-t33);
+ A0(1,3) = -t5*t33;
+ A0(1,4) = -t19*(t36-t43)+t9*t20*t28;
+ A0(2,1) = -t2*(t43-a1*t2)-t5*(t44-a1*t5)*1.0;
+ A0(2,2) = t5*(t44-t5*t14)+t9*(t43-t2*t14);
+ A0(2,3) = t5*(t44-t5*t34)+t9*(t43-t2*t34);
+ A0(2,4) = t5*t20*(t36-t43)*-1.0+t9*t20*(t37-t44);
+ A0(3,1) = t5*-1.0;
+ A0(3,2) = t5;
+ A0(3,3) = t5;
+ A0(3,4) = t8*t20;
+ A0(3,5) = t5*t7*-1.0+t2*t4*t19;
+ A0(4,1) = t2;
+ A0(4,2) = t8;
+ A0(4,3) = t8;
+ A0(4,4) = t5*t20*-1.0;
+ A0(4,5) = t2*t7+t4*t5*t19;
+ A0(5,0) = 1.0;
+ A0(5,4) = t19;
+ A0(5,5) = t4*t20;
+return A0;
+}
+
+Vector6f ARAP180::backwardKinematics(Matrix4f Td, Vector6f q_init, float Tsam, int n_max_iter, float max_pError, float max_oError ,float _Kp, float _Ko){
+
+
+ Matrix3f Kp = _Kp*Matrix3f::Identity();
+ Matrix3f Ko = _Ko*Matrix3f::Identity();
+
+ Vector6f q = Vector6f::Zero();
+
+ Vector6f dq = Vector6f::Zero();
+ Vector6f dp = Vector6f::Zero();
+ Matrix6f W_inv = Matrix6f::Identity();
+
+ //Set destination frame
+
+ Matrix4f Te = Matrix4f::Zero();
+ Matrix6f J = Matrix6f::Zero();
+ Matrix6f pinvJ = Matrix6f::Zero();
+ Matrix6f J_T = Matrix6f::Zero();
+ Matrix3f L = Matrix3f::Zero();
+ Matrix3f pinvL = Matrix3f::Zero();
+ Vector3f vp = Vector3f::Zero();
+ Vector3f vo = Vector3f::Zero();
+ Vector6f v = Vector6f::Zero();
+
+
+ int n_iter = 0;
+
+ float pError = 0.0;
+ float oError = 0.0;
+ q = q_init;
+ Te = forwardKinematics(q);
+ J = jacobianMatrix(q);
+
+
+ Vector3f ep = Td.block(0,3,3,1) - Te.block(0,3,3,1);
+ Vector3f eo = utilities::rotationMatrixError(Td, Te);
+
+ pError = ep.norm(); //L_2 norm of vector
+ oError = eo.norm();
+
+ while(n_iter<n_max_iter && (pError>max_pError || oError>max_oError)){
+
+ L = utilities::L_matrix(Td.block(0,0,3,3), Te.block(0,0,3,3));
+ //FullPivLU<Matrix3d> Core_L(L);
+ pinvL = L.inverse();
+
+
+ //vp = dp.block(0,0,3,1) + Kp*ep;
+ vp = Kp*ep;
+
+ vo = pinvL*(L.transpose()*dp.block(3,0,3,1) + Ko*eo);
+ //vo = (Ko*eo);
+ v << vp[0], vp[1], vp[2], vo[0], vo[1], vo[2];
+
+ //J_T = J.transpose();
+
+
+ // If we need a weighted pinv
+ //FullPivLU<Matrix6d> Core_J(J*W_inv*J_T);
+ //pinvJ = W_inv*J_T*Core_J.inverse();
+
+ //FullPivLU<Matrix6d> Core_J(J);
+
+ pinvJ = J.inverse();
+
+ dq = pinvJ*v;
+
+
+ q += dq*Tsam;
+
+
+ Te = forwardKinematics(q);
+
+
+ J = jacobianMatrix(q);
+
+
+ ep = Td.block(0,3,3,1) - Te.block(0,3,3,1);
+ eo = utilities::rotationMatrixError(Td, Te);
+
+ pError = ep.norm(); //L_2 norm of vector
+ oError = eo.norm();
+ n_iter++;
+ }
+ //cout << "posError: " << pError << " orError: " << oError << endl;
+
+
+return q;
+
+
+}
+
+Vector6f ARAP180::jointSaturation(Vector6f q){
+
+
+ Vector6f q_sat = q;
+ for(int i = 0; i<6; i++){
+
+ if(q_sat(i) > q_sat_max(i)){ q_sat(i) = q_sat_max(i);}
+ if(q_sat(i) < q_sat_min(i)){ q_sat(i) = q_sat_min(i);}
+
+ }
+
+
+
+ return q_sat;
+
+
+}
+
+
+// Inertia matrix B
+
+Matrix6f ARAP180::inertiaMatrix(Vector6f q){
+
+ Matrix6f A0 = Matrix6f::Zero();
+ float q1 = q[0];
+ float q2 = q[1];
+ float q3 = q[2];
+ float q4 = q[3];
+ float q5 = q[4];
+ float q6 = q[5];
+
+ float t2 = cos(q2);
+ float t3 = cos(q3);
+ float t4 = cos(q4);
+ float t5 = cos(q5);
+ float t6 = cos(q6);
+ float t7 = sin(q2);
+ float t8 = sin(q3);
+ float t9 = sin(q4);
+ float t10 = sin(q5);
+ float t11 = sin(q6);
+ float t12 = q3+q4;
+ float t13 = q4+q6;
+ float t14 = a1*a1;
+ float t15 = a2*a2;
+ float t16 = a3*a3;
+ float t17 = a4*a4;
+ float t18 = a3i*a3i;
+ float t19 = d5*d5;
+ float t20 = q2*2.0;
+ float t21 = q3*2.0;
+ float t22 = q4*2.0;
+ float t32 = -d5;
+ float t33 = -q2;
+ float t35 = -q3;
+ float t37 = -q4;
+ float t39 = -q5;
+ float t40 = -q6;
+ float t23 = cos(t20);
+ float t24 = a2*t2;
+ float t25 = a3i*t4;
+ float t26 = a2*t7;
+ float t27 = a3*t9;
+ float t28 = a4*t11;
+ float t29 = cos(t12);
+ float t30 = q5+t13;
+ float t31 = sin(t12);
+ float t34 = -t20;
+ float t36 = -t21;
+ float t38 = -t22;
+ float t41 = a3*mpx4*t4;
+ float t42 = a2*mpy3*t3;
+ float t43 = a2*mpx3*t8;
+ float t45 = a3i*mpx4*t9;
+ float t46 = mass4*t16;
+ float t47 = mass5*t16;
+ float t48 = mass6*t16;
+ float t49 = mass5*t17;
+ float t50 = mass6*t17;
+ float t51 = mass4*t18;
+ float t52 = mass5*t18;
+ float t53 = mass6*t18;
+ float t54 = mass6*t19;
+ float t56 = d5*mpy6*t6*2.0;
+ float t58 = a3*a4*mass5*t4;
+ float t59 = a3*a4*mass6*t4;
+ float t60 = a2*a3i*mass4*t3;
+ float t61 = a2*a3i*mass5*t3;
+ float t62 = a2*a3i*mass6*t3;
+ float t65 = a2*a3*mass4*t8;
+ float t66 = a2*a3*mass5*t8;
+ float t67 = a2*a3*mass6*t8;
+ float t68 = a4*a3i*mass5*t9;
+ float t69 = a4*a3i*mass6*t9;
+ float t71 = a3*t4*t11;
+ float t72 = d5*t6*t10;
+ float t73 = a3i*t9*t11;
+ float t75 = q2+t35;
+ float t76 = q4+t40;
+ float t83 = t12+t33;
+ float t86 = t13+t39;
+ float t87 = q5+q6+t37;
+ float t108 = a2*mpx4*t3*t9;
+ float t109 = a2*mpx4*t4*t8;
+ float t111 = d5*mpy6*t5*t11;
+ float t113 = t20+t35;
+ float t115 = a2*d5*mass6*t3*t4;
+ float t116 = a2*a4*mass5*t3*t9;
+ float t117 = a2*a4*mass5*t4*t8;
+ float t118 = a2*a4*mass6*t3*t9;
+ float t119 = a2*a4*mass6*t4*t8;
+ float t121 = a2*d5*mass6*t8*t9;
+ float t150 = a2*mpy6*t3*t4*t6;
+ float t153 = a2*mpy6*t6*t8*t9;
+ float t167 = a2*mass6*t3*t4*t32;
+ float t182 = a2*mpy6*t3*t9*t10*t11;
+ float t183 = a2*mpy6*t4*t8*t10*t11;
+ float t197 = q6-t12*2.0+t20;
+ float t44 = mpy6*t28;
+ float t55 = t41*2.0;
+ float t57 = t45*2.0;
+ float t63 = a2*t29;
+ float t64 = d5*mass6*t25;
+ float t70 = d5*mass6*t27;
+ float t74 = -t25;
+ float t77 = -t27;
+ float t78 = -t41;
+ float t80 = -t42;
+ float t81 = cos(t75);
+ float t82 = -t56;
+ float t84 = t12+t34;
+ float t85 = q5+t76;
+ float t88 = -t43;
+ float t89 = -t45;
+ float t91 = sin(t75);
+ float t92 = t58*2.0;
+ float t93 = t59*2.0;
+ float t95 = t68*2.0;
+ float t96 = t69*2.0;
+ float t98 = -t46;
+ float t99 = -t47;
+ float t100 = -t48;
+ float t101 = -t49;
+ float t102 = -t50;
+ float t103 = -t51;
+ float t104 = -t52;
+ float t105 = -t53;
+ float t106 = -t54;
+ float t107 = mpy6*t6*t25;
+ float t110 = mpy6*t6*t27;
+ float t112 = mpy6*t72;
+ float t114 = t20+t36;
+ float t120 = t6*t10*t25;
+ float t122 = t6*t10*t27;
+ float t123 = -t58;
+ float t125 = -t59;
+ float t127 = mass6*t25*t32;
+ float t129 = -t65;
+ float t130 = -t66;
+ float t131 = -t67;
+ float t132 = -t68;
+ float t134 = -t69;
+ float t136 = cos(t83);
+ float t137 = mass6*t27*t32;
+ float t139 = sin(t83);
+ float t141 = -t73;
+ float t145 = cos(t113);
+ float t148 = sin(t113);
+ float t154 = mpy6*t10*t71;
+ float t159 = mpy6*t10*t73;
+ float t160 = -t108;
+ float t161 = -t109;
+ float t169 = -t116;
+ float t170 = -t117;
+ float t171 = -t118;
+ float t172 = -t119;
+ float t185 = -t153;
+ float t196 = q6-t12+t113;
+ float t198 = t25+t27+t32;
+ float t203 = q5+t197;
+ float t79 = -t55;
+ float t90 = -t57;
+ float t94 = t64*2.0;
+ float t97 = t70*2.0;
+ float t124 = -t92;
+ float t126 = -t93;
+ float t133 = -t95;
+ float t135 = -t96;
+ float t140 = sin(t84);
+ float t142 = t107*2.0;
+ float t143 = t110*2.0;
+ float t144 = t10*t44*2.0;
+ float t146 = cos(t114);
+ float t147 = q3+t84;
+ float t149 = sin(t114);
+ float t151 = a3*t81;
+ float t152 = a3i*t81;
+ float t155 = a3*t91;
+ float t156 = a3i*t91;
+ float t157 = mpy6*t6*t74;
+ float t162 = mpy6*t6*t77;
+ float t165 = a4*t136;
+ float t166 = d5*t136;
+ float t168 = a4*t139;
+ float t173 = d5*t139;
+ float t174 = t6*t10*t74;
+ float t175 = t6*t10*t77;
+ float t176 = t154*2.0;
+ float t178 = t159*2.0;
+ float t186 = -t154;
+ float t188 = t12+t84;
+ float t191 = mpy6*t10*t141;
+ float t195 = t32*t139;
+ float t202 = q5+t196;
+ float t206 = mpy6*t5*t11*t198;
+ float t207 = d5+t63+t74+t77;
+ float t128 = -t94;
+ float t138 = -t97;
+ float t158 = -t142;
+ float t163 = -t143;
+ float t164 = -t144;
+ float t177 = cos(t147);
+ float t179 = q6+t147;
+ float t180 = sin(t147);
+ float t184 = -t152;
+ float t187 = -t176;
+ float t189 = -t155;
+ float t190 = -t156;
+ float t192 = -t178;
+ float t193 = cos(t188);
+ float t194 = q6+t188;
+ float t200 = q5+t40+t147;
+ float t204 = q5+t40+t188;
+ float t208 = t166+t168;
+ float t209 = -t206;
+ float t210 = mpy6*t5*t11*t207;
+ float t214 = t28+t71+t72+t141+t174+t175;
+ float t218 = -mpy6*t5*t11*(t152+t155-t168+t32*t136);
+ float t225 = t45+t56+t64+t68+t69+t70+t78+t101+t102+t106+t121+t123+t125+t144+t150+t154+t157+t160+t161+t162+t167+t169+t170+t171+t172+t182+t183+t185+t191;
+ float t181 = q5+t179;
+ float t199 = q5+t194;
+ float t201 = t39+t179;
+ float t205 = t39+t194;
+ float t211 = mpy6*t5*t11*t208;
+ float t212 = -t210;
+ float t213 = t184+t189+t208;
+ float t216 = mpy6*t214;
+ float t217 = a1+t26+t151+t165+t190+t195;
+ float t224 = t41+t49+t50+t54+t58+t59+t82+t89+t107+t110+t127+t132+t134+t137+t159+t164+t186;
+ float t226 = t56+t57+t60+t61+t62+t79+t80+t88+t94+t95+t96+t97+t98+t99+t100+t101+t102+t103+t104+t105+t106+t121+t124+t126+t129+t130+t131+t144+t150+t158+t160+t161+t163+t167+t169+t170+t171+t172+t176+t182+t183+t185+t192;
+ float t215 = t24+t213;
+ float t220 = mpy6*t10*t11*t217;
+ float t221 = mpy6*t5*t6*t217;
+ float t219 = mpy6*t5*t11*t215;
+ float t223 = -t220;
+ float t222 = -t219;
+ A0(0,0) = t41+t42+t43+t46/2.0+t47/2.0+t48/2.0+t49/2.0+t50/2.0+t51/2.0+t52/2.0+t53/2.0+t54/2.0+t58+t59-t60-t61-t62+t65+t66+t67+t89+t127+t132+t134+t137+mass2*t14+mass3*t14+(mass3*t15)/2.0+mass4*t14+(mass4*t15)/2.0+mass5*t14+(mass5*t15)/2.0+mass6*t14+(mass6*t15)/2.0+(t46*t146)/2.0+(t47*t146)/2.0+(t48*t146)/2.0-(t51*t146)/2.0-(t52*t146)/2.0-(t53*t146)/2.0+(t49*t193)/2.0+(t50*t193)/2.0-(t54*t193)/2.0+(a3*mpy6*cos(t30))/4.0-(a3*mpy6*cos(t85))/4.0-(a3*mpy6*cos(t86))/4.0+(a3*mpy6*cos(t87))/4.0+(a3*mpy6*cos(t181))/4.0-(a3*mpy6*cos(t200))/4.0+(a4*mpy6*cos(t199))/4.0-(a3*mpy6*cos(t201))/4.0+(a3*mpy6*cos(t202))/4.0+(a4*mpy6*cos(t203))/4.0-(a4*mpy6*cos(t204))/4.0-(a4*mpy6*cos(t205))/4.0+(a3i*mpy6*cos(t13))/2.0+(a3i*mpy6*cos(t76))/2.0-(a3i*mpy6*cos(t179))/2.0-(a3i*mpy6*cos(t196))/2.0+(d5*mpy6*cos(t194))/2.0+(d5*mpy6*cos(t197))/2.0+(a3*mpy6*sin(t13))/2.0+(a3*mpy6*sin(t76))/2.0+(a3*mpy6*sin(t179))/2.0+(a4*mpy6*sin(t194))/2.0-(a3*mpy6*sin(t196))/2.0-(a4*mpy6*sin(t197))/2.0-(a3i*mpy6*sin(t30))/4.0+(a3i*mpy6*sin(t85))/4.0+(a3i*mpy6*sin(t86))/4.0+(a3i*mpy6*sin(t87))/4.0+(a3i*mpy6*sin(t181))/4.0-(a3i*mpy6*sin(t200))/4.0-(a3i*mpy6*sin(t201))/4.0-(a3i*mpy6*sin(t202))/4.0+(a1*mpy6*cos(q2+q5+q6-t12))/2.0-(d5*mpy6*sin(t199))/4.0+(d5*mpy6*sin(t203))/4.0+(d5*mpy6*sin(t204))/4.0+(d5*mpy6*sin(t205))/4.0+(a2*mpy6*sin(q5+q6-t12+t20))/4.0+(a1*mpy6*cos(q5+q6+t83))/2.0-(a1*mpy6*cos(q5+t40+t83))/2.0-(a1*mpy6*cos(q6+t39+t83))/2.0+(a2*mpy6*sin(q5+q6+t12))/4.0-(a2*mpy6*sin(q5+q6+t84))/4.0-(a2*mpy6*sin(q5+t12+t40))/4.0-(a2*mpy6*sin(q6+t12+t39))/4.0+(a2*mpy6*sin(q5+t40+t84))/4.0+(a2*mpy6*sin(q6+t39+t84))/4.0+(a2*mpy6*sin(t12+t39+t40))/4.0+a1*mass3*t26*2.0+a1*mass4*t26*2.0+a1*mass5*t26*2.0+a1*mass6*t26*2.0+a1*mass4*t151*2.0+a1*mass5*t151*2.0+a1*mass6*t151*2.0-a1*mass4*t156*2.0-a1*mass5*t156*2.0-a1*mass6*t156*2.0+a1*mass5*t165*2.0+a1*mass6*t165*2.0-a1*mass6*t173*2.0+a1*mpx2*t7*2.0+a2*mpx4*t31+a1*mpx3*t81*2.0+a1*mpx4*t136*2.0-a2*mpx4*t140+a2*mpx3*t148+a3*mpx4*t177-a1*mpy2*t2*2.0+a1*mpy3*t91*2.0-a2*mpy3*t145+a3i*mpx4*t180+d5*mass6*t63+(a2*mpy6*cos(q6-t12+t20))/2.0-(mass3*t15*t23)/2.0-(mass4*t15*t23)/2.0-(mass5*t15*t23)/2.0-(mass6*t15*t23)/2.0+mpy6*t6*t32-a1*mpy6*sin(q2+q6-t12)+(a4*mpy6*cos(q5+q6))/2.0-(a2*mpy6*cos(q6+t12))/2.0-(a4*mpy6*cos(q5+t40))/2.0+(a2*mpy6*cos(q6+t84))/2.0-(a2*mpy6*cos(t12+t40))/2.0+a1*mpy6*sin(q6+t83)+a2*a4*mass5*t31+a2*a4*mass6*t31-a2*a4*mass5*t140-a2*a4*mass6*t140+a2*a3*mass4*t148+a2*a3*mass5*t148+a2*a3*mass6*t148+a3*a4*mass5*t177+a3*a4*mass6*t177+a2*a3i*mass4*t145+a2*a3i*mass5*t145+a2*a3i*mass6*t145-a3*a3i*mass4*t149-a3*a3i*mass5*t149-a3*a3i*mass6*t149+a4*a3i*mass5*t180+a4*a3i*mass6*t180+a3i*d5*mass6*t177+a3*mass6*t32*t180+a2*mass6*t32*cos(t84)+a4*mass6*t32*sin(t188);
+ A0(0,1) = t222;
+ A0(0,2) = t218;
+ A0(0,3) = t211;
+ A0(0,4) = t223;
+ A0(0,5) = t221;
+ A0(1,0) = t222;
+ A0(1,1) = t42*2.0+t43*2.0+t46+t47+t48+t49+t50+t51+t52+t53+t54+t55-t60*2.0-t61*2.0-t62*2.0+t65*2.0+t66*2.0+t67*2.0+t82+t90+t92+t93+t108*2.0+t109*2.0+t115*2.0+t116*2.0+t117*2.0+t118*2.0+t119*2.0-t121*2.0+t128+t133+t135+t138+t142+t143-t150*2.0+t153*2.0+t164+t178-t182*2.0-t183*2.0+t187+mass3*t15+mass4*t15+mass5*t15+mass6*t15;
+ A0(1,2) = t226;
+ A0(1,3) = t225;
+ A0(1,4) = t212;
+ A0(1,5) = -t44-mpy6*t71+mpy6*t73+t10*t107+t10*t110-t10*t150+t10*t153+mpy6*t6*t10*t32-a2*mpy6*t3*t9*t11-a2*mpy6*t4*t8*t11;
+ A0(2,0) = t218;
+ A0(2,1) = t226;
+ A0(2,2) = t46+t47+t48+t49+t50+t51+t52+t53+t54+t55+t82+t90+t92+t93+t128+t133+t135+t138+t142+t143+t164+t178+t187;
+ A0(2,3) = t224;
+ A0(2,4) = t209;
+ A0(2,5) = t216;
+ A0(3,0) = t211;
+ A0(3,1) = t225;
+ A0(3,2) = t224;
+ A0(3,3) = t49+t50+t54+t82+t164;
+ A0(3,4) = t111;
+ A0(3,5) = t44+t112;
+ A0(4,0) = t223;
+ A0(4,1) = t212;
+ A0(4,2) = t209;
+ A0(4,3) = t111;
+ A0(5,0) = t221;
+ A0(5,1) = -mpy6*(t214+a2*t3*t9*t11+a2*t4*t8*t11+a2*t3*t4*t6*t10-a2*t6*t8*t9*t10);
+ A0(5,2) = t216;
+ A0(5,3) = mpy6*(t28+t72);
+return A0;
+}
+
+
+
+// Inertia matrix B
+Vector6f ARAP180::gravityVector(Vector6f q){
+
+ Vector6f A0 = Vector6f::Zero();
+ float q1 = q[0];
+ float q2 = q[1];
+ float q3 = q[2];
+ float q4 = q[3];
+ float q5 = q[4];
+ float q6 = q[5];
+
+ float t2 = sin(q2);
+ float t3 = sin(q6);
+ float t4 = -q2;
+ float t5 = -q3;
+ float t6 = -q4;
+ float t7 = -q5;
+ float t8 = -q6;
+ float t9 = q2+t5;
+ float t11 = q3+q4+t4;
+ float t10 = cos(t9);
+ float t12 = sin(t9);
+ float t13 = cos(t11);
+ float t14 = q6+t11;
+ float t15 = sin(t11);
+ float t19 = q6+t6+t9;
+ float t21 = q5+t8+t11;
+ float t16 = q5+t14;
+ float t17 = sin(t14);
+ float t20 = q5+t19;
+ float t22 = t7+t14;
+ float t23 = sin(t19);
+ float t25 = cos(t21);
+ float t27 = mpx3*t10*9.814;
+ float t28 = mpy3*t12*9.814;
+ float t29 = a3*mass4*t10*9.814;
+ float t30 = a3*mass5*t10*9.814;
+ float t31 = a3*mass6*t10*9.814;
+ float t32 = a3i*mass4*t12*9.814;
+ float t33 = a3i*mass5*t12*9.814;
+ float t34 = a3i*mass6*t12*9.814;
+ float t35 = mpx4*t13*9.814;
+ float t36 = a4*mass5*t13*9.814;
+ float t37 = a4*mass6*t13*9.814;
+ float t38 = d5*mass6*t15*9.814;
+ float t18 = cos(t16);
+ float t24 = cos(t20);
+ float t26 = cos(t22);
+ float t39 = -t38;
+ float t40 = mpy6*t17*4.907;
+ float t42 = mpy6*t23*4.907;
+ float t45 = mpy6*t25*2.4535;
+ float t41 = mpy6*t18*2.4535;
+ float t43 = -t42;
+ float t44 = mpy6*t24*2.4535;
+ float t46 = mpy6*t26*2.4535;
+ float t47 = -t45;
+ float t48 = -t46;
+ A0(1) = -t27-t28-t29-t30-t31+t32+t33+t34-t35-t36-t37+t38-t40-t41+t42-t44+t45+t46-mpx2*t2*9.814+mpy2*cos(q2)*9.814-a2*mass3*t2*9.814-a2*mass4*t2*9.814-a2*mass5*t2*9.814-a2*mass6*t2*9.814;
+ A0(2) = t27+t28+t29+t30+t31-t32-t33-t34+t35+t36+t37+t39+t40+t41+t43+t44+t47+t48;
+ A0(3) = t35+t36+t37+t39+t40+t41+t43+t44+t47+t48;
+ A0(4) = mpy6*t3*(sin(q5+t6+t9)-sin(q5+t11))*4.907;
+ A0(5) = mpy6*(t3*t13*9.814-t15*cos(q6)*sin(q5)*9.814);
+return A0;
+}
+
+
+Vector6f ARAP180::frictionVector(Vector6f dq){
+
+ Vector6f A0 = Vector6f::Zero();
+ float dq1 = dq[0];
+ float dq2 = dq[1];
+ float dq3 = dq[2];
+ float dq4 = dq[3];
+ float dq5 = dq[4];
+ float dq6 = dq[5];
+
+ A0(0) = Fv1*dq1+Fs1*((dq1/fabs(dq1)));
+ A0(1) = Fv2*dq2+Fs2*((dq2/fabs(dq2)));
+ A0(2) = Fv3*dq3+Fs3*((dq3/fabs(dq3)));
+ A0(3) = Fv4*dq4+Fs4*((dq4/fabs(dq4)));
+ A0(4) = Fv5*dq5+Fs5*((dq5/fabs(dq5)));
+ A0(5) = Fv6*dq6+Fs6*((dq6/fabs(dq6)));
+return A0;
+
+}
+
+Vector6f ARAP180::stiffnessVector(Vector6f q){
+
+ Vector6f A0 = Vector6f::Zero();
+ float q1 = q[0];
+ float q2 = q[1];
+ float q3 = q[2];
+ float q4 = q[3];
+ float q5 = q[4];
+ float q6 = q[5];
+
+ A0(1) = O2+K2*q2;
+ A0(2) = O3+K3*q3;
+ A0(3) = O4+K4*q4;
+return A0;
+
+}
+
+/*
+Matrix6f ARAP180::coriolisCentrifugalMatrix(Vector6f q, Vector6f dq){
+
+ Matrix6f A0 = Matrix6f::Zero();
+ float q1 = q[0];
+ float q2 = q[1];
+ float q3 = q[2];
+ float q4 = q[3];
+ float q5 = q[4];
+ float q6 = q[5];
+ float dq1 = dq[0];
+ float dq2 = dq[1];
+ float dq3 = dq[2];
+ float dq4 = dq[3];
+ float dq5 = dq[4];
+ float dq6 = dq[5];
+
+ float t2 = cos(q2);
+ float t3 = cos(q3);
+ float t4 = cos(q4);
+ float t5 = cos(q5);
+ float t6 = cos(q6);
+ float t7 = sin(q2);
+ float t8 = sin(q3);
+ float t9 = sin(q4);
+ float t10 = sin(q5);
+ float t11 = sin(q6);
+ float t12 = q3+q4;
+ float t13 = q4+q6;
+ float t14 = q5+q6;
+ float t15 = a2*a2;
+ float t16 = a3*a3;
+ float t17 = a4*a4;
+ float t18 = a3i*a3i;
+ float t19 = d5*d5;
+ float t20 = q2*2.0;
+ float t21 = q3*2.0;
+ float t22 = q4*2.0;
+ float t36 = -q2;
+ float t38 = -q3;
+ float t40 = -q4;
+ float t42 = -q5;
+ float t43 = -q6;
+ float t23 = cos(t20);
+ float t24 = cos(t21);
+ float t25 = cos(t22);
+ float t26 = sin(t20);
+ float t27 = sin(t21);
+ float t28 = sin(t22);
+ float t29 = cos(t12);
+ float t30 = cos(t13);
+ float t31 = q6+t12;
+ float t32 = q5+t13;
+ float t33 = sin(t12);
+ float t34 = sin(t13);
+ float t35 = sin(t14);
+ float t37 = -t20;
+ float t39 = -t21;
+ float t41 = -t22;
+ float t45 = t12+t14;
+ float t48 = a4*dq4*t5;
+ float t49 = d5*dq2*t11*2.0;
+ float t50 = d5*dq3*t11*2.0;
+ float t51 = d5*dq4*t11*2.0;
+ float t52 = dq6*t5*t6;
+ float t54 = dq5*t10*t11;
+ float t55 = q2+t38;
+ float t56 = q4+t43;
+ float t57 = q5+t43;
+ float t61 = t12+t36;
+ float t63 = q3+q5+t36;
+ float t65 = t12+t43;
+ float t67 = t13+t42;
+ float t68 = t14+t40;
+ float t72 = a3i*dq2*mpx4*t4*2.0;
+ float t73 = a3i*dq3*mpx4*t4*2.0;
+ float t74 = a3i*dq4*mpx4*t4*2.0;
+ float t75 = a3*dq2*mpx4*t9*2.0;
+ float t76 = a3*dq3*mpx4*t9*2.0;
+ float t77 = a3*dq4*mpx4*t9*2.0;
+ float t81 = d5*dq6*mpy6*t11*2.0;
+ float t82 = t20+t38;
+ float t98 = d5*dq2*mpy6*t11*-2.0;
+ float t103 = q3+t14+t36;
+ float t116 = a4*a3i*dq2*mass5*t4*2.0;
+ float t117 = a4*a3i*dq2*mass6*t4*2.0;
+ float t118 = a4*a3i*dq3*mass5*t4*2.0;
+ float t119 = a4*a3i*dq3*mass6*t4*2.0;
+ float t120 = a4*a3i*dq4*mass5*t4*2.0;
+ float t121 = a4*a3i*dq4*mass6*t4*2.0;
+ float t122 = a3*d5*dq2*mass6*t4*2.0;
+ float t123 = a3*d5*dq3*mass6*t4*2.0;
+ float t124 = a3*d5*dq4*mass6*t4*2.0;
+ float t125 = a3*a4*dq2*mass5*t9*2.0;
+ float t126 = a3*a4*dq2*mass6*t9*2.0;
+ float t127 = a3*a4*dq3*mass5*t9*2.0;
+ float t128 = a3*a4*dq3*mass6*t9*2.0;
+ float t129 = a3*a4*dq4*mass5*t9*2.0;
+ float t130 = a3*a4*dq4*mass6*t9*2.0;
+ float t131 = a3i*d5*dq2*mass6*t9*2.0;
+ float t132 = a3i*d5*dq3*mass6*t9*2.0;
+ float t133 = a3i*d5*dq4*mass6*t9*2.0;
+ float t134 = a4*dq2*t6*t10*2.0;
+ float t135 = a4*dq3*t6*t10*2.0;
+ float t136 = a4*dq4*t6*t10*2.0;
+ float t137 = a2*dq2*mpx4*t3*t4*2.0;
+ float t138 = a2*dq3*mpx4*t3*t4*2.0;
+ float t139 = a2*dq4*mpx4*t3*t4*2.0;
+ float t140 = a3*dq2*mpy6*t4*t6*2.0;
+ float t141 = a3*dq3*mpy6*t4*t6*2.0;
+ float t142 = a3*dq4*mpy6*t4*t6*2.0;
+ float t143 = d5*dq5*mpy6*t5*t6*2.0;
+ float t145 = a4*dq2*mpy6*t5*t11*2.0;
+ float t147 = a4*dq3*mpy6*t5*t11*2.0;
+ float t151 = a4*dq5*mpy6*t5*t11*2.0;
+ float t152 = a4*dq6*mpy6*t6*t10*2.0;
+ float t153 = a3i*dq2*mpy6*t4*t11*2.0;
+ float t154 = a3i*dq2*mpy6*t6*t9*2.0;
+ float t155 = a3i*dq3*mpy6*t4*t11*2.0;
+ float t156 = a3i*dq3*mpy6*t6*t9*2.0;
+ float t157 = a3i*dq4*mpy6*t4*t11*2.0;
+ float t158 = a3i*dq4*mpy6*t6*t9*2.0;
+ float t159 = a3i*dq6*mpy6*t4*t11*2.0;
+ float t160 = a2*dq2*mpx4*t8*t9*2.0;
+ float t161 = a2*dq3*mpx4*t8*t9*2.0;
+ float t162 = a2*dq4*mpx4*t8*t9*2.0;
+ float t163 = a3*dq2*mpy6*t9*t11*2.0;
+ float t164 = a3*dq3*mpy6*t9*t11*2.0;
+ float t165 = a3*dq4*mpy6*t9*t11*2.0;
+ float t166 = a3*dq6*mpy6*t9*t11*2.0;
+ float t175 = a3i*dq1*t2*t3*t10;
+ float t176 = a3*dq1*t2*t8*t10;
+ float t177 = a3*dq1*t3*t7*t10;
+ float t188 = a3i*dq1*t7*t8*t10;
+ float t215 = a4*dq3*mpy6*t6*t10*-2.0;
+ float t217 = a4*dq4*mpy6*t6*t10*-2.0;
+ float t229 = a2*a4*dq2*mass5*t3*t4*2.0;
+ float t230 = a2*a4*dq2*mass6*t3*t4*2.0;
+ float t231 = a2*a4*dq3*mass5*t3*t4*2.0;
+ float t232 = a2*a4*dq3*mass6*t3*t4*2.0;
+ float t233 = a2*a4*dq4*mass5*t3*t4*2.0;
+ float t234 = a2*a4*dq4*mass6*t3*t4*2.0;
+ float t235 = a2*d5*dq2*mass6*t3*t9*2.0;
+ float t236 = a2*d5*dq2*mass6*t4*t8*2.0;
+ float t237 = a2*d5*dq3*mass6*t3*t9*2.0;
+ float t238 = a2*d5*dq3*mass6*t4*t8*2.0;
+ float t239 = a2*d5*dq4*mass6*t3*t9*2.0;
+ float t240 = a2*d5*dq4*mass6*t4*t8*2.0;
+ float t241 = a2*a4*dq2*mass5*t8*t9*2.0;
+ float t242 = a2*a4*dq2*mass6*t8*t9*2.0;
+ float t243 = a2*a4*dq3*mass5*t8*t9*2.0;
+ float t244 = a2*a4*dq3*mass6*t8*t9*2.0;
+ float t245 = a2*a4*dq4*mass5*t8*t9*2.0;
+ float t246 = a2*a4*dq4*mass6*t8*t9*2.0;
+ float t250 = a3i*dq5*mpy6*t4*t5*t6*2.0;
+ float t252 = a2*dq2*mpy6*t3*t6*t9*2.0;
+ float t253 = a2*dq2*mpy6*t4*t6*t8*2.0;
+ float t254 = a2*dq3*mpy6*t3*t6*t9*2.0;
+ float t255 = a2*dq3*mpy6*t4*t6*t8*2.0;
+ float t256 = a2*dq4*mpy6*t3*t6*t9*2.0;
+ float t257 = a2*dq4*mpy6*t4*t6*t8*2.0;
+ float t258 = a3*dq2*mpy6*t4*t5*t11*2.0;
+ float t260 = a2*dq6*mpy6*t3*t4*t11*2.0;
+ float t261 = a3*dq3*mpy6*t4*t5*t11*2.0;
+ float t263 = a3*dq4*mpy6*t4*t5*t11*2.0;
+ float t265 = a3*dq5*mpy6*t4*t5*t11*2.0;
+ float t266 = a3*dq5*mpy6*t5*t6*t9*2.0;
+ float t267 = a3*dq6*mpy6*t4*t6*t10*2.0;
+ float t270 = a3i*dq2*mpy6*t5*t9*t11*2.0;
+ float t273 = a3i*dq3*mpy6*t5*t9*t11*2.0;
+ float t276 = a3i*dq4*mpy6*t5*t9*t11*2.0;
+ float t278 = a3i*dq5*mpy6*t5*t9*t11*2.0;
+ float t279 = a3i*dq6*mpy6*t6*t9*t10*2.0;
+ float t281 = a2*dq6*mpy6*t8*t9*t11*2.0;
+ float t287 = d5*dq1*t2*t3*t4*t10;
+ float t288 = a4*dq1*t2*t3*t9*t10;
+ float t289 = a4*dq1*t2*t4*t8*t10;
+ float t290 = a4*dq1*t3*t4*t7*t10;
+ float t291 = d5*dq1*t2*t8*t9*t10;
+ float t292 = d5*dq1*t3*t7*t9*t10;
+ float t293 = d5*dq1*t4*t7*t8*t10;
+ float t298 = a4*dq1*t7*t8*t9*t10;
+ float t306 = q2+q5-t12;
+ float t307 = q2+q6-t12;
+ float t310 = t12-t14;
+ float t315 = a3i*dq4*mpy6*t4*t10*t11*-2.0;
+ float t319 = a3*dq4*mpy6*t9*t10*t11*-2.0;
+ float t335 = a3i*dq1*t2*t3*t5*t6*2.0;
+ float t336 = a3*dq1*t2*t5*t6*t8*2.0;
+ float t337 = a3*dq1*t3*t5*t6*t7*2.0;
+ float t338 = a3i*dq1*t5*t6*t7*t8*2.0;
+ float t344 = a2*dq2*mpy6*t3*t4*t10*t11*2.0;
+ float t345 = a2*dq3*mpy6*t3*t4*t10*t11*2.0;
+ float t346 = a2*dq4*mpy6*t3*t4*t10*t11*2.0;
+ float t347 = a2*dq5*mpy6*t3*t5*t9*t11*2.0;
+ float t348 = a2*dq5*mpy6*t4*t5*t8*t11*2.0;
+ float t349 = a2*dq6*mpy6*t3*t6*t9*t10*2.0;
+ float t350 = a2*dq6*mpy6*t4*t6*t8*t10*2.0;
+ float t360 = a2*dq2*mpy6*t8*t9*t10*t11*2.0;
+ float t361 = a2*dq3*mpy6*t8*t9*t10*t11*2.0;
+ float t362 = a2*dq4*mpy6*t8*t9*t10*t11*2.0;
+ float t364 = q6-t12+t20;
+ float t398 = d5*dq1*t2*t3*t4*t5*t6*2.0;
+ float t399 = a4*dq1*t2*t3*t5*t6*t9*2.0;
+ float t400 = a4*dq1*t2*t4*t5*t6*t8*2.0;
+ float t401 = a4*dq1*t3*t4*t5*t6*t7*2.0;
+ float t403 = d5*dq1*t2*t5*t6*t8*t9*2.0;
+ float t404 = d5*dq1*t3*t5*t6*t7*t9*2.0;
+ float t405 = d5*dq1*t4*t5*t6*t7*t8*2.0;
+ float t408 = a4*dq1*t5*t6*t7*t8*t9*2.0;
+ float t474 = a4*dq1*mpy6*t3*t4*t5*t6*t7*-2.0;
+ float t481 = d5*dq1*mpy6*t2*t5*t6*t8*t9*-2.0;
+ float t44 = cos(t32);
+ float t46 = sin(t31);
+ float t47 = sin(t32);
+ float t53 = cos(t45);
+ float t58 = cos(t55);
+ float t59 = cos(t56);
+ float t60 = -t49;
+ float t62 = q5+t55;
+ float t64 = t12+t37;
+ float t66 = q5+t56;
+ float t69 = sin(t55);
+ float t70 = sin(t56);
+ float t71 = sin(t57);
+ float t78 = mpy6*t49;
+ float t79 = mpy6*t50;
+ float t80 = mpy6*t51;
+ float t83 = t20+t39;
+ float t84 = a2*dq1*mpx4*t29;
+ float t85 = -t72;
+ float t86 = -t73;
+ float t87 = -t74;
+ float t88 = cos(t61);
+ float t90 = cos(t63);
+ float t93 = cos(t67);
+ float t94 = cos(t68);
+ float t95 = -t75;
+ float t96 = -t76;
+ float t97 = -t77;
+ float t99 = -t81;
+ float t100 = q5+t61;
+ float t101 = t31+t36;
+ float t102 = t14+t55;
+ float t104 = t31+t37;
+ float t105 = t12+t57;
+ float t106 = t31+t42;
+ float t107 = sin(t61);
+ float t109 = sin(t63);
+ float t111 = sin(t65);
+ float t113 = sin(t67);
+ float t114 = sin(t68);
+ float t115 = -t54;
+ float t144 = d5*mpy6*t52*2.0;
+ float t146 = mpy6*t134;
+ float t148 = mpy6*t135;
+ float t149 = mpy6*t11*t48*2.0;
+ float t150 = mpy6*t136;
+ float t167 = cos(t82);
+ float t170 = sin(t82);
+ float t172 = a2*a4*dq1*mass5*t29;
+ float t173 = a2*a4*dq1*mass6*t29;
+ float t174 = a2*d5*dq1*mass6*t33;
+ float t179 = -t116;
+ float t180 = -t117;
+ float t181 = -t118;
+ float t182 = -t119;
+ float t183 = -t120;
+ float t184 = -t121;
+ float t185 = -t122;
+ float t186 = -t123;
+ float t187 = -t124;
+ float t190 = -t125;
+ float t191 = -t126;
+ float t192 = -t127;
+ float t193 = -t128;
+ float t194 = -t129;
+ float t195 = -t130;
+ float t196 = -t133;
+ float t197 = -t135;
+ float t198 = -t136;
+ float t202 = cos(t103);
+ float t205 = t36+t45;
+ float t206 = t37+t45;
+ float t209 = sin(t103);
+ float t212 = -t142;
+ float t214 = -t147;
+ float t218 = -t151;
+ float t219 = -t152;
+ float t220 = -t154;
+ float t221 = -t156;
+ float t222 = -t158;
+ float t223 = -t159;
+ float t226 = -t160;
+ float t227 = -t166;
+ float t251 = a3i*mpy6*t4*t52*2.0;
+ float t259 = t10*t140;
+ float t262 = t10*t141;
+ float t264 = t10*t142;
+ float t268 = a3*mpy6*t9*t52*2.0;
+ float t269 = t10*t153;
+ float t271 = t10*t154;
+ float t272 = t10*t155;
+ float t274 = t10*t156;
+ float t275 = t10*t157;
+ float t277 = t10*t158;
+ float t280 = t10*t163;
+ float t282 = t10*t164;
+ float t283 = t10*t165;
+ float t295 = -t235;
+ float t296 = -t236;
+ float t297 = -t175;
+ float t299 = -t241;
+ float t300 = -t242;
+ float t301 = -t177;
+ float t304 = -t188;
+ float t308 = t55+t57;
+ float t309 = q6+t42+t55;
+ float t312 = -t260;
+ float t313 = -t265;
+ float t314 = -t267;
+ float t316 = -t278;
+ float t317 = -t279;
+ float t322 = cos(t306);
+ float t323 = cos(t307);
+ float t326 = cos(t310);
+ float t327 = q2-t310;
+ float t328 = t57+t61;
+ float t332 = sin(t306);
+ float t351 = mpy6*t11*t175*2.0;
+ float t352 = mpy6*t338;
+ float t356 = mpy6*t11*t176*2.0;
+ float t357 = mpy6*t11*t177*2.0;
+ float t363 = mpy6*t11*t188*2.0;
+ float t365 = q6-t12+t82;
+ float t366 = -t12+t364;
+ float t369 = -t335;
+ float t372 = -t337;
+ float t373 = -t290;
+ float t374 = -t338;
+ float t376 = -t291;
+ float t387 = mpy6*t335;
+ float t388 = mpy6*t336;
+ float t389 = mpy6*t337;
+ float t393 = -t344;
+ float t411 = t20-t310;
+ float t414 = t82-t310;
+ float t416 = sin(t364);
+ float t419 = mpy6*t11*t298*2.0;
+ float t434 = -t401;
+ float t445 = -t403;
+ float t449 = mpy6*t398;
+ float t450 = mpy6*t399;
+ float t451 = mpy6*t400;
+ float t452 = mpy6*t401;
+ float t454 = mpy6*t11*t287*2.0;
+ float t455 = mpy6*t403;
+ float t456 = mpy6*t404;
+ float t457 = mpy6*t405;
+ float t459 = mpy6*t11*t288*2.0;
+ float t460 = mpy6*t11*t289*2.0;
+ float t461 = mpy6*t11*t290*2.0;
+ float t462 = mpy6*t408;
+ float t463 = mpy6*t11*t291*2.0;
+ float t464 = mpy6*t11*t292*2.0;
+ float t465 = mpy6*t11*t293*2.0;
+ float t89 = cos(t62);
+ float t91 = cos(t64);
+ float t92 = cos(t66);
+ float t108 = sin(t62);
+ float t110 = sin(t64);
+ float t112 = sin(t66);
+ float t168 = cos(t83);
+ float t169 = q3+t64;
+ float t171 = sin(t83);
+ float t178 = a3i*t58;
+ float t189 = a3*t69;
+ float t199 = cos(t100);
+ float t200 = cos(t101);
+ float t201 = cos(t102);
+ float t203 = cos(t105);
+ float t204 = cos(t106);
+ float t207 = sin(t100);
+ float t208 = sin(t102);
+ float t210 = sin(t104);
+ float t211 = d5*t88;
+ float t213 = a4*t107;
+ float t216 = -t149;
+ float t224 = cos(t205);
+ float t225 = cos(t206);
+ float t228 = sin(t205);
+ float t248 = q3+t104;
+ float t285 = q3+t206;
+ float t294 = -t174;
+ float t303 = t12+t64;
+ float t320 = t31+t64;
+ float t324 = cos(t308);
+ float t325 = cos(t309);
+ float t329 = t42+t101;
+ float t330 = t57+t64;
+ float t331 = t42+t104;
+ float t333 = sin(t308);
+ float t334 = sin(t309);
+ float t339 = a1*dq1*mpy3*t58*2.0;
+ float t340 = a1*dq1*mpx3*t69*2.0;
+ float t342 = (a2*dq1*mpy6*t46)/2.0;
+ float t358 = a1*dq1*mpx4*t107*2.0;
+ float t359 = (a2*dq1*mpy6*t53)/4.0;
+ float t377 = t45+t64;
+ float t379 = cos(t327);
+ float t380 = cos(t328);
+ float t384 = sin(t327);
+ float t385 = sin(t328);
+ float t409 = cos(t365);
+ float t410 = cos(t366);
+ float t415 = -t12+t411;
+ float t417 = sin(t365);
+ float t418 = sin(t366);
+ float t420 = cos(t411);
+ float t423 = cos(t414);
+ float t425 = (a2*dq1*mpy6*t111)/2.0;
+ float t428 = sin(t414);
+ float t433 = t52+t115;
+ float t466 = -t419;
+ float t467 = t64+t105;
+ float t468 = t64+t106;
+ float t478 = a1*dq1*mpy6*t323;
+ float t480 = -t454;
+ float t482 = -t459;
+ float t483 = -t460;
+ float t484 = -t464;
+ float t485 = -t465;
+ float t519 = (a2*dq1*mpy6*t326)/4.0;
+ float t545 = (a2*dq1*mpy6*t416)/2.0;
+ float t247 = cos(t169);
+ float t249 = sin(t169);
+ float t284 = cos(t248);
+ float t286 = sin(t248);
+ float t302 = -t178;
+ float t305 = -t189;
+ float t311 = a2*dq1*mpx4*t91;
+ float t318 = cos(t303);
+ float t321 = sin(t303);
+ float t341 = cos(t285);
+ float t343 = sin(t285);
+ float t353 = a1*dq1*mass4*t189*2.0;
+ float t354 = a1*dq1*mass5*t189*2.0;
+ float t355 = a1*dq1*mass6*t189*2.0;
+ float t367 = a2*a4*dq1*mass5*t91;
+ float t368 = a2*a4*dq1*mass6*t91;
+ float t370 = a1*dq1*mpy6*t200;
+ float t371 = a2*d5*dq1*mass6*t110;
+ float t375 = cos(t320);
+ float t378 = sin(t320);
+ float t381 = cos(t329);
+ float t382 = cos(t330);
+ float t383 = cos(t331);
+ float t386 = sin(t329);
+ float t390 = a1*dq1*mass4*t178*2.0;
+ float t391 = a1*dq1*mass5*t178*2.0;
+ float t392 = a1*dq1*mass6*t178*2.0;
+ float t395 = cos(t377);
+ float t396 = -t358;
+ float t397 = sin(t377);
+ float t402 = a1*dq1*mass6*t211*2.0;
+ float t406 = a1*dq1*mass5*t213*2.0;
+ float t407 = a1*dq1*mass6*t213*2.0;
+ float t412 = t57+t169;
+ float t413 = t42+t248;
+ float t424 = cos(t415);
+ float t429 = sin(t415);
+ float t430 = a3*a3i*dq1*mass4*t168*2.0;
+ float t431 = a3*a3i*dq1*mass5*t168*2.0;
+ float t432 = a3*a3i*dq1*mass6*t168*2.0;
+ float t435 = dq1*mass4*t16*t171;
+ float t436 = dq1*mass5*t16*t171;
+ float t437 = dq1*mass6*t16*t171;
+ float t438 = dq1*mass4*t18*t171;
+ float t439 = dq1*mass5*t18*t171;
+ float t440 = dq1*mass6*t18*t171;
+ float t469 = (a2*dq1*mpy6*t203)/4.0;
+ float t470 = (a2*dq1*mpy6*t204)/4.0;
+ float t471 = (a2*dq1*mpy6*t210)/2.0;
+ float t488 = cos(t467);
+ float t489 = cos(t468);
+ float t492 = sin(t467);
+ float t493 = sin(t468);
+ float t495 = (a2*dq1*mpy6*t225)/4.0;
+ float t496 = (d5*dq2*mpy6*t224)/2.0;
+ float t497 = (d5*dq3*mpy6*t224)/2.0;
+ float t498 = (d5*dq4*mpy6*t224)/2.0;
+ float t499 = (a1*dq1*mpy6*t228)/2.0;
+ float t500 = (a4*dq2*mpy6*t228)/2.0;
+ float t501 = (a4*dq3*mpy6*t228)/2.0;
+ float t502 = (a4*dq4*mpy6*t228)/2.0;
+ float t506 = a3*dq1*mpy6*t409;
+ float t507 = a4*dq1*mpy6*t410;
+ float t509 = a3i*dq1*mpy6*t417;
+ float t510 = d5*dq1*mpy6*t418;
+ float t524 = (d5*dq2*mpy6*t379)/2.0;
+ float t525 = (d5*dq2*mpy6*t380)/2.0;
+ float t527 = (d5*dq3*mpy6*t379)/2.0;
+ float t528 = (d5*dq3*mpy6*t380)/2.0;
+ float t530 = (d5*dq4*mpy6*t379)/2.0;
+ float t531 = (d5*dq4*mpy6*t380)/2.0;
+ float t533 = (a1*dq1*mpy6*t384)/2.0;
+ float t534 = (a1*dq1*mpy6*t385)/2.0;
+ float t536 = (a4*dq2*mpy6*t384)/2.0;
+ float t537 = (a4*dq2*mpy6*t385)/2.0;
+ float t539 = (a4*dq3*mpy6*t384)/2.0;
+ float t540 = (a4*dq3*mpy6*t385)/2.0;
+ float t542 = (a4*dq4*mpy6*t384)/2.0;
+ float t543 = (a4*dq4*mpy6*t385)/2.0;
+ float t551 = (a2*dq1*mpy6*t420)/4.0;
+ float t554 = (a3i*dq1*mpy6*t423)/2.0;
+ float t559 = (a3*dq1*mpy6*t428)/2.0;
+ float t394 = -t311;
+ float t421 = cos(t412);
+ float t422 = cos(t413);
+ float t426 = sin(t412);
+ float t427 = sin(t413);
+ float t441 = a3i*dq1*mpx4*t247*2.0;
+ float t442 = -t367;
+ float t443 = -t368;
+ float t444 = -t402;
+ float t446 = a3*dq1*mpx4*t249*2.0;
+ float t447 = -t406;
+ float t448 = -t407;
+ float t453 = a3*dq1*mpy6*t284;
+ float t458 = a3i*dq1*mpy6*t286;
+ float t472 = a4*a3i*dq1*mass5*t247*2.0;
+ float t473 = a4*a3i*dq1*mass6*t247*2.0;
+ float t475 = a3*d5*dq1*mass6*t247*2.0;
+ float t476 = a3*a4*dq1*mass5*t249*2.0;
+ float t477 = a3*a4*dq1*mass6*t249*2.0;
+ float t479 = a3i*d5*dq1*mass6*t249*2.0;
+ float t486 = a4*dq1*mpy6*t375;
+ float t487 = d5*dq1*mpy6*t378;
+ float t490 = -t469;
+ float t491 = -t470;
+ float t494 = -t471;
+ float t503 = a4*d5*dq1*mass6*t318*2.0;
+ float t504 = dq1*mass5*t17*t321;
+ float t505 = dq1*mass6*t17*t321;
+ float t508 = dq1*mass6*t19*t321;
+ float t511 = -t495;
+ float t512 = -t496;
+ float t513 = -t499;
+ float t514 = -t500;
+ float t516 = (a3i*dq1*mpy6*t341)/2.0;
+ float t518 = (a3*dq1*mpy6*t343)/2.0;
+ float t522 = (a2*dq1*mpy6*t382)/4.0;
+ float t523 = (a2*dq1*mpy6*t383)/4.0;
+ float t526 = (d5*dq2*mpy6*t381)/2.0;
+ float t529 = (d5*dq3*mpy6*t381)/2.0;
+ float t532 = (d5*dq4*mpy6*t381)/2.0;
+ float t535 = (a1*dq1*mpy6*t386)/2.0;
+ float t538 = (a4*dq2*mpy6*t386)/2.0;
+ float t541 = (a4*dq3*mpy6*t386)/2.0;
+ float t544 = (a4*dq4*mpy6*t386)/2.0;
+ float t547 = -t536;
+ float t549 = (d5*dq1*mpy6*t395)/2.0;
+ float t550 = (a4*dq1*mpy6*t397)/2.0;
+ float t556 = (d5*dq1*mpy6*t424)/2.0;
+ float t561 = (a4*dq1*mpy6*t429)/2.0;
+ float t562 = -t551;
+ float t564 = (d5*dq1*mpy6*t488)/2.0;
+ float t565 = (d5*dq1*mpy6*t489)/2.0;
+ float t566 = (a4*dq1*mpy6*t492)/2.0;
+ float t567 = (a4*dq1*mpy6*t493)/2.0;
+ float t515 = -t503;
+ float t517 = -t487;
+ float t520 = -t504;
+ float t521 = -t505;
+ float t546 = -t526;
+ float t548 = -t538;
+ float t552 = (a3i*dq1*mpy6*t421)/2.0;
+ float t553 = (a3i*dq1*mpy6*t422)/2.0;
+ float t555 = -t549;
+ float t557 = (a3*dq1*mpy6*t426)/2.0;
+ float t558 = (a3*dq1*mpy6*t427)/2.0;
+ float t560 = -t550;
+ float t563 = -t556;
+ A0(0,0) = a1*dq2*mass4*t178*-2.0-a1*dq2*mass5*t178*2.0+a1*dq3*mass4*t178*2.0-a1*dq2*mass6*t178*2.0+a1*dq3*mass5*t178*2.0+a1*dq3*mass6*t178*2.0-a1*dq2*mass4*t189*2.0-a1*dq2*mass5*t189*2.0+a1*dq3*mass4*t189*2.0-a1*dq2*mass6*t189*2.0+a1*dq3*mass5*t189*2.0+a1*dq3*mass6*t189*2.0+a1*dq2*mass6*t211*2.0+a1*dq2*mass5*t213*2.0-a1*dq3*mass6*t211*2.0+a1*dq2*mass6*t213*2.0-a1*dq3*mass5*t213*2.0-a1*dq4*mass6*t211*2.0-a1*dq3*mass6*t213*2.0-a1*dq4*mass5*t213*2.0-a1*dq4*mass6*t213*2.0+a1*dq2*mpx2*t2*2.0+a2*dq3*mpx3*t3-a3*dq4*mpx4*t9+a2*dq3*mpx4*t29+a2*dq4*mpx4*t29-a1*dq2*mpx3*t69*2.0+a1*dq3*mpx3*t69*2.0+a2*dq2*mpx4*t91*2.0-a2*dq3*mpx4*t91-a2*dq4*mpx4*t91+a1*dq2*mpx4*t107*2.0-a1*dq3*mpx4*t107*2.0-a1*dq4*mpx4*t107*2.0+a2*dq2*mpx3*t167*2.0-a2*dq3*mpx3*t167+a3*dq2*mpx4*t249*2.0-a3*dq3*mpx4*t249*2.0-a3*dq4*mpx4*t249+a1*dq2*mpy2*t7*2.0-a2*dq3*mpy3*t8+(a3*dq4*mpy6*t30)/2.0+(a3*dq6*mpy6*t30)/2.0-(a4*dq5*mpy6*t35)/2.0-(a4*dq6*mpy6*t35)/2.0+(a2*dq3*mpy6*t46)/2.0+(a2*dq4*mpy6*t46)/2.0+(a2*dq6*mpy6*t46)/2.0-(a3*dq4*mpy6*t47)/4.0-(a3*dq5*mpy6*t47)/4.0-(a3*dq6*mpy6*t47)/4.0+a1*dq2*mpy3*t58*2.0+(a2*dq3*mpy6*t53)/4.0-a1*dq3*mpy3*t58*2.0+(a2*dq4*mpy6*t53)/4.0+(a2*dq5*mpy6*t53)/4.0+(a2*dq6*mpy6*t53)/4.0+(a3*dq4*mpy6*t59)/2.0-(a3*dq6*mpy6*t59)/2.0+(a4*dq5*mpy6*t71)/2.0-(a4*dq6*mpy6*t71)/2.0+(a2*dq3*mpy6*t111)/2.0+(a2*dq4*mpy6*t111)/2.0-(a2*dq6*mpy6*t111)/2.0+(a3*dq4*mpy6*t112)/4.0+(a3*dq4*mpy6*t113)/4.0+(a3*dq5*mpy6*t112)/4.0+(a3*dq4*mpy6*t114)/4.0-(a3*dq5*mpy6*t113)/4.0-(a3*dq6*mpy6*t112)/4.0-(a3*dq5*mpy6*t114)/4.0+(a3*dq6*mpy6*t113)/4.0-(a3*dq6*mpy6*t114)/4.0+a2*dq2*mpy3*t170*2.0-a2*dq3*mpy3*t170-a1*dq2*mpy6*t200+a1*dq3*mpy6*t200+a1*dq4*mpy6*t200+a1*dq6*mpy6*t200-(a2*dq3*mpy6*t203)/4.0-(a2*dq3*mpy6*t204)/4.0-(a2*dq4*mpy6*t203)/4.0-(a2*dq4*mpy6*t204)/4.0-(a2*dq5*mpy6*t203)/4.0+(a2*dq5*mpy6*t204)/4.0+(a2*dq6*mpy6*t203)/4.0-(a2*dq6*mpy6*t204)/4.0+a2*dq2*mpy6*t210-(a2*dq3*mpy6*t210)/2.0-(a2*dq4*mpy6*t210)/2.0-(a2*dq6*mpy6*t210)/2.0+(a2*dq2*mpy6*t225)/2.0-(a2*dq3*mpy6*t225)/4.0+(a1*dq2*mpy6*t228)/2.0-(a2*dq4*mpy6*t225)/4.0-(a1*dq3*mpy6*t228)/2.0-(a2*dq5*mpy6*t225)/4.0-(a1*dq4*mpy6*t228)/2.0-(a2*dq6*mpy6*t225)/4.0-(a1*dq5*mpy6*t228)/2.0-(a1*dq6*mpy6*t228)/2.0-a3*dq2*mpy6*t284+a3*dq3*mpy6*t284+(a3*dq4*mpy6*t284)/2.0+(a3*dq6*mpy6*t284)/2.0-a1*dq2*mpy6*t323+a1*dq3*mpy6*t323+a1*dq4*mpy6*t323-a1*dq6*mpy6*t323+(a2*dq3*mpy6*t326)/4.0+(a2*dq4*mpy6*t326)/4.0-(a2*dq5*mpy6*t326)/4.0-(a2*dq6*mpy6*t326)/4.0+(a3*dq2*mpy6*t343)/2.0-(a3*dq3*mpy6*t343)/2.0-(a3*dq4*mpy6*t343)/4.0-(a3*dq5*mpy6*t343)/4.0-(a3*dq6*mpy6*t343)/4.0-a4*dq2*mpy6*t375+a4*dq3*mpy6*t375+a4*dq4*mpy6*t375+(a4*dq6*mpy6*t375)/2.0-(a2*dq2*mpy6*t382)/2.0-(a1*dq2*mpy6*t384)/2.0-(a2*dq2*mpy6*t383)/2.0+(a2*dq3*mpy6*t382)/4.0-(a1*dq2*mpy6*t385)/2.0+(a1*dq3*mpy6*t384)/2.0+(a2*dq3*mpy6*t383)/4.0+(a2*dq4*mpy6*t382)/4.0-(a1*dq2*mpy6*t386)/2.0+(a1*dq3*mpy6*t385)/2.0+(a1*dq4*mpy6*t384)/2.0+(a2*dq4*mpy6*t383)/4.0+(a2*dq5*mpy6*t382)/4.0+(a1*dq3*mpy6*t386)/2.0+(a1*dq4*mpy6*t385)/2.0-(a1*dq5*mpy6*t384)/2.0-(a2*dq5*mpy6*t383)/4.0-(a2*dq6*mpy6*t382)/4.0+(a1*dq4*mpy6*t386)/2.0+(a1*dq5*mpy6*t385)/2.0-(a1*dq6*mpy6*t384)/2.0+(a2*dq6*mpy6*t383)/4.0-(a1*dq5*mpy6*t386)/2.0-(a1*dq6*mpy6*t385)/2.0+(a1*dq6*mpy6*t386)/2.0+(a4*dq2*mpy6*t397)/2.0-(a4*dq3*mpy6*t397)/2.0-(a4*dq4*mpy6*t397)/2.0-(a4*dq5*mpy6*t397)/4.0-(a4*dq6*mpy6*t397)/4.0-a3*dq2*mpy6*t409+a3*dq3*mpy6*t409+(a3*dq4*mpy6*t409)/2.0-a4*dq2*mpy6*t410+a4*dq3*mpy6*t410-(a3*dq6*mpy6*t409)/2.0+a4*dq4*mpy6*t410-a2*dq2*mpy6*t416-(a4*dq6*mpy6*t410)/2.0+(a2*dq3*mpy6*t416)/2.0+(a2*dq4*mpy6*t416)/2.0+(a2*dq2*mpy6*t420)/2.0-(a2*dq6*mpy6*t416)/2.0-(a2*dq3*mpy6*t420)/4.0-(a2*dq4*mpy6*t420)/4.0+(a2*dq5*mpy6*t420)/4.0+(a2*dq6*mpy6*t420)/4.0-(a3*dq2*mpy6*t426)/2.0-(a3*dq2*mpy6*t427)/2.0+(a3*dq3*mpy6*t426)/2.0-(a3*dq2*mpy6*t428)/2.0+(a3*dq3*mpy6*t427)/2.0+(a3*dq4*mpy6*t426)/4.0+(a3*dq3*mpy6*t428)/2.0+(a3*dq4*mpy6*t427)/4.0+(a3*dq5*mpy6*t426)/4.0+(a3*dq4*mpy6*t428)/4.0-(a3*dq5*mpy6*t427)/4.0-(a3*dq6*mpy6*t426)/4.0-(a4*dq2*mpy6*t429)/2.0-(a3*dq5*mpy6*t428)/4.0+(a3*dq6*mpy6*t427)/4.0+(a4*dq3*mpy6*t429)/2.0-(a3*dq6*mpy6*t428)/4.0+(a4*dq4*mpy6*t429)/2.0-(a4*dq5*mpy6*t429)/4.0-(a4*dq6*mpy6*t429)/4.0-(a4*dq2*mpy6*t492)/2.0-(a4*dq2*mpy6*t493)/2.0+(a4*dq3*mpy6*t492)/2.0+(a4*dq3*mpy6*t493)/2.0+(a4*dq4*mpy6*t492)/2.0+(a4*dq4*mpy6*t493)/2.0+(a4*dq5*mpy6*t492)/4.0-(a4*dq5*mpy6*t493)/4.0-(a4*dq6*mpy6*t492)/4.0+(a4*dq6*mpy6*t493)/4.0-a3i*dq4*mpx4*t4-a3i*dq2*mpx4*t247*2.0+a3i*dq3*mpx4*t247*2.0+a3i*dq4*mpx4*t247-(a3i*dq4*mpy6*t34)/2.0-(a3i*dq6*mpy6*t34)/2.0-(a3i*dq4*mpy6*t44)/4.0-(a3i*dq5*mpy6*t44)/4.0-(a3i*dq6*mpy6*t44)/4.0-(a3i*dq4*mpy6*t70)/2.0+(a3i*dq6*mpy6*t70)/2.0+(a3i*dq4*mpy6*t92)/4.0+(a3i*dq4*mpy6*t93)/4.0+(a3i*dq5*mpy6*t92)/4.0-(a3i*dq4*mpy6*t94)/4.0-(a3i*dq5*mpy6*t93)/4.0-(a3i*dq6*mpy6*t92)/4.0+(a3i*dq5*mpy6*t94)/4.0+(a3i*dq6*mpy6*t93)/4.0+(a3i*dq6*mpy6*t94)/4.0-a3i*dq2*mpy6*t286+a3i*dq3*mpy6*t286+(a3i*dq4*mpy6*t286)/2.0+(a3i*dq6*mpy6*t286)/2.0-(a3i*dq2*mpy6*t341)/2.0+(a3i*dq3*mpy6*t341)/2.0+(a3i*dq4*mpy6*t341)/4.0+(a3i*dq5*mpy6*t341)/4.0+(a3i*dq6*mpy6*t341)/4.0+a3i*dq2*mpy6*t417-a3i*dq3*mpy6*t417-(a3i*dq4*mpy6*t417)/2.0+(a3i*dq2*mpy6*t421)/2.0+(a3i*dq6*mpy6*t417)/2.0+(a3i*dq2*mpy6*t422)/2.0-(a3i*dq3*mpy6*t421)/2.0-(a3i*dq2*mpy6*t423)/2.0-(a3i*dq3*mpy6*t422)/2.0-(a3i*dq4*mpy6*t421)/4.0+(a3i*dq3*mpy6*t423)/2.0-(a3i*dq4*mpy6*t422)/4.0-(a3i*dq5*mpy6*t421)/4.0+(a3i*dq4*mpy6*t423)/4.0+(a3i*dq5*mpy6*t422)/4.0+(a3i*dq6*mpy6*t421)/4.0-(a3i*dq5*mpy6*t423)/4.0-(a3i*dq6*mpy6*t422)/4.0-(a3i*dq6*mpy6*t423)/4.0+d5*dq6*mpy6*t11+d5*dq2*mpy6*t378-d5*dq3*mpy6*t378-d5*dq4*mpy6*t378-(d5*dq6*mpy6*t378)/2.0+(d5*dq2*mpy6*t395)/2.0-(d5*dq3*mpy6*t395)/2.0-(d5*dq4*mpy6*t395)/2.0-(d5*dq5*mpy6*t395)/4.0-(d5*dq6*mpy6*t395)/4.0-d5*dq2*mpy6*t418+d5*dq3*mpy6*t418+d5*dq4*mpy6*t418-(d5*dq6*mpy6*t418)/2.0+(d5*dq2*mpy6*t424)/2.0-(d5*dq3*mpy6*t424)/2.0-(d5*dq4*mpy6*t424)/2.0+(d5*dq5*mpy6*t424)/4.0+(d5*dq6*mpy6*t424)/4.0-(d5*dq2*mpy6*t488)/2.0-(d5*dq2*mpy6*t489)/2.0+(d5*dq3*mpy6*t488)/2.0+(d5*dq3*mpy6*t489)/2.0+(d5*dq4*mpy6*t488)/2.0+(d5*dq4*mpy6*t489)/2.0+(d5*dq5*mpy6*t488)/4.0-(d5*dq5*mpy6*t489)/4.0-(d5*dq6*mpy6*t488)/4.0+(d5*dq6*mpy6*t489)/4.0+dq2*mass3*t15*t26+dq2*mass4*t15*t26+dq2*mass5*t15*t26+dq2*mass6*t15*t26-dq2*mass4*t16*t171-dq2*mass5*t16*t171+dq3*mass4*t16*t171+dq2*mass4*t18*t171-dq2*mass6*t16*t171+dq3*mass5*t16*t171+dq2*mass5*t18*t171-dq3*mass4*t18*t171+dq3*mass6*t16*t171+dq2*mass6*t18*t171-dq3*mass5*t18*t171-dq3*mass6*t18*t171+dq2*mass5*t17*t321+dq2*mass6*t17*t321-dq3*mass5*t17*t321-dq3*mass6*t17*t321-dq4*mass5*t17*t321-dq2*mass6*t19*t321-dq4*mass6*t17*t321+dq3*mass6*t19*t321+dq4*mass6*t19*t321+a1*a2*dq2*mass3*t2*2.0+a1*a2*dq2*mass4*t2*2.0+a1*a2*dq2*mass5*t2*2.0+a1*a2*dq2*mass6*t2*2.0+a2*a3*dq3*mass4*t3+a2*a3*dq3*mass5*t3+a2*a3*dq3*mass6*t3-a3*a4*dq4*mass5*t9-a3*a4*dq4*mass6*t9+a2*a4*dq3*mass5*t29+a2*a4*dq3*mass6*t29+a2*a4*dq4*mass5*t29+a2*a4*dq4*mass6*t29+a2*a4*dq2*mass5*t91*2.0+a2*a4*dq2*mass6*t91*2.0-a2*a4*dq3*mass5*t91-a2*a4*dq3*mass6*t91-a2*a4*dq4*mass5*t91-a2*a4*dq4*mass6*t91+a2*a3*dq2*mass4*t167*2.0+a2*a3*dq2*mass5*t167*2.0-a2*a3*dq3*mass4*t167+a2*a3*dq2*mass6*t167*2.0-a2*a3*dq3*mass5*t167-a2*a3*dq3*mass6*t167+a3*a4*dq2*mass5*t249*2.0+a3*a4*dq2*mass6*t249*2.0-a3*a4*dq3*mass5*t249*2.0-a3*a4*dq3*mass6*t249*2.0-a3*a4*dq4*mass5*t249-a3*a4*dq4*mass6*t249+a2*a3i*dq3*mass4*t8-a4*a3i*dq4*mass5*t4+a2*a3i*dq3*mass5*t8-a4*a3i*dq4*mass6*t4+a2*a3i*dq3*mass6*t8-a3*a3i*dq2*mass4*t168*2.0-a2*a3i*dq2*mass4*t170*2.0-a3*a3i*dq2*mass5*t168*2.0+a3*a3i*dq3*mass4*t168*2.0-a2*a3i*dq2*mass5*t170*2.0+a2*a3i*dq3*mass4*t170-a3*a3i*dq2*mass6*t168*2.0+a3*a3i*dq3*mass5*t168*2.0-a2*a3i*dq2*mass6*t170*2.0+a2*a3i*dq3*mass5*t170+a3*a3i*dq3*mass6*t168*2.0+a2*a3i*dq3*mass6*t170-a4*a3i*dq2*mass5*t247*2.0-a4*a3i*dq2*mass6*t247*2.0+a4*a3i*dq3*mass5*t247*2.0+a4*a3i*dq3*mass6*t247*2.0+a4*a3i*dq4*mass5*t247+a4*a3i*dq4*mass6*t247-a3*d5*dq4*mass6*t4-a2*d5*dq3*mass6*t33-a2*d5*dq4*mass6*t33-a2*d5*dq2*mass6*t110*2.0+a2*d5*dq3*mass6*t110+a2*d5*dq4*mass6*t110+a3*d5*dq2*mass6*t247*2.0-a3*d5*dq3*mass6*t247*2.0-a3*d5*dq4*mass6*t247+a4*d5*dq2*mass6*t318*2.0-a4*d5*dq3*mass6*t318*2.0-a4*d5*dq4*mass6*t318*2.0+a3i*d5*dq4*mass6*t9+a3i*d5*dq2*mass6*t249*2.0-a3i*d5*dq3*mass6*t249*2.0-a3i*d5*dq4*mass6*t249;
+ A0(0,1) = t311*2.0+t339-t340-t353-t354-t355+t358+t367*2.0+t368*2.0-t370-t371*2.0-t390-t391-t392+t402+t406+t407-t430-t431-t432-t435-t436-t437+t438+t439+t440-t441+t446-t453-t458-t472-t473+t475+t476+t477-t478+t479-t486+t487-t497-t498+t499-t501-t502+t503+t504+t505-t506-t507-t508+t509-t510-t516+t518+t527+t528-t529+t530+t531-t532-t533-t534-t535-t539+t540-t541-t542+t543-t544+t549+t550+t552+t553-t554+t556-t557-t558-t559-t561-t564-t565-t566-t567+a1*dq1*mpx2*t2*2.0+a2*dq1*mpx3*t167*2.0+a1*dq1*mpy2*t7*2.0+a2*dq1*mpy3*t170*2.0+a2*dq1*mpy6*t210-(a3*dq3*mpy6*t208)/2.0-(a3*dq3*mpy6*t209)/2.0+(a2*dq1*mpy6*t225)/2.0+(a3*dq3*mpy6*t333)/2.0-(a3*dq3*mpy6*t334)/2.0-(a2*dq1*mpy6*t382)/2.0-(a2*dq1*mpy6*t383)/2.0-a2*dq1*mpy6*t416+(a2*dq1*mpy6*t420)/2.0-(a3i*dq3*mpy6*t201)/2.0+(a3i*dq3*mpy6*t202)/2.0+(a3i*dq3*mpy6*t324)/2.0-(a3i*dq3*mpy6*t325)/2.0+dq1*mass3*t15*t26+dq1*mass4*t15*t26+dq1*mass5*t15*t26+dq1*mass6*t15*t26+a1*a2*dq1*mass3*t2*2.0+a1*a2*dq1*mass4*t2*2.0+a1*a2*dq1*mass5*t2*2.0+a1*a2*dq1*mass6*t2*2.0+a2*a3*dq1*mass4*t167*2.0+a2*a3*dq1*mass5*t167*2.0+a2*a3*dq1*mass6*t167*2.0-a2*a3i*dq1*mass4*t170*2.0-a2*a3i*dq1*mass5*t170*2.0-a2*a3i*dq1*mass6*t170*2.0;
+ A0(0,2) = t84+t172+t173+t294-t339+t340+t342+t353+t354+t355+t359+t370+t371+t390+t391+t392+t394+t396+t425+t430+t431+t432+t435+t436+t437-t438-t439-t440+t441+t442+t443+t444-t446+t447+t448+t453+t458+t472+t473-t475-t476-t477+t478-t479+t486+t490+t491+t494+t498+t502+t506+t507+t508-t509+t510+t511+t512+t513+t514+t515+t516+t517-t518+t519+t520+t521+t522+t523+t524+t525-t530-t531+t532+t533+t534+t535+t537+t542-t543+t544+t545+t546+t547+t548-t552-t553+t554+t555+t557+t558+t559+t560+t561+t562+t563+t564+t565+t566+t567+a2*dq1*mpx3*t3-a2*dq1*mpx3*t167-a2*dq1*mpy3*t8-a2*dq1*mpy3*t170-(a3*dq2*mpy6*t208)/2.0-(a3*dq2*mpy6*t209)/2.0+(a3*dq2*mpy6*t333)/2.0-(a3*dq2*mpy6*t334)/2.0-(a3i*dq2*mpy6*t201)/2.0+(a3i*dq2*mpy6*t202)/2.0+(a3i*dq2*mpy6*t324)/2.0-(a3i*dq2*mpy6*t325)/2.0+a2*a3*dq1*mass4*t3+a2*a3*dq1*mass5*t3+a2*a3*dq1*mass6*t3-a2*a3*dq1*mass4*t167-a2*a3*dq1*mass5*t167-a2*a3*dq1*mass6*t167+a2*a3i*dq1*mass4*t8+a2*a3i*dq1*mass5*t8+a2*a3i*dq1*mass6*t8+a2*a3i*dq1*mass4*t170+a2*a3i*dq1*mass5*t170+a2*a3i*dq1*mass6*t170;
+ A0(0,3) = t84+t172+t173+t294+t342+t359+t370+t371+t394+t396+t425+t442+t443+t444+t447+t448+t453/2.0+t458/2.0+t478+t486+t490+t491+t494+t497+t501+t506/2.0+t507+t508-t509/2.0+t510+t511+t512+t513+t514+t515+t517+t519+t520+t521+t522+t523+t524+t525-t527-t528+t529+t533+t534+t535+t537+t539-t540+t541+t545+t546+t547+t548+t555+t560+t561+t562+t563+t564+t565+t566+t567-a3*dq1*mpx4*t9-a3*dq1*mpx4*t249+(a3*dq1*mpy6*t30)/2.0-(a3*dq1*mpy6*t47)/4.0+(a3*dq1*mpy6*t59)/2.0+(a3*dq1*mpy6*t112)/4.0+(a3*dq1*mpy6*t113)/4.0+(a3*dq1*mpy6*t114)/4.0-(a3*dq1*mpy6*t343)/4.0+(a3*dq1*mpy6*t426)/4.0+(a3*dq1*mpy6*t427)/4.0+(a3*dq1*mpy6*t428)/4.0-a3i*dq1*mpx4*t4+a3i*dq1*mpx4*t247-(a3i*dq1*mpy6*t34)/2.0-(a3i*dq1*mpy6*t44)/4.0-(a3i*dq1*mpy6*t70)/2.0+(a3i*dq1*mpy6*t92)/4.0+(a3i*dq1*mpy6*t93)/4.0-(a3i*dq1*mpy6*t94)/4.0+(a3i*dq1*mpy6*t341)/4.0-(a3i*dq1*mpy6*t421)/4.0-(a3i*dq1*mpy6*t422)/4.0+(a3i*dq1*mpy6*t423)/4.0-a3*a4*dq1*mass5*t9-a3*a4*dq1*mass6*t9-a3*a4*dq1*mass5*t249-a3*a4*dq1*mass6*t249-a4*a3i*dq1*mass5*t4-a4*a3i*dq1*mass6*t4+a4*a3i*dq1*mass5*t247+a4*a3i*dq1*mass6*t247-a3*d5*dq1*mass6*t4-a3*d5*dq1*mass6*t247+a3i*d5*dq1*mass6*t9-a3i*d5*dq1*mass6*t249;
+ A0(0,4) = t2*t8*t9*t152-a4*dq1*mpy6*t5*t11-a1*dq6*mpy6*t6*t10*2.0-a3*dq1*mpy6*t4*t5*t11-a2*dq6*mpy6*t6*t7*t10*2.0+a3i*dq1*mpy6*t5*t9*t11-a3*dq6*mpy6*t2*t3*t6*t10*2.0-a2*dq1*mpy6*t3*t5*t9*t11-a2*dq1*mpy6*t4*t5*t8*t11-a3*dq6*mpy6*t6*t7*t8*t10*2.0-a3i*dq6*mpy6*t2*t6*t8*t10*2.0+a3i*dq6*mpy6*t3*t6*t7*t10*2.0-a1*dq1*mpy6*t2*t3*t4*t5*t11*2.0-a4*dq6*mpy6*t2*t3*t4*t6*t10*2.0+a1*dq1*mpy6*t2*t5*t8*t9*t11*2.0-a1*dq1*mpy6*t3*t5*t7*t9*t11*2.0-a1*dq1*mpy6*t4*t5*t7*t8*t11*2.0-a4*dq6*mpy6*t3*t6*t7*t9*t10*2.0-a4*dq6*mpy6*t4*t6*t7*t8*t10*2.0-a2*dq1*mpy6*t3*t4*t5*t11*t26+a2*dq1*mpy6*t3*t5*t9*t11*t23+a2*dq1*mpy6*t4*t5*t8*t11*t23+a2*dq1*mpy6*t5*t8*t9*t11*t26-a3*dq1*mpy6*t4*t5*t11*t23*t24-a3*dq1*mpy6*t4*t5*t11*t26*t27+a3*dq1*mpy6*t5*t9*t11*t23*t27-a3*dq1*mpy6*t5*t9*t11*t24*t26-a4*dq1*mpy6*t5*t11*t23*t24*t25+a4*dq1*mpy6*t5*t11*t23*t27*t28-a4*dq1*mpy6*t5*t11*t24*t26*t28-a4*dq1*mpy6*t5*t11*t25*t26*t27-a3i*dq1*mpy6*t4*t5*t11*t23*t27+a3i*dq1*mpy6*t4*t5*t11*t24*t26-a3i*dq1*mpy6*t5*t9*t11*t23*t24-a3i*dq1*mpy6*t5*t9*t11*t26*t27+d5*dq6*mpy6*t2*t3*t6*t9*t10*2.0+d5*dq6*mpy6*t2*t4*t6*t8*t10*2.0-d5*dq6*mpy6*t3*t4*t6*t7*t10*2.0+d5*dq6*mpy6*t6*t7*t8*t9*t10*2.0+d5*dq1*mpy6*t5*t11*t23*t24*t28+d5*dq1*mpy6*t5*t11*t23*t25*t27-d5*dq1*mpy6*t5*t11*t24*t25*t26+d5*dq1*mpy6*t5*t11*t26*t27*t28;
+ A0(0,5) = d5*dq1*mpy6*t11-a4*dq1*mpy6*t6*t10-a1*dq5*mpy6*t6*t10*2.0-a3*dq1*mpy6*t9*t11-a3i*dq1*mpy6*t4*t11+a2*dq1*mpy6*t3*t4*t11-a3*dq1*mpy6*t4*t6*t10-a2*dq5*mpy6*t6*t7*t10*2.0-a2*dq1*mpy6*t8*t9*t11+a3i*dq1*mpy6*t6*t9*t10-a1*dq1*mpy6*t2*t3*t9*t11*2.0-a1*dq1*mpy6*t2*t4*t8*t11*2.0+a1*dq1*mpy6*t3*t4*t7*t11*2.0-a3*dq5*mpy6*t2*t3*t6*t10*2.0-a2*dq1*mpy6*t3*t6*t9*t10-a2*dq1*mpy6*t4*t6*t8*t10-a1*dq1*mpy6*t7*t8*t9*t11*2.0-a3*dq5*mpy6*t6*t7*t8*t10*2.0-a2*dq1*mpy6*t3*t4*t11*t23-a2*dq1*mpy6*t3*t9*t11*t26-a2*dq1*mpy6*t4*t8*t11*t26+a2*dq1*mpy6*t8*t9*t11*t23-a3*dq1*mpy6*t4*t11*t23*t27+a3*dq1*mpy6*t4*t11*t24*t26-a3*dq1*mpy6*t9*t11*t23*t24-a3*dq1*mpy6*t9*t11*t26*t27-a4*dq1*mpy6*t11*t23*t24*t28-a4*dq1*mpy6*t11*t23*t25*t27+a4*dq1*mpy6*t11*t24*t25*t26-a4*dq1*mpy6*t11*t26*t27*t28-a3i*dq5*mpy6*t2*t6*t8*t10*2.0+a3i*dq5*mpy6*t3*t6*t7*t10*2.0+a3i*dq1*mpy6*t4*t11*t23*t24+a3i*dq1*mpy6*t4*t11*t26*t27-a3i*dq1*mpy6*t9*t11*t23*t27+a3i*dq1*mpy6*t9*t11*t24*t26-d5*dq1*mpy6*t11*t23*t24*t25+d5*dq1*mpy6*t11*t23*t27*t28-d5*dq1*mpy6*t11*t24*t26*t28-d5*dq1*mpy6*t11*t25*t26*t27-a1*dq1*mpy6*t2*t3*t4*t6*t10*2.0-a4*dq5*mpy6*t2*t3*t4*t6*t10*2.0+a1*dq1*mpy6*t2*t6*t8*t9*t10*2.0-a1*dq1*mpy6*t3*t6*t7*t9*t10*2.0-a1*dq1*mpy6*t4*t6*t7*t8*t10*2.0+a4*dq5*mpy6*t2*t6*t8*t9*t10*2.0-a4*dq5*mpy6*t3*t6*t7*t9*t10*2.0-a4*dq5*mpy6*t4*t6*t7*t8*t10*2.0-a2*dq1*mpy6*t3*t4*t6*t10*t26+a2*dq1*mpy6*t3*t6*t9*t10*t23+a2*dq1*mpy6*t4*t6*t8*t10*t23+a2*dq1*mpy6*t6*t8*t9*t10*t26-a3*dq1*mpy6*t4*t6*t10*t23*t24-a3*dq1*mpy6*t4*t6*t10*t26*t27+a3*dq1*mpy6*t6*t9*t10*t23*t27-a3*dq1*mpy6*t6*t9*t10*t24*t26-a4*dq1*mpy6*t6*t10*t23*t24*t25+a4*dq1*mpy6*t6*t10*t23*t27*t28-a4*dq1*mpy6*t6*t10*t24*t26*t28-a4*dq1*mpy6*t6*t10*t25*t26*t27-a3i*dq1*mpy6*t4*t6*t10*t23*t27+a3i*dq1*mpy6*t4*t6*t10*t24*t26-a3i*dq1*mpy6*t6*t9*t10*t23*t24-a3i*dq1*mpy6*t6*t9*t10*t26*t27+d5*dq5*mpy6*t2*t3*t6*t9*t10*2.0+d5*dq5*mpy6*t2*t4*t6*t8*t10*2.0-d5*dq5*mpy6*t3*t4*t6*t7*t10*2.0+d5*dq5*mpy6*t6*t7*t8*t9*t10*2.0+d5*dq1*mpy6*t6*t10*t23*t24*t28+d5*dq1*mpy6*t6*t10*t23*t25*t27-d5*dq1*mpy6*t6*t10*t24*t25*t26+d5*dq1*mpy6*t6*t10*t26*t27*t28;
+ A0(1,0) = mpy6*t433*(t211+t213+t302+t305+a2*t2)*-2.0;
+ A0(1,1) = t81+t87+t97+t133+t138+t139+t142-t161-t162+t183+t184+t187+t194+t195+t218+t219+t222+t223+t227+t231+t232+t233+t234-t237-t238-t239-t240-t243-t244-t245-t246+t254+t255+t256+t257+t260+t275+t278+t279-t281+t283+t313+t314-t345-t346-t347-t348-t349-t350+t361+t362+a2*dq3*mpx3*t3*2.0-a2*dq3*mpy3*t8*2.0+a2*a3*dq3*mass4*t3*2.0+a2*a3*dq3*mass5*t3*2.0+a2*a3*dq3*mass6*t3*2.0+a2*a3i*dq3*mass4*t8*2.0+a2*a3i*dq3*mass5*t8*2.0+a2*a3i*dq3*mass6*t8*2.0;
+ A0(1,2) = t74+t77+t99+t120+t121+t124+t129+t130+t137-t139+t151+t152+t158+t159+t162+t166+t196+t212+t226+t229+t230-t233-t234+t239+t240+t245+t246+t252+t253-t256-t257+t265+t267+t281+t295+t296+t299+t300+t312+t315+t316+t317+t319+t346+t347+t348+t349+t350+t360-t362+t393+a2*dq2*mpx3*t3*2.0-a2*dq2*mpy3*t8*2.0+a2*a3*dq2*mass4*t3*2.0+a2*a3*dq2*mass5*t3*2.0+a2*a3*dq2*mass6*t3*2.0+a2*a3i*dq2*mass4*t8*2.0+a2*a3i*dq2*mass5*t8*2.0+a2*a3i*dq2*mass6*t8*2.0;
+ A0(1,3) = t73+t76+t85+t95+t99+t118+t119+t123+t127+t128+t131-t132+t137-t138+t140-t141+t151+t152+t156+t159+t161+t166+t179+t180+t185+t190+t191+t220+t226+t229+t230-t231-t232+t237+t238+t243+t244+t252+t253-t254-t255+t265+t267+t269+t280+t281+t295+t296+t299+t300+t312+t316+t317+t345+t347+t348+t349+t350+t360-t361+t393-a3*dq3*mpy6*t9*t10*t11*2.0-a3i*dq3*mpy6*t4*t10*t11*2.0;
+ A0(1,4) = -t144-t145+t147+t149+t251-t258+t261+t263+t268+t270-t273-t276-t351+t356-t357-t363+t419+t454+t459+t460-t461-t463+t464+t465-a2*mpy6*t3*t4*t52*2.0+a2*mpy6*t8*t9*t52*2.0+a2*dq1*mpy6*t2*t10*t11*2.0-a2*dq2*mpy6*t3*t5*t9*t11*2.0-a2*dq2*mpy6*t4*t5*t8*t11*2.0+a2*dq3*mpy6*t3*t5*t9*t11*2.0+a2*dq3*mpy6*t4*t5*t8*t11*2.0+a2*dq4*mpy6*t3*t5*t9*t11*2.0+a2*dq4*mpy6*t4*t5*t8*t11*2.0;
+ A0(1,5) = t78-t143+t148+t150-t153+t155+t157-t163+t164+t165+t250+t262+t264+t266+t271+t352+t387+t389+t452+t455+t10*t254+t10*t255+t10*t256+t10*t257-d5*dq3*mpy6*t11*2.0-d5*dq4*mpy6*t11*2.0-a4*dq2*mpy6*t6*t10*2.0-a2*dq1*mpy6*t2*t5*t6*2.0+a2*dq2*mpy6*t3*t4*t11*2.0-a2*dq3*mpy6*t3*t4*t11*2.0-a2*dq4*mpy6*t3*t4*t11*2.0-a3*dq2*mpy6*t4*t6*t10*2.0-a2*dq2*mpy6*t8*t9*t11*2.0+a2*dq3*mpy6*t8*t9*t11*2.0+a2*dq4*mpy6*t8*t9*t11*2.0-a3i*dq3*mpy6*t6*t9*t10*2.0-a3i*dq4*mpy6*t6*t9*t10*2.0-a2*dq5*mpy6*t3*t4*t5*t6*2.0-a3*dq1*mpy6*t2*t5*t6*t8*2.0-a2*dq2*mpy6*t3*t6*t9*t10*2.0-a2*dq2*mpy6*t4*t6*t8*t10*2.0+a2*dq5*mpy6*t5*t6*t8*t9*2.0-a4*dq1*mpy6*t2*t3*t5*t6*t9*2.0-a4*dq1*mpy6*t2*t4*t5*t6*t8*2.0-a4*dq1*mpy6*t5*t6*t7*t8*t9*2.0-d5*dq1*mpy6*t2*t3*t4*t5*t6*2.0-d5*dq1*mpy6*t3*t5*t6*t7*t9*2.0-d5*dq1*mpy6*t4*t5*t6*t7*t8*2.0;
+ A0(2,0) = mpy6*t433*(t178+t189-t211-t213)*-2.0;
+ A0(2,1) = t74+t77+t99+t120+t121+t124+t129+t130+t151+t152+t158+t159+t166+t196+t212+t265+t267+t315+t316+t317+t319;
+ A0(2,2) = t81+t87+t97+t133+t142+t183+t184+t187+t194+t195+t218+t219+t222+t223+t227+t275+t278+t279+t283+t313+t314;
+ A0(2,3) = t72+t75+t81+t86+t96+t116+t117+t122+t125+t126-t131+t132-t140+t141+t154+t181+t182+t186+t192+t193+t218+t219+t221+t223+t227+t272+t278+t279+t282+t313+t314-a3*dq2*mpy6*t9*t10*t11*2.0-a3i*dq2*mpy6*t4*t10*t11*2.0;
+ A0(2,4) = t144+t145+t214+t216-t251+t258-t261-t263-t268-t270+t273+t276+t351-t356+t357+t363+t461+t463+t466+t480+t482+t483+t484+t485;
+ A0(2,5) = t79+t80+t98+t143+t146+t153-t155-t157+t163-t164-t165+t215+t217-t250+t259-t266+t274+t277+t388+t449+t450+t451+t456+t457+t462+t474+t481-a3*dq3*mpy6*t4*t6*t10*2.0-a3*dq4*mpy6*t4*t6*t10*2.0-a3i*dq2*mpy6*t6*t9*t10*2.0-a3*dq1*mpy6*t3*t5*t6*t7*2.0-a3i*dq1*mpy6*t2*t3*t5*t6*2.0-a3i*dq1*mpy6*t5*t6*t7*t8*2.0;
+ A0(3,0) = mpy6*t433*(t211+t213)*2.0;
+ A0(3,1) = t86+t96+t99+t132+t141+t151+t152+t181+t182+t186+t192+t193+t221+t272+t282;
+ A0(3,2) = t81+t85+t95+t131+t140+t179+t180+t185+t190+t191+t218+t219+t220+t269+t280;
+ A0(3,3) = mpy6*(-d5*dq6*t11+a4*dq5*t5*t11+a4*dq6*t6*t10)*-2.0;
+ A0(3,4) = t144+t145+t214+t216+t461+t463+t466+t480+t482+t483+t484+t485;
+ A0(3,5) = t79+t80+t98+t143+t146+t215+t217+t449+t450+t451+t456+t457+t462+t474+t481;
+ A0(4,0) = mpy6*t11*(-a3*dq2*t89+a3*dq2*t90+a3*dq3*t89-a3*dq3*t90+a4*dq2*t199-a4*dq3*t199-a4*dq4*t199-a4*dq2*t322+a4*dq3*t322+a4*dq4*t322+a3i*dq2*t108+a3i*dq2*t109-a3i*dq3*t108-a3i*dq3*t109-d5*dq2*t207+d5*dq3*t207+d5*dq4*t207-d5*dq2*t332+d5*dq3*t332+d5*dq4*t332-a2*dq2*sin(q2+q5)+a2*dq2*sin(q2+t42));
+ A0(4,1) = mpy6*t11*(t48+t176+t287+t288+t289+t292+t293+t297+t298+t301+t304+t373+t376+a4*dq3*t5+a2*dq1*t2*t10+a3*dq3*t4*t5-a3i*dq3*t5*t9)*-2.0;
+ A0(4,2) = mpy6*t11*(t48+t176+t287+t288+t289+t292+t293+t297+t298+t301+t304+t373+t376-a4*dq2*t5-a3*dq2*t4*t5+a3i*dq2*t5*t9)*2.0;
+ A0(4,3) = mpy6*t11*(a4*dq2*t5*-2.0+a4*dq3*t5*2.0-a4*dq1*t199+a4*dq1*t322+d5*dq1*t207+d5*dq1*t332);
+ A0(5,0) = mpy6*t5*t6*(dq2*t178+dq2*t189-dq2*t211+dq3*t211-dq2*t213+dq4*t211+dq3*t213+dq4*t213+dq3*t302+dq3*t305-a2*dq2*t2)*-2.0;
+ A0(5,1) = mpy6*(t50+t51+t197+t198+t336+t369+t372+t374+t398+t399+t400+t404+t405+t408+t434+t445-a3*dq3*t9*t11*2.0-a3i*dq3*t4*t11*2.0+a2*dq1*t2*t5*t6*2.0-a3*dq3*t4*t6*t10*2.0+a3i*dq3*t6*t9*t10*2.0);
+ A0(5,2) = -mpy6*(t51+t60+t134+t198+t336+t369+t372+t374+t398+t399+t400+t404+t405+t408+t434+t445+a3*dq2*t9*t11*2.0+a3i*dq2*t4*t11*2.0+a3*dq2*t4*t6*t10*2.0-a3i*dq2*t6*t9*t10*2.0);
+ A0(5,3) = -mpy6*(t50+t60+t134+t197+t398+t399+t400+t404+t405+t408+t434+t445);
+return A0;
+}
+*/
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ARM/ARAP180.h Mon Nov 18 17:50:32 2019 +0000
@@ -0,0 +1,110 @@
+/*This file is part of dvrk-dynamics package.
+ * Copyright (C) 2017, Giuseppe Andrea Fontanelli
+
+ * Email id : giuseppeandrea.fontanelli@unina.it
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the names of Stanford University or Willow Garage, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+* This code will subscriber integer values from demo_topic_publisher
+*/
+
+#ifndef _ARAP180_H
+#define _ARAP180_H
+#include "mbed.h"
+#include "Core.h"
+#include <Eigen/Dense.h>
+#include "utilities.hpp"
+#include "UARTSerial_half.h"
+#include "MX.h"
+
+using namespace Eigen;
+using namespace std;
+
+typedef Matrix<double, 6, 1> Vector6d;
+typedef Matrix<double, 7, 1> Vector7d;
+typedef Matrix<double, 6, 6> Matrix6d;
+typedef Matrix<float, 6, 1> Vector6f;
+typedef Matrix<float, 7, 1> Vector7f;
+typedef Matrix<float, 6, 6> Matrix6f;
+
+class ARAP180
+{
+ private:
+
+ string robName;
+ string paramFile;
+
+
+ bool read_parameters_from_file(string paramFile);
+ Vector6f q_sat_max;
+ Vector6f q_sat_min;
+
+
+ UARTSerial_half *dxl_port;
+
+ int ID[5];
+ int operatingMode[5];
+ bool enableVal[5];
+ MX *mx_MotorChain;
+
+ Vector6f offsets;
+
+ Vector6f motorSign;
+
+
+
+
+ public:
+
+ /* brief Constructor. */
+ ARAP180();
+ VectorXf get_parameters();
+
+ Matrix6f jacobianMatrix(Vector6f q); //Jacobian matrix
+ Matrix4f forwardKinematics(Vector6f q); //Dyrect kinematics
+ Vector6f backwardKinematics(Matrix4f T_d, Vector6f q, float _Tsam, int _n_max_iter, float _max_pError, float _max_oError ,float _Kp, float _Ko); //Dyrect kinematics
+
+ Vector6f jointSaturation(Vector6f q);
+
+ Matrix6f inertiaMatrix(Vector6f q); //Inertia matrix
+ Matrix6f coriolisCentrifugalMatrix(Vector6f q, Vector6f dq); //Coriolis and centrifugal matrix
+
+ Vector6f gravityVector(Vector6f q); //Gravity vector
+ Vector6f frictionVector(Vector6f dq); //Friction vector
+ Vector6f stiffnessVector(Vector6f q); //Friction vector
+
+ void initArmMotors();
+ Vector6f getJointPos();
+ void setJointPos(Vector6f q);
+
+
+ void setMaxVel(float maxVel);
+ void setMaxAcc(float maxAcc);
+
+
+
+
+
+};
+
+#endif // _ARMHyfliers_H
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ARM/ARM_parameters.h Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,68 @@ +//Kinematic param +#define a1 0.029 +#define a2 0.340 +#define a3 0.029 +#define a3i 0.335 +#define a4 0.084 +#define d5 -0.218 +//Dynamic param +#define mass1 0 +#define mpx1 0 +#define mpy1 0 +#define mpz1 0 +#define Ixx1 0 +#define Iyy1 0 +#define Izz1 0 +#define Fv1 0 +#define Fs1 0 +#define mass2 0 +#define mpx2 0 +#define mpy2 0 +#define mpz2 0 +#define Ixx2 0 +#define Iyy2 0 +#define Izz2 0 +#define Fv2 0 +#define Fs2 0 +#define K2 0 +#define O2 0 +#define mass3 0 +#define mpx3 0 +#define mpy3 0 +#define mpz3 0 +#define Ixx3 0 +#define Iyy3 0 +#define Izz3 0 +#define Fv3 0 +#define Fs3 0 +#define K3 0 +#define O3 0 +#define mass4 0 +#define mpx4 0 +#define mpy4 0 +#define mpz4 0 +#define Ixx4 0 +#define Iyy4 0 +#define Izz4 0 +#define Fv4 0 +#define Fs4 0 +#define K4 0 +#define O4 0 +#define mass5 0 +#define mpx5 0 +#define mpy5 0 +#define mpz5 0 +#define Ixx5 0 +#define Iyy5 0 +#define Izz5 0 +#define Fv5 0 +#define Fs5 0 +#define mass6 0 +#define mpx6 0 +#define mpy6 0 +#define mpz6 0 +#define Ixx6 0 +#define Iyy6 0 +#define Izz6 0 +#define Fv6 0 +#define Fs6 0 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ARM/MX64.lib Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/PRISMA-Lab/code/MX64_senzaCorrente/#5d3f37356915
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ARM/utilities.hpp Mon Nov 18 17:50:32 2019 +0000
@@ -0,0 +1,379 @@
+#ifndef _utilities_hpp
+#define _utilities_hpp
+
+
+#include "Core.h"
+#ifndef M_PI
+#define M_PI 3.14159265358979
+#endif
+
+using namespace std; //calling the standard directory
+using namespace Eigen;
+
+namespace utilities{
+
+ inline Matrix3f rotx(float alpha){
+ Matrix3f Rx;
+ Rx << 1,0,0,
+ 0,cos(alpha),-sin(alpha),
+ 0,sin(alpha), cos(alpha);
+ return Rx;
+ }
+
+ inline Matrix3f roty(float beta){
+ Matrix3f Ry;
+ Ry << cos(beta),0,sin(beta),
+ 0,1,0,
+ -sin(beta),0, cos(beta);
+ return Ry;
+ }
+
+ inline Matrix3f rotz(float gamma){
+ Matrix3f Rz;
+ Rz << cos(gamma),-sin(gamma),0,
+ sin(gamma),cos(gamma),0,
+ 0,0, 1;
+ return Rz;
+ }
+
+
+ inline Matrix4f rotx_T(float alpha){
+ Matrix4f Tx = Matrix4f::Identity();
+ Tx.block(0,0,3,3) = rotx(alpha);
+ return Tx;
+ }
+
+ inline Matrix4f roty_T(float beta){
+ Matrix4f Ty = Matrix4f::Identity();
+ Ty.block(0,0,3,3) = roty(beta);
+ return Ty;
+ }
+
+ inline Matrix4f rotz_T(float gamma){
+ Matrix4f Tz = Matrix4f::Identity();
+ Tz.block(0,0,3,3) = rotz(gamma);
+ return Tz;
+ }
+
+ inline Matrix3f skew(Vector3f v)
+ {
+ Matrix3f S;
+ S << 0, -v[2], v[1], //Skew-symmetric matrix
+ v[2], 0, -v[0],
+ -v[1], v[0], 0;
+ return S;
+ }
+
+
+ inline Matrix3f L_matrix(Matrix3f R_d, Matrix3f R_e)
+ {
+ Matrix3f L = -0.5 * (skew(R_d.col(0))*skew(R_e.col(0)) + skew(R_d.col(1))*skew(R_e.col(1)) + skew(R_d.col(2))*skew(R_e.col(2)));
+ return L;
+ }
+
+
+
+ inline Vector3f rotationMatrixError(Matrix4f Td, Matrix4f Te)
+ {
+
+ Matrix3f R_e = Te.block(0,0,3,3); //Matrix.slice<RowStart, ColStart, NumRows, NumCols>();
+ Matrix3f R_d = Td.block(0,0,3,3);
+
+ Vector3f eo = 0.5 * (skew(R_e.col(0))*R_d.col(0) + skew(R_e.col(1))*R_d.col(1) + skew(R_e.col(2))*R_d.col(2)) ;
+ return eo;
+ }
+
+
+ inline Vector3f r2quat(Matrix3f R_iniz, float &eta)
+ {
+ Vector3f epsilon;
+ int iu, iv, iw;
+
+ if ( (R_iniz(0,0) >= R_iniz(1,1)) && (R_iniz(0,0) >= R_iniz(2,2)) )
+ {
+ iu = 0; iv = 1; iw = 2;
+ }
+ else if ( (R_iniz(1,1) >= R_iniz(0,0)) && (R_iniz(1,1) >= R_iniz(2,2)) )
+ {
+ iu = 1; iv = 2; iw = 0;
+ }
+ else
+ {
+ iu = 2; iv = 0; iw = 1;
+ }
+
+ float r = sqrt(1 + R_iniz(iu,iu) - R_iniz(iv,iv) - R_iniz(iw,iw));
+ Vector3f q;
+ q << 0,0,0;
+ if (r>0)
+ {
+ float rr = 2*r;
+ eta = (R_iniz(iw,iv)-R_iniz(iv,iw)/rr);
+ epsilon[iu] = r/2;
+ epsilon[iv] = (R_iniz(iu,iv)+R_iniz(iv,iu))/rr;
+ epsilon[iw] = (R_iniz(iw,iu)+R_iniz(iu,iw))/rr;
+ }
+ else
+ {
+ eta = 1;
+ epsilon << 0,0,0;
+ }
+ return epsilon;
+ }
+
+
+ inline Vector4f rot2quat(Matrix3f R){
+
+ float m00, m01, m02, m10, m11, m12, m20, m21, m22;
+
+ m00 = R(0,0);
+ m01 = R(0,1);
+ m02 = R(0,2);
+ m10 = R(1,0);
+ m11 = R(1,1);
+ m12 = R(1,2);
+ m20 = R(2,0);
+ m21 = R(2,1);
+ m22 = R(2,2);
+
+ float tr = m00 + m11 + m22;
+ float qw, qx, qy, qz, S;
+ Vector4f quat;
+
+ if (tr > 0) {
+ S = sqrt(tr+1.0) * 2; // S=4*qw
+ qw = 0.25 * S;
+ qx = (m21 - m12) / S;
+ qy = (m02 - m20) / S;
+ qz = (m10 - m01) / S;
+ } else if ((m00 > m11)&(m00 > m22)) {
+ S = sqrt(1.0 + m00 - m11 - m22) * 2; // S=4*qx
+ qw = (m21 - m12) / S;
+ qx = 0.25 * S;
+ qy = (m01 + m10) / S;
+ qz = (m02 + m20) / S;
+ } else if (m11 > m22) {
+ S = sqrt(1.0 + m11 - m00 - m22) * 2; // S=4*qy
+ qw = (m02 - m20) / S;
+ qx = (m01 + m10) / S;
+ qy = 0.25 * S;
+ qz = (m12 + m21) / S;
+ } else {
+ S = sqrt(1.0 + m22 - m00 - m11) * 2; // S=4*qz
+ qw = (m10 - m01) / S;
+ qx = (m02 + m20) / S;
+ qy = (m12 + m21) / S;
+ qz = 0.25 * S;
+ }
+
+ quat << qw, qx, qy, qz;
+ return quat;
+
+ }
+
+
+ //Matrix ortonormalization
+ inline Matrix3f matrixOrthonormalization(Matrix3f R){
+
+ SelfAdjointEigenSolver<Matrix3f> es(R.transpose()*R);
+ Vector3f D = es.eigenvalues();
+ Matrix3f V = es.eigenvectors();
+ R = R*((1/sqrt(D(0)))*V.col(0)*V.col(0).transpose() + (1/sqrt(D(1)))*V.col(1)*V.col(1).transpose() + (1/sqrt(D(2)))*V.col(2)*V.col(2).transpose());
+
+ return R;
+ }
+
+
+
+
+ //******************************************************************************
+ inline Vector3f quaternionError(Matrix4f Tbe, Matrix4f Tbe_d)
+ {
+ float eta, eta_d;
+ Matrix3f R = Tbe.block(0,0,3,3); //Matrix.slice<RowStart, ColStart, NumRows, NumCols>();
+ Vector3f epsilon = r2quat(R, eta);
+ Matrix3f R_d = Tbe_d.block(0,0,3,3);
+ Vector3f epsilon_d = r2quat(R_d, eta_d);
+ Matrix3f S = skew(epsilon_d);
+ Vector3f eo = eta*epsilon_d-eta_d*epsilon-S*epsilon;
+ return eo;
+ }
+
+
+ inline Vector3f versorError(Vector3f P_d, Matrix3f Tbe_e, float &theta)
+ {
+ Vector3f P_e = Tbe_e.block(0,3,3,1);
+ Vector3f u_e = Tbe_e.block(0,0,3,1);
+
+ Vector3f u_d = P_d - P_e;
+ u_d = u_d/ u_d.norm();
+
+ Vector3f r = skew(u_e)*u_d;
+ float nr = r.norm();
+
+ if (nr >0){
+ r = r/r.norm();
+
+
+ //be carefult to acos( > 1 )
+ float u_e_d = u_e.transpose()*u_d;
+ if( fabs(u_e_d) <= 1.0 ) {
+ theta = acos(u_e.transpose()*u_d);
+ }
+ else {
+ theta = 0.0;
+ }
+
+ Vector3f error = r*sin(theta);
+ return error;
+ }else{
+ theta = 0.0;
+ return Vector3f::Zero();
+ }
+ }
+
+
+ /*Matrix3f utilities::rotation ( float theta, Vector3f r ) {
+
+ Matrix3f R = Zeros;
+
+ R[0][0] = r[0]*r[0]*(1-cos(theta)) + cos(theta);
+ R[1][1] = r[1]*r[1]*(1-cos(theta)) + cos(theta);
+ R[2][2] = r[2]*r[2]*(1-cos(theta)) + cos(theta);
+
+ R[0][1] = r[0]*r[1]*(1-cos(theta)) - r[2]*sin(theta);
+ R[1][0] = r[0]*r[1]*(1-cos(theta)) + r[2]*sin(theta);
+
+ R[0][2] = r[0]*r[2]*(1-cos(theta)) + r[1]*sin(theta);
+ R[2][0] = r[0]*r[2]*(1-cos(theta)) - r[1]*sin(theta);
+
+ R[1][2] = r[1]*r[2]*(1-cos(theta)) - r[0]*sin(theta);
+ R[2][1] = r[1]*r[2]*(1-cos(theta)) + r[0]*sin(theta);
+
+
+ return R;
+ }*/
+
+
+ inline Matrix3f XYZ2R(Vector3f angles) {
+
+ Matrix3f R = Matrix3f::Zero();
+ Matrix3f R1 = Matrix3f::Zero();
+ Matrix3f R2 = Matrix3f::Zero();
+ Matrix3f R3 = Matrix3f::Zero();
+
+ float cos_phi = cos(angles[0]);
+ float sin_phi = sin(angles[0]);
+ float cos_theta = cos(angles[1]);
+ float sin_theta = sin(angles[1]);
+ float cos_psi = cos(angles[2]);
+ float sin_psi = sin(angles[2]);
+
+ R1 << 1, 0 , 0,
+ 0, cos_phi, -sin_phi,
+ 0, sin_phi, cos_phi;
+
+ R2 << cos_theta , 0, sin_theta,
+ 0 , 1, 0 ,
+ -sin_theta, 0, cos_theta;
+
+ R3 << cos_psi, -sin_psi, 0,
+ sin_psi, cos_psi , 0,
+ 0 , 0 , 1;
+
+ R = R1*R2*R3;
+
+ return R;
+ }
+
+ // This method computes the XYZ Euler angles from the Rotational matrix R.
+ inline Vector3f R2XYZ(Matrix3f R) {
+ float phi=0.0, theta=0.0, psi=0.0;
+ Vector3f XYZ = Vector3f::Zero();
+
+ theta = asin(R(0,2));
+
+ if(fabsf(cos(theta))>pow(10.0,-10.0))
+ {
+ phi=atan2(-R(1,2)/cos(theta), R(2,2)/cos(theta));
+ psi=atan2(-R(0,1)/cos(theta), R(0,0)/cos(theta));
+ }
+ else
+ {
+ if(fabsf(theta-M_PI/2.0)<pow(10.0,-5.0))
+ {
+ psi = 0.0;
+ phi = atan2(R(1,0), R(2,0));
+ theta = M_PI/2.0;
+ }
+ else
+ {
+ psi = 0.0;
+ phi = atan2(-R(1,0), R(2,0));
+ theta = -M_PI/2.0;
+ }
+ }
+
+ XYZ << phi,theta,psi;
+ return XYZ;
+ }
+
+ inline Matrix3f angleAxis2Rot(Vector3f ri, float theta){
+ Matrix3f R;
+ R << ri[0]*ri[0] * (1 - cos(theta)) + cos(theta) , ri[0] * ri[1] * (1 - cos(theta)) - ri[2] * sin(theta) , ri[0] * ri[2] * (1 - cos(theta)) + ri[1] * sin(theta),
+ ri[0] * ri[1] * (1 - cos(theta)) + ri[2] * sin(theta) , ri[1]*ri[1] * (1 - cos(theta)) + cos(theta) , ri[1] * ri[2] * (1 - cos(theta)) - ri[0] * sin(theta),
+ ri[0] * ri[2] * (1 - cos(theta)) - ri[1] * sin(theta) , ri[1] * ri[2] * (1 - cos(theta)) + ri[0] * sin(theta) , ri[2]*ri[2] * (1 - cos(theta)) + cos(theta);
+
+ return R;
+
+ }
+
+
+
+ inline Vector3f butt_filter(Vector3f x, Vector3f x1, Vector3f x2, float omega_n, float zita, float ctrl_T){
+ //applico un filtro di Butterworth del secondo ordine (sfrutto Eulero all'indietro)
+ return x1*(2.0 + 2.0*omega_n*zita*ctrl_T)/(omega_n*omega_n*ctrl_T*ctrl_T + 2.0*omega_n*zita*ctrl_T + 1.0) - x2/(omega_n*omega_n*ctrl_T*ctrl_T + 2.0*omega_n*zita*ctrl_T + 1.0) + x*(omega_n*omega_n*ctrl_T*ctrl_T)/(omega_n*omega_n*ctrl_T*ctrl_T + 2.0*omega_n*zita*ctrl_T + 1.0);
+ }
+
+
+
+ /// converts a rate in Hz to an integer period in ms.
+ inline uint16_t rateToPeriod(const float & rate) {
+ if (rate > 0)
+ return static_cast<uint16_t> (1000.0 / rate);
+ else
+ return 0;
+ }
+
+
+
+
+ //Quaternion to rotration Matrix
+ inline Matrix3f QuatToMat(Vector4f Quat){
+ Matrix3f Rot;
+ float s = Quat[0];
+ float x = Quat[1];
+ float y = Quat[2];
+ float z = Quat[3];
+ Rot << 1-2*(y*y+z*z),2*(x*y-s*z),2*(x*z+s*y),
+ 2*(x*y+s*z),1-2*(x*x+z*z),2*(y*z-s*x),
+ 2*(x*z-s*y),2*(y*z+s*x),1-2*(x*x+y*y);
+ return Rot;
+ }
+
+
+ inline float rad2deg(float rad){
+ float deg;
+ deg = 180.0*rad/M_PI;
+ return deg;
+ }
+
+ inline float deg2rad(float deg){
+ float rad;
+ rad = M_PI*deg/180.0;
+ return rad;
+ }
+}
+
+#endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CONTRIBUTING.md Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,5 @@ +# Contributing to Mbed OS + +Mbed OS is an open-source, device software platform for the Internet of Things. Contributions are an important part of the platform, and our goal is to make it as simple as possible to become a contributor. + +To encourage productive collaboration, as well as robust, consistent and maintainable code, we have a set of guidelines for [contributing to Mbed OS](https://os.mbed.com/docs/mbed-os/latest/contributing/index.html).
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Eigen.lib Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/ykuroda/code/Eigen/#13a5d365ba16
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README.md Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,152 @@ +# Getting started example for Mbed OS + +This guide reviews the steps required to get Blinky with the addition of dynamic OS statistics working on an Mbed OS platform. (Note: To see a rendered example you can import into the Arm Online Compiler, please see our [quick start](https://os.mbed.com/docs/mbed-os/latest/quick-start/online-with-the-online-compiler.html#importing-the-code).) + +Please install [Mbed CLI](https://github.com/ARMmbed/mbed-cli#installing-mbed-cli). + +## Import the example application + +From the command-line, import the example: + +``` +mbed import mbed-os-example-blinky +cd mbed-os-example-blinky +``` + +### Now compile + +Invoke `mbed compile`, and specify the name of your platform and your favorite toolchain (`GCC_ARM`, `ARM`, `IAR`). For example, for the Arm Compiler: + +``` +mbed compile -m K64F -t ARM +``` + +Your PC may take a few minutes to compile your code. At the end, you see the following result: + +``` +[snip] + +Image: ./BUILD/K64F/GCC_ARM/mbed-os-example-blinky.bin +``` + +### Program your board + +1. Connect your Mbed device to the computer over USB. +1. Copy the binary file to the Mbed device. +1. Press the reset button to start the program. + +The LED on your platform turns on and off. The main thread will additionally take a snapshot of the device's runtime statistics and display it over serial to your PC. The snapshot includes: + +* System Information: + * Mbed OS Version: Will currently default to 999999 + * Compiler ID + * ARM = 1 + * GCC_ARM = 2 + * IAR = 3 + * [CPUID Register Information](#cpuid-register-information) + * [Compiler Version](#compiler-version) +* CPU Statistics + * Percentage of runtime that the device has spent awake versus in sleep +* Heap Statistics + * Current heap size + * Max heap size which refers to the largest the heap has grown to +* Thread Statistics + * Provides information on all running threads in the OS including + * Thread ID + * Thread Name + * Thread State + * Thread Priority + * Thread Stack Size + * Thread Stack Space + +#### Compiler Version + +| Compiler | Version Layout | +| -------- | -------------- | +| ARM | PVVbbbb (P = Major; VV = Minor; bbbb = build number) | +| GCC | VVRRPP (VV = Version; RR = Revision; PP = Patch) | +| IAR | VRRRPPP (V = Version; RRR = Revision; PPP = Patch) | + +#### CPUID Register Information + +| Bit Field | Field Description | Values | +| --------- | ----------------- | ------ | +|[31:24] | Implementer | 0x41 = ARM | +|[23:20] | Variant | Major revision 0x0 = Revision 0 | +|[19:16] | Architecture | 0xC = Baseline Architecture | +| | | 0xF = Constant (Mainline Architecture) | +|[15:4] | Part Number | 0xC20 = Cortex-M0 | +| | | 0xC60 = Cortex-M0+ | +| | | 0xC23 = Cortex-M3 | +| | | 0xC24 = Cortex-M4 | +| | | 0xC27 = Cortex-M7 | +| | | 0xD20 = Cortex-M23 | +| | | 0xD21 = Cortex-M33 | +|[3:0] | Revision | Minor revision: 0x1 = Patch 1 | + + + +You can view individual examples and additional API information of the statistics collection tools at the bottom of the page in the [related links section](#related-links). + + +### Output + +To view the serial output you can use any terminal client of your choosing such as [PuTTY](http://www.putty.org/) or [CoolTerm](http://freeware.the-meiers.org/). Unless otherwise specified, printf defaults to a baud rate of 9600 on Mbed OS. + +You can find more information on the Mbed OS configuration tools and serial communication in Mbed OS in the related [related links section](#related-links). + +The output should contain the following block transmitted at the blinking LED frequency (actual values may vary depending on your target, build profile, and toolchain): + +``` +=============================== SYSTEM INFO ================================ +Mbed OS Version: 999999 +CPU ID: 0x410fc241 +Compiler ID: 2 +Compiler Version: 60300 +RAM0: Start 0x20000000 Size: 0x30000 +RAM1: Start 0x1fff0000 Size: 0x10000 +ROM0: Start 0x0 Size: 0x100000 +================= CPU STATS ================= +Idle: 98% Usage: 2% +================ HEAP STATS ================= +Current heap: 1096 +Max heap size: 1096 +================ THREAD STATS =============== +ID: 0x20001eac +Name: main_thread +State: 2 +Priority: 24 +Stack Size: 4096 +Stack Space: 3296 + +ID: 0x20000f5c +Name: idle_thread +State: 1 +Priority: 1 +Stack Size: 512 +Stack Space: 352 + +ID: 0x20000f18 +Name: timer_thread +State: 3 +Priority: 40 +Stack Size: 768 +Stack Space: 664 + +``` + +## Troubleshooting + +If you have problems, you can review the [documentation](https://os.mbed.com/docs/latest/tutorials/debugging.html) for suggestions on what could be wrong and how to fix it. + +## Related Links + +* [Mbed OS Stats API](https://os.mbed.com/docs/latest/apis/mbed-statistics.html) +* [Mbed OS Configuration](https://os.mbed.com/docs/latest/reference/configuration.html) +* [Mbed OS Serial Communication](https://os.mbed.com/docs/latest/tutorials/serial-communication.html) + +### License and contributions + +The software is provided under Apache-2.0 license. Contributions to this project are accepted under the same license. Please see contributing.md for more info. + +This project contains code from other projects. The original license text is included in those source files. They must comply with our license guide.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Nov 18 17:50:32 2019 +0000
@@ -0,0 +1,142 @@
+#include "mbed.h"
+#include "ARAP180.h"
+#include "platform/mbed_thread.h"
+ARAP180 arm;
+
+
+
+int main() {
+arm.initArmMotors();
+
+Vector6f q = Vector6f::Zero();
+Vector6f q_out = Vector6f::Zero();
+Vector6f q_out_sat = Vector6f::Zero();
+
+Matrix4f T = Matrix4f::Zero();
+Matrix6f J = Matrix6f::Zero();
+Matrix4f Td = Matrix4f::Identity();
+
+
+Matrix4f T_e_b_0 = Matrix4f::Zero();
+/*T_e_b_0(0,2) = 1.0;
+T_e_b_0(1,0) = -1.0;
+T_e_b_0(2,1) = -1.0;
+T_e_b_0(0,3) = 0.142;
+T_e_b_0(2,3) = -0.213;
+T_e_b_0(3,3) = 1.0;*/
+
+
+
+Matrix4f T_e_b = Matrix4f::Identity();
+Matrix4f RotoTraslation = Matrix4f::Identity();
+
+Matrix4f T_r_e = Matrix4f::Identity();
+
+T_r_e(1,3) = -0.218;
+
+double t = 0.0;
+
+Vector6f q0 = Vector6f::Zero();
+Vector6f q_offsetted = Vector6f::Zero();
+Vector6f q_act = Vector6f::Zero();
+//q0 = arm.getJointPos();
+q0(0) = 0.0;
+q0(1) = M_PI/4;
+q0(2) = M_PI/3;
+q0(3) = -M_PI/3 + M_PI/4;
+q0(4) = M_PI/2;
+q0(5) = 0.0;
+T_e_b_0 = arm.forwardKinematics(q0);
+
+
+q_out = q0;
+
+float traslation_x;
+float traslation_y;
+float traslation_z;
+
+arm.setJointPos(q0);
+
+wait_us(5000000);
+
+arm.setMaxVel(100);
+
+arm.setMaxAcc(100);
+
+while (true){
+
+
+ traslation_x = 0.0;//0.3*sin(0.2*2*M_PI*t);//+0.15*sin(0.2*2*M_PI*t);
+ traslation_y = 0.0;//-0.4*sin(0.2*2*M_PI*t);
+ traslation_z = 0.25*sin(0.2*2*M_PI*t);//-0.15*sin(0.2*2*M_PI*t);//0.3+0.1*sin(0.2*2*M_PI*t);
+
+ RotoTraslation.block(0,0,3,3) = utilities::rotx(0.0);//utilities::rotx((M_PI/3)*sin(0.2*2*M_PI*t));
+
+ RotoTraslation(0,3) = traslation_x;
+ RotoTraslation(1,3) = traslation_y;
+ RotoTraslation(2,3) = traslation_z;
+
+ T_e_b=T_e_b_0*T_r_e*RotoTraslation*T_r_e.inverse();
+
+ //T_e_b=T_e_b_0*RotoTraslation;
+
+ T_e_b.block(0,0,3,3) = utilities::matrixOrthonormalization(T_e_b.block(0,0,3,3));
+
+ //T_e_b(0,3) = traslation_x;
+ //T_e_b(1,3) = traslation_y;
+ //T_e_b(2,3) = traslation_z;
+
+ /*printf("T_e_b=\n");
+ for(int i = 0; i<4; i++){
+ for(int j = 0; j<4; j++){
+ printf("%4.3f", T_e_b(i,j));
+ }
+ printf("\r\n\n");
+ } */
+
+ q_out = arm.backwardKinematics(T_e_b, q_out, 0.005, 1, 0.001, 0.001 ,150, 50);
+
+ q_out_sat = arm.jointSaturation(q_out);
+ //q_out = Vector6f::Zero();
+
+
+ /*printf("q=");
+ for(int i = 0; i<6; i++){
+ printf(" %4.1f",q_out[i]);
+ }
+ printf("\r\n"); */
+
+ /* printf("q_sat=");
+ for(int i = 0; i<6; i++){
+ printf(" %4.1f",q_out_sat[i]);
+ }
+ printf("\r\n\n"); */
+
+ //q_act = arm.getJointPos();
+
+
+
+ /* printf("q_act = ");
+ for(int i = 0; i<6; i++){
+ printf(" %4.2f ",q_act[i]);
+ }
+ printf("\r\n");*/
+
+ arm.setJointPos(q_out);
+
+ //arm.gravityVector(q);
+ //arm.inertiaMatrix(q);
+ //arm.stiffnessVector(q);
+ //arm.frictionVector(q);
+
+
+
+
+ t = t+0.001;
+ wait_us(1000);
+
+}
+
+
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#679d24833acf0a0b5b0d528576bb37c70863bc4e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_app.json Mon Nov 18 17:50:32 2019 +0000
@@ -0,0 +1,11 @@
+{
+ "target_overrides": {
+ "*": {
+ "platform.stack-stats-enabled": true,
+ "platform.heap-stats-enabled": true,
+ "platform.cpu-stats-enabled": true,
+ "platform.thread-stats-enabled": true,
+ "platform.sys-stats-enabled": true
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stats_report.h Mon Nov 18 17:50:32 2019 +0000
@@ -0,0 +1,133 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2018 ARM Limited
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef STATS_REPORT_H
+#define STATS_REPORT_H
+
+#include <inttypes.h>
+#include "mbed.h"
+
+/**
+ * System Reporting library. Provides runtime information on device:
+ * - CPU sleep, idle, and wake times
+ * - Heap and stack usage
+ * - Thread information
+ * - Static system information
+ */
+class SystemReport {
+ mbed_stats_heap_t heap_stats;
+ mbed_stats_cpu_t cpu_stats;
+ mbed_stats_sys_t sys_stats;
+
+ mbed_stats_thread_t *thread_stats;
+ uint8_t thread_count;
+ uint8_t max_thread_count;
+ uint32_t sample_time_ms;
+
+public:
+ /**
+ * SystemReport - Sample rate in ms is required to handle the CPU percent awake logic
+ */
+ SystemReport(uint32_t sample_rate) : max_thread_count(8), sample_time_ms(sample_rate)
+ {
+ thread_stats = new mbed_stats_thread_t[max_thread_count];
+
+ // Collect the static system information
+ mbed_stats_sys_get(&sys_stats);
+
+ printf("=============================== SYSTEM INFO ================================\r\n");
+ printf("Mbed OS Version: %" PRIu32 " \r\n", sys_stats.os_version);
+ printf("CPU ID: 0x%" PRIx32 " \r\n", sys_stats.cpu_id);
+ printf("Compiler ID: %d \r\n", sys_stats.compiler_id);
+ printf("Compiler Version: %" PRIu32 " \r\n", sys_stats.compiler_version);
+
+ for (int i = 0; i < MBED_MAX_MEM_REGIONS; i++) {
+ if (sys_stats.ram_size[i] != 0) {
+ printf("RAM%d: Start 0x%" PRIx32 " Size: 0x%" PRIx32 " \r\n", i, sys_stats.ram_start[i], sys_stats.ram_size[i]);
+ }
+ }
+ for (int i = 0; i < MBED_MAX_MEM_REGIONS; i++) {
+ if (sys_stats.rom_size[i] != 0) {
+ printf("ROM%d: Start 0x%" PRIx32 " Size: 0x%" PRIx32 " \r\n", i, sys_stats.rom_start[i], sys_stats.rom_size[i]);
+ }
+ }
+ }
+
+ ~SystemReport(void)
+ {
+ free(thread_stats);
+ }
+
+ /**
+ * Report on each Mbed OS Platform stats API
+ */
+ void report_state(void)
+ {
+ report_cpu_stats();
+ report_heap_stats();
+ report_thread_stats();
+
+ // Clear next line to separate subsequent report logs
+ printf("\r\n");
+ }
+
+ /**
+ * Report CPU idle and awake time in terms of percentage
+ */
+ void report_cpu_stats(void)
+ {
+ static uint64_t prev_idle_time = 0;
+
+ printf("================= CPU STATS =================\r\n");
+
+ // Collect and print cpu stats
+ mbed_stats_cpu_get(&cpu_stats);
+
+ uint64_t diff = (cpu_stats.idle_time - prev_idle_time);
+ uint8_t idle = (diff * 100) / (sample_time_ms * 1000); // usec;
+ uint8_t usage = 100 - ((diff * 100) / (sample_time_ms * 1000)); // usec;;
+ prev_idle_time = cpu_stats.idle_time;
+
+ printf("Idle: %d%% Usage: %d%% \r\n", idle, usage);
+ }
+
+ /**
+ * Report current heap stats. Current heap refers to the current amount of
+ * allocated heap. Max heap refers to the highest amount of heap allocated
+ * since reset.
+ */
+ void report_heap_stats(void)
+ {
+ printf("================ HEAP STATS =================\r\n");
+
+ // Collect and print heap stats
+ mbed_stats_heap_get(&heap_stats);
+
+ printf("Current heap: %" PRIu32 "\r\n", heap_stats.current_size);
+ printf("Max heap size: %" PRIu32 "\r\n", heap_stats.max_size);
+ }
+
+ /**
+ * Report active thread stats
+ */
+ void report_thread_stats(void)
+ {
+ printf("================ THREAD STATS ===============\r\n");
+
+ // Collect and print running thread stats
+ int count = mbed_stats_thread_get_each(thread_stats, max_thread_count);
+
+ for (int i = 0; i < count; i++) {
+ printf("ID: 0x%" PRIx32 " \r\n", thread_stats[i].id);
+ printf("Name: %s \r\n", thread_stats[i].name);
+ printf("State: %" PRIu32 " \r\n", thread_stats[i].state);
+ printf("Priority: %" PRIu32 " \r\n", thread_stats[i].priority);
+ printf("Stack Size: %" PRIu32 " \r\n", thread_stats[i].stack_size);
+ printf("Stack Space: %" PRIu32 " \r\n", thread_stats[i].stack_space);
+ }
+ }
+};
+
+#endif // STATS_REPORT_H
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/README.md Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,12 @@ +# Testing examples + +Examples are tested using tool [htrun](https://github.com/ARMmbed/mbed-os-tools/tree/master/packages/mbed-host-tests) and templated print log. + +To run the test, use following command after you build the example: +``` +mbedhtrun -d D: -p COM4 -m K64F -f .\BUILD\K64F\GCC_ARM\blinky.bin --compare-log tests\blinky.log +``` + + +More details about `htrun` are [here](https://github.com/ARMmbed/mbed-os-tools/tree/master/packages/mbed-host-tests#testing-mbed-os-examples). +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/blinky.log Mon Nov 18 17:50:32 2019 +0000 @@ -0,0 +1,29 @@ +=============================== SYSTEM INFO ================================ +Mbed OS Version: +CPU ID: 0x[0-9a-fA-F]+ +Compiler ID: \d+ +Compiler Version: +================= CPU STATS ================= +Idle: \d+% Usage: \d+% +================ HEAP STATS ================= +Current heap: \d+ +Max heap size: \d+ +================ THREAD STATS =============== +ID: 0x[0-9a-fA-F]+ +Name: main +State: \d+ +Priority: \d+ +Stack Size: \d+ +Stack Space: \d+ +ID: 0x[0-9a-fA-F]+ +Name: rtx_idle +State: \d+ +Priority: \d+ +Stack Size: \d+ +Stack Space: \d+ +ID: 0x[0-9a-fA-F]+ +Name: rtx_timer +State: \d+ +Priority: \d+ +Stack Size: \d+ +Stack Space: \d+