prima prova bracctio

Dependencies:   Eigen MX64_senzaCorrente

Files at this revision

API Documentation at this revision

Comitter:
anfontanelli
Date:
Mon Nov 18 17:50:32 2019 +0000
Commit message:
arm created

Changed in this revision

.gitignore Show annotated file Show diff for this revision Revisions of this file
ARM/ARAP180.cpp Show annotated file Show diff for this revision Revisions of this file
ARM/ARAP180.h Show annotated file Show diff for this revision Revisions of this file
ARM/ARM_parameters.h Show annotated file Show diff for this revision Revisions of this file
ARM/MX64.lib Show annotated file Show diff for this revision Revisions of this file
ARM/utilities.hpp Show annotated file Show diff for this revision Revisions of this file
CONTRIBUTING.md Show annotated file Show diff for this revision Revisions of this file
Eigen.lib Show annotated file Show diff for this revision Revisions of this file
README.md Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
mbed_app.json Show annotated file Show diff for this revision Revisions of this file
stats_report.h Show annotated file Show diff for this revision Revisions of this file
tests/README.md Show annotated file Show diff for this revision Revisions of this file
tests/blinky.log Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 82a5f03b7eb4 .gitignore
--- /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*
diff -r 000000000000 -r 82a5f03b7eb4 ARM/ARAP180.cpp
--- /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;
+}
+*/
+
+
+
+
diff -r 000000000000 -r 82a5f03b7eb4 ARM/ARAP180.h
--- /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
+
diff -r 000000000000 -r 82a5f03b7eb4 ARM/ARM_parameters.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
diff -r 000000000000 -r 82a5f03b7eb4 ARM/MX64.lib
--- /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
diff -r 000000000000 -r 82a5f03b7eb4 ARM/utilities.hpp
--- /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
+
diff -r 000000000000 -r 82a5f03b7eb4 CONTRIBUTING.md
--- /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).
diff -r 000000000000 -r 82a5f03b7eb4 Eigen.lib
--- /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
diff -r 000000000000 -r 82a5f03b7eb4 README.md
--- /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.
diff -r 000000000000 -r 82a5f03b7eb4 main.cpp
--- /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);
+
+}
+
+     
+}
+
diff -r 000000000000 -r 82a5f03b7eb4 mbed-os.lib
--- /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
diff -r 000000000000 -r 82a5f03b7eb4 mbed_app.json
--- /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
+        }
+    }
+}
diff -r 000000000000 -r 82a5f03b7eb4 stats_report.h
--- /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
diff -r 000000000000 -r 82a5f03b7eb4 tests/README.md
--- /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).
+
diff -r 000000000000 -r 82a5f03b7eb4 tests/blinky.log
--- /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+