15 srand( (
unsigned)time( NULL ));
103 chaindyn.addSegment(segment1);
104 chaindyn.addSegment(segment2);
127 static const double scale=1;
128 static const double offset=0;
129 static const double inertiamotorA=5.0;
130 static const double inertiamotorB=3.0;
131 static const double inertiamotorC=1.0;
132 static const double damping=0;
133 static const double stiffness=0;
193 Vector(0.0,-0.3120511,-0.0038871),
199 Vector(0.0,-0.0015515,0.0),
205 Vector(0.0,0.5216809,0.0),
211 Vector(0.0,0.0119891,0.0),
217 Vector(0.0,0.0080787,0.0),
249 unsigned int nr_of_constraints = 4;
253 JntArray q_in(chain2.getNrOfJoints());
254 JntArray q_in2(chain2.getNrOfJoints());
256 for(
unsigned int i=0; i<chain2.getNrOfJoints(); i++)
261 JntArray q_out(chain2.getNrOfJoints());
262 JntArray q_out2(chain2.getNrOfJoints());
263 JntArray ff_tau(chain2.getNrOfJoints());
264 JntArray constraint_tau(chain2.getNrOfJoints());
265 Jacobian jac(chain2.getNrOfJoints());
269 Wrenches wrenches(chain2.getNrOfSegments());
270 JntSpaceInertiaMatrix m(chain2.getNrOfJoints());
273 Jacobian alpha(nr_of_constraints - 1);
274 JntArray beta(nr_of_constraints - 1);
332 q_in.
resize(chain2.getNrOfJoints());
349 q_in2.
resize(chain2.getNrOfJoints());
354 wrenches.
resize(chain2.getNrOfSegments());
357 q_out2.
resize(chain2.getNrOfSegments());
358 ff_tau.
resize(chain2.getNrOfSegments());
359 constraint_tau.
resize(chain2.getNrOfSegments());
362 alpha.
resize(nr_of_constraints);
364 beta.resize(nr_of_constraints);
366 jac.
resize(chain2.getNrOfJoints());
368 q_out.
resize(chain2.getNrOfJoints());
369 q_in3.
resize(chain2.getNrOfJoints());
370 m.resize(chain2.getNrOfJoints());
396 FkPosAndJacLocal(chain1,fksolver1,jacsolver1);
399 FkPosAndJacLocal(chain2,fksolver2,jacsolver2);
402 FkPosAndJacLocal(chain3,fksolver3,jacsolver3);
405 FkPosAndJacLocal(chain4,fksolver4,jacsolver4);
412 FkVelAndJacLocal(chain1,fksolver1,jacsolver1);
415 FkVelAndJacLocal(chain2,fksolver2,jacsolver2);
418 FkVelAndJacLocal(chain3,fksolver3,jacsolver3);
421 FkVelAndJacLocal(chain4,fksolver4,jacsolver4);
432 FkVelAndIkVelLocal(chain1,fksolver1,iksolver1);
434 FkVelAndIkVelLocal(chain1,fksolver1,iksolver_pinv_givens1);
442 FkVelAndIkVelLocal(chain2,fksolver2,iksolver2);
444 FkVelAndIkVelLocal(chain2,fksolver2,iksolver_pinv_givens2);
452 FkVelAndIkVelLocal(chain3,fksolver3,iksolver3);
454 FkVelAndIkVelLocal(chain3,fksolver3,iksolver_pinv_givens3);
462 FkVelAndIkVelLocal(chain4,fksolver4,iksolver4);
464 FkVelAndIkVelLocal(chain4,fksolver4,iksolver_pinv_givens4);
477 FkPosAndIkPosLocal(chain1,fksolver1,iksolver1);
479 FkPosAndIkPosLocal(chain1,fksolver1,iksolver1_givens);
489 FkPosAndIkPosLocal(chain2,fksolver2,iksolver2);
491 FkPosAndIkPosLocal(chain2,fksolver2,iksolver2_givens);
501 FkPosAndIkPosLocal(chain3,fksolver3,iksolver3);
503 FkPosAndIkPosLocal(chain3,fksolver3,iksolver3_givens);
513 FkPosAndIkPosLocal(chain4,fksolver4,iksolver4);
515 FkPosAndIkPosLocal(chain4,fksolver4,iksolver4_givens);
520 unsigned int maxiter = 30;
522 int maxiter_vel = 30;
523 double eps_vel = 0.1 ;
524 Frame F, dF, F_des,F_solved;
532 unsigned int nj = motomansia10.getNrOfJoints();
549 CPPUNIT_ASSERT_EQUAL(0, fksolver.
JntToCart(q,F));
553 iksolver1.
CartToJnt(q, F_des, q_solved));
556 CPPUNIT_ASSERT_EQUAL((
unsigned int)1,
559 CPPUNIT_ASSERT_EQUAL(0, fksolver.
JntToCart(q_solved,F_solved));
561 CPPUNIT_ASSERT_EQUAL(F_des,F_solved);
576 CPPUNIT_ASSERT_EQUAL(0, fksolver.
JntToCart(q,F));
583 CPPUNIT_ASSERT_EQUAL((
unsigned int)2,
604 CPPUNIT_ASSERT_EQUAL(0, fksolver.
JntToCart(q,F));
611 CPPUNIT_ASSERT_EQUAL((
unsigned int)1,
634 CPPUNIT_ASSERT_EQUAL((
unsigned int)3,
643 double lambda = 0.1 ;
649 unsigned int nj = motomansia10.getNrOfJoints();
670 std::cout<<
"smallest singular value is below threshold (lambda is scaled)"<<
std::endl;
702 double deltaq = 1E-4;
716 for (
unsigned int i=0; i< q.
rows() ; i++)
728 Vector(jac(3,i),jac(4,i),jac(5,i)));
731 CPPUNIT_ASSERT_EQUAL(Jcol1,Jcol2);
754 CPPUNIT_ASSERT_EQUAL(cart.
deriv(),t);
777 qvel.
deriv()=qdot_solved;
780 CPPUNIT_ASSERT(
Equal(qvel.
qdot,qdot_solved,1e-5));
813 q_init(i)=q(i)+0.1*tmp;
817 ik_ret = iksolverpos.
CartToJnt(q_init,F1,q_solved);
824 CPPUNIT_ASSERT_EQUAL(F1,F2);
854 int solver_return = 0;
857 unsigned int nj = kukaLWR.getNrOfJoints();
858 unsigned int ns = kukaLWR.getNrOfSegments();
862 CPPUNIT_ASSERT(
Equal(nj, ns));
903 f_ext[ns - 1] = f_tool;
913 int number_of_constraints = 6;
916 Jacobian alpha_unit_force(number_of_constraints);
919 Twist unit_force_x_l(
922 alpha_unit_force.
setColumn(0, unit_force_x_l);
924 Twist unit_force_y_l(
927 alpha_unit_force.
setColumn(1, unit_force_y_l);
929 Twist unit_force_z_l(
932 alpha_unit_force.
setColumn(2, unit_force_z_l);
934 Twist unit_force_x_a(
937 alpha_unit_force.
setColumn(3, unit_force_x_a);
939 Twist unit_force_y_a(
942 alpha_unit_force.
setColumn(4, unit_force_y_a);
944 Twist unit_force_z_a(
947 alpha_unit_force.
setColumn(5, unit_force_z_a);
950 JntArray beta_energy(number_of_constraints);
951 beta_energy(0) = -0.5;
952 beta_energy(1) = -0.5;
953 beta_energy(2) = 0.0;
954 beta_energy(3) = 0.0;
955 beta_energy(4) = 0.0;
956 beta_energy(5) = 0.2;
963 solver_return = vereshchaginSolver.
CartToJnt(q, qd, qdd, alpha_unit_force, beta_energy, f_ext, ff_tau, constraint_tau);
964 if (solver_return < 0)
std::cout <<
"KDL: Vereshchagin solver ERROR: " << solver_return <<
std::endl;
974 CPPUNIT_ASSERT(
Equal(beta_energy(0), xDotdot[ns].vel(0), eps));
975 CPPUNIT_ASSERT(
Equal(beta_energy(1), xDotdot[ns].vel(1), eps));
976 CPPUNIT_ASSERT(
Equal(beta_energy(2), xDotdot[ns].vel(2), eps));
977 CPPUNIT_ASSERT(
Equal(beta_energy(5), xDotdot[ns].rot(2), eps));
981 Eigen::VectorXd nu(number_of_constraints);
983 CPPUNIT_ASSERT(
Equal(nu(0), 669693.30355, eps));
984 CPPUNIT_ASSERT(
Equal(nu(1), 5930.60826, eps));
985 CPPUNIT_ASSERT(
Equal(nu(2), -639.5238, eps));
986 CPPUNIT_ASSERT(
Equal(nu(3), 0.000, eps));
987 CPPUNIT_ASSERT(
Equal(nu(4), 0.000, eps));
988 CPPUNIT_ASSERT(
Equal(nu(5), 573.90485, eps));
993 CPPUNIT_ASSERT(
Equal(total_tau(0), 2013.3541, eps));
994 CPPUNIT_ASSERT(
Equal(total_tau(1), -6073.4999, eps));
995 CPPUNIT_ASSERT(
Equal(total_tau(2), 2227.4487, eps));
996 CPPUNIT_ASSERT(
Equal(total_tau(3), 56.87456, eps));
997 CPPUNIT_ASSERT(
Equal(total_tau(4), -11.3789, eps));
998 CPPUNIT_ASSERT(
Equal(total_tau(5), -6.05957, eps));
999 CPPUNIT_ASSERT(
Equal(total_tau(6), 569.0776, eps));
1004 Vector constrainXLinear(1.0, 0.0, 0.0);
1005 Vector constrainXAngular(0.0, 0.0, 0.0);
1006 Vector constrainYLinear(0.0, 0.0, 0.0);
1007 Vector constrainYAngular(0.0, 0.0, 0.0);
1010 Twist constraintForcesX(constrainXLinear, constrainXAngular);
1011 Twist constraintForcesY(constrainYLinear, constrainYAngular);
1025 Vector linearAcc(0.0, 10, 0.0);
1026 Vector angularAcc(0.0, 0.0, 0.0);
1027 Twist twist1(linearAcc, angularAcc);
1030 Vector externalForce1(0.0, 0.0, 0.0);
1031 Vector externalTorque1(0.0, 0.0, 0.0);
1032 Vector externalForce2(0.0, 0.0, 0.0);
1033 Vector externalTorque2(0.0, 0.0, 0.0);
1034 Wrench externalNetForce1(externalForce1, externalTorque1);
1035 Wrench externalNetForce2(externalForce2, externalTorque2);
1037 externalNetForce.
push_back(externalNetForce1);
1038 externalNetForce.
push_back(externalNetForce2);
1045 int numberOfConstraints = 1;
1058 JntArray jointConstraintTorques[k];
1059 for (
int i = 0; i < k; i++)
1061 JntArray jointValues(chaindyn.getNrOfJoints());
1062 jointPoses[i] = jointValues;
1063 jointRates[i] = jointValues;
1064 jointAccelerations[i] = jointValues;
1065 jointFFTorques[i] = jointValues;
1066 jointConstraintTorques[i] = jointValues;
1070 JntArray jointInitialPose(chaindyn.getNrOfJoints());
1071 jointInitialPose(0) = 0.0;
1072 jointInitialPose(1) =
PI/6.0;
1077 jointPoses[0](0) = jointInitialPose(0);
1078 jointPoses[0](1) = jointInitialPose(1);
1087 double taskTimeConstant = 0.1;
1088 double simulationTime = 1*taskTimeConstant;
1089 double timeDelta = 0.01;
1091 const std::string msg =
"Assertion failed, check matrix and array sizes";
1093 for (
double t = 0.0; t <=simulationTime; t = t + timeDelta)
1095 CPPUNIT_ASSERT_EQUAL((
int)
SolverI::E_NOERROR, constraintSolver.
CartToJnt(jointPoses[0], jointRates[0], jointAccelerations[0], alpha, betha, externalNetForce, jointFFTorques[0], jointConstraintTorques[0]));
1098 jointRates[0](0) = jointRates[0](0) + jointAccelerations[0](0) * timeDelta;
1099 jointPoses[0](0) = jointPoses[0](0) + (jointRates[0](0) - jointAccelerations[0](0) * timeDelta / 2.0) * timeDelta;
1100 jointRates[0](1) = jointRates[0](1) + jointAccelerations[0](1) * timeDelta;
1101 jointPoses[0](1) = jointPoses[0](1) + (jointRates[0](1) - jointAccelerations[0](1) * timeDelta / 2.0) * timeDelta;
1102 jointFFTorques[0] = jointConstraintTorques[0];
1104 printf(
"%f %f %f %f %f %f %f %f %f\n", t, jointPoses[0](0), jointPoses[0](1), jointRates[0](0), jointRates[0](1), jointAccelerations[0](0), jointAccelerations[0](1), jointConstraintTorques[0](0), jointConstraintTorques[0](1));
1113 JntArray q(chain1.getNrOfJoints());
1114 JntArray qdot(chain1.getNrOfJoints());
1116 for(
unsigned int i=0; i<chain1.getNrOfJoints(); i++)
1125 CPPUNIT_ASSERT(
Equal(v_out[chain1.getNrOfSegments()-1],f_out,1e-5));
1133 JntArray q(chain1.getNrOfJoints());
1134 JntArray qdot(chain1.getNrOfJoints());
1136 for(
unsigned int i=0; i<chain1.getNrOfJoints(); i++)
1146 CPPUNIT_ASSERT(
Equal(v_out[chain1.getNrOfSegments()-1],f_out,1e-5));
1160 Vector gravity(0.0, 0.0, -9.81);
1163 unsigned int nj = motomansia10dyn.getNrOfJoints();
1164 unsigned int ns = motomansia10dyn.getNrOfSegments();
1192 CPPUNIT_ASSERT(
Equal(-0.547, f_out.
p(0), eps));
1193 CPPUNIT_ASSERT(
Equal(-0.301, f_out.
p(1), eps));
1194 CPPUNIT_ASSERT(
Equal(0.924, f_out.
p(2), eps));
1195 CPPUNIT_ASSERT(
Equal(0.503, f_out.
M(0,0), eps));
1196 CPPUNIT_ASSERT(
Equal(0.286, f_out.
M(0,1), eps));
1197 CPPUNIT_ASSERT(
Equal(-0.816, f_out.
M(0,2), eps));
1198 CPPUNIT_ASSERT(
Equal(-0.859, f_out.
M(1,0), eps));
1199 CPPUNIT_ASSERT(
Equal(0.269, f_out.
M(1,1), eps));
1200 CPPUNIT_ASSERT(
Equal(-0.436, f_out.
M(1,2), eps));
1201 CPPUNIT_ASSERT(
Equal(0.095, f_out.
M(2,0), eps));
1202 CPPUNIT_ASSERT(
Equal(0.920, f_out.
M(2,1), eps));
1203 CPPUNIT_ASSERT(
Equal(0.381, f_out.
M(2,2), eps));
1210 {{0.301,-0.553,0.185,0.019,0.007,-0.086,0.},
1211 {-0.547,-0.112,-0.139,-0.376,-0.037,0.063,0.},
1212 {0.,-0.596,0.105,-0.342,-0.026,-0.113,0.},
1213 {0.,0.199,-0.553,0.788,-0.615,0.162,-0.816},
1214 {0.,-0.980,-0.112,-0.392,-0.536,-0.803,-0.436},
1215 {1.,0.,0.825,0.475,0.578,-0.573,0.381}};
1216 for (
unsigned int i=0; i<6; i++ ) {
1217 for (
unsigned int j=0; j<nj; j++ ) {
1218 CPPUNIT_ASSERT(
Equal(jac(i,j), Jac[i][j], eps));
1225 JntSpaceInertiaMatrix H(nj), Heff(nj);
1230 CPPUNIT_ASSERT(
Equal(0.000, taugrav(0), eps));
1231 CPPUNIT_ASSERT(
Equal(-36.672, taugrav(1), eps));
1232 CPPUNIT_ASSERT(
Equal(4.315, taugrav(2), eps));
1233 CPPUNIT_ASSERT(
Equal(-11.205, taugrav(3), eps));
1234 CPPUNIT_ASSERT(
Equal(0.757, taugrav(4), eps));
1235 CPPUNIT_ASSERT(
Equal(1.780, taugrav(5), eps));
1236 CPPUNIT_ASSERT(
Equal(0.000, taugrav(6), eps));
1240 CPPUNIT_ASSERT(
Equal(-15.523, taucor(0), eps));
1241 CPPUNIT_ASSERT(
Equal(24.250, taucor(1), eps));
1242 CPPUNIT_ASSERT(
Equal(-6.862, taucor(2), eps));
1243 CPPUNIT_ASSERT(
Equal(6.303, taucor(3), eps));
1244 CPPUNIT_ASSERT(
Equal(0.110, taucor(4), eps));
1245 CPPUNIT_ASSERT(
Equal(-4.898, taucor(5), eps));
1246 CPPUNIT_ASSERT(
Equal(-0.249, taucor(6), eps));
1251 {{6.8687,-0.4333,0.4599,0.6892,0.0638,-0.0054,0.0381},
1252 {-0.4333,8.8324,-0.5922,0.7905,0.0003,-0.0242,0.0265},
1253 {0.4599,-0.5922,3.3496,-0.0253,0.1150,-0.0243,0.0814},
1254 {0.6892,0.7905,-0.0253,3.9623,-0.0201,0.0087,-0.0291},
1255 {0.0638,0.0003,0.1150,-0.0201,1.1234,0.0029,0.0955},
1256 {-0.0054,-0.0242,-0.0243,0.0087,0.0029,1.1425,0},
1257 {0.0381,0.0265,0.0814,-0.0291,0.0955,0,1.1000}};
1258 for (
unsigned int i=0; i<nj; i++ ) {
1259 for (
unsigned int j=0; j<nj; j++ ) {
1260 CPPUNIT_ASSERT(
Equal(H(i,j), Hexp[i][j], eps));
1278 for(
unsigned int i=0;i<ns;i++){
1286 IdSolver.
CartToJnt(q, qd, jntarraynull, f_ext, Tnoninertial);
1287 CPPUNIT_ASSERT(
Equal(-21.252, Tnoninertial(0), eps));
1288 CPPUNIT_ASSERT(
Equal(-37.933, Tnoninertial(1), eps));
1289 CPPUNIT_ASSERT(
Equal(-2.497, Tnoninertial(2), eps));
1290 CPPUNIT_ASSERT(
Equal(-15.289, Tnoninertial(3), eps));
1291 CPPUNIT_ASSERT(
Equal(-4.646, Tnoninertial(4), eps));
1292 CPPUNIT_ASSERT(
Equal(-9.201, Tnoninertial(5), eps));
1293 CPPUNIT_ASSERT(
Equal(-5.249, Tnoninertial(6), eps));
1296 Eigen::MatrixXd H_eig(nj,nj), L(nj,nj);
1297 Eigen::VectorXd Tnon_eig(nj), D(nj), r(nj), acc_eig(nj);
1298 for(
unsigned int i=0;i<nj;i++){
1299 Tnon_eig(i) = -Tnoninertial(i);
1300 for(
unsigned int j=0;j<nj;j++){
1301 H_eig(i,j) = H(i,j);
1305 for(
unsigned int i=0;i<nj;i++){
1306 qdd(i) = acc_eig(i);
1308 CPPUNIT_ASSERT(
Equal(2.998, qdd(0), eps));
1309 CPPUNIT_ASSERT(
Equal(4.289, qdd(1), eps));
1310 CPPUNIT_ASSERT(
Equal(0.946, qdd(2), eps));
1311 CPPUNIT_ASSERT(
Equal(2.518, qdd(3), eps));
1312 CPPUNIT_ASSERT(
Equal(3.530, qdd(4), eps));
1313 CPPUNIT_ASSERT(
Equal(8.150, qdd(5), eps));
1314 CPPUNIT_ASSERT(
Equal(4.254, qdd(6), eps));
1327 Vector gravity(0.0, 0.0, -9.81);
1330 unsigned int nj = motomansia10dyn.getNrOfJoints();
1331 unsigned int ns = motomansia10dyn.getNrOfSegments();
1370 for(
unsigned int i=0;i<ns;i++){
1376 ret = FdSolver.
CartToJnt(q, qd, tau, f_ext, qdd);
1378 CPPUNIT_ASSERT(
Equal(9.486, qdd(0), eps));
1379 CPPUNIT_ASSERT(
Equal(1.830, qdd(1), eps));
1380 CPPUNIT_ASSERT(
Equal(4.726, qdd(2), eps));
1381 CPPUNIT_ASSERT(
Equal(11.665, qdd(3), eps));
1382 CPPUNIT_ASSERT(
Equal(-50.108, qdd(4), eps));
1383 CPPUNIT_ASSERT(
Equal(21.403, qdd(5), eps));
1384 CPPUNIT_ASSERT(
Equal(-0.381, qdd(6), eps));
1389 IdSolver.
CartToJnt(q, qd, qdd, f_ext, torque);
1390 for (
unsigned int i=0; i<nj; i++ )
1392 CPPUNIT_ASSERT(
Equal(torque(i), tau(i), eps));
1405 Eigen::MatrixXd A(3,3), Aout(3,3);
1406 Eigen::VectorXd b(3);
1407 Eigen::MatrixXd L(3,3), Lout(3,3);
1408 Eigen::VectorXd d(3), dout(3);
1409 Eigen::VectorXd x(3), xout(3);
1410 Eigen::VectorXd r(3);
1411 Eigen::MatrixXd Dout(3,3);
1427 for(
int i=0;i<3;i++){
1428 for(
int j=0;j<3;j++){
1429 CPPUNIT_ASSERT(
Equal(L(i,j), Lout(i,j), eps));
1434 for(
int i=0;i<3;i++){
1435 Dout(i,i) = dout(i);
1439 for(
int i=0;i<3;i++){
1440 CPPUNIT_ASSERT(
Equal(xout(i), x(i), eps));
1444 Aout = Lout * Dout * Lout.transpose();
1445 for(
int i=0;i<3;i++){
1446 for(
int j=0;j<3;j++){
1447 CPPUNIT_ASSERT(
Equal(A(i,j), Aout(i,j), eps));
1459 Frame end_effector_pose;
1465 std::cout <<
"KDL FD (inverse-inertia version) and Vereshchagin Solvers Consistency Test for KUKA LWR 4 robot" <<
std::endl;
1469 unsigned int nj = kukaLWR.getNrOfJoints();
1470 unsigned int ns = kukaLWR.getNrOfSegments();
1474 CPPUNIT_ASSERT(
Equal(nj, ns));
1514 for(
unsigned int i=0 ;i<ns; i++)
1516 f_ext[ns - 1] = f_tool;
1520 Vector gravity(0.0, 0.0, -9.81);
1524 ret = FdSolver.
CartToJnt(q, qd, ff_tau, f_ext, qdd);
1535 int numberOfConstraints = 6;
1536 Jacobian alpha(numberOfConstraints);
1540 JntArray beta(numberOfConstraints);
1545 Vector linearAcc(0.0, 0.0, 9.81);
Vector angularAcc(0.0, 0.0, 0.0);
1546 Twist root_Acc(linearAcc, angularAcc);
1554 fksolverpos.
JntToCart(q, end_effector_pose, kukaLWR.getNrOfSegments());
1555 f_ext[ns - 1] = end_effector_pose.
M * f_tool;
1558 ret = constraintSolver.
CartToJnt(q, qd, q_dd_Ver, alpha, beta, f_ext, ff_tau, constraint_tau);
1564 CPPUNIT_ASSERT(
Equal(q_dd_Ver(0), qdd(0), eps));
1565 CPPUNIT_ASSERT(
Equal(q_dd_Ver(1), qdd(1), eps));
1566 CPPUNIT_ASSERT(
Equal(q_dd_Ver(2), qdd(2), eps));
1567 CPPUNIT_ASSERT(
Equal(q_dd_Ver(3), qdd(3), eps));
1568 CPPUNIT_ASSERT(
Equal(q_dd_Ver(4), qdd(4), eps));
1569 CPPUNIT_ASSERT(
Equal(q_dd_Ver(5), qdd(5), eps));
1570 CPPUNIT_ASSERT(
Equal(q_dd_Ver(6), qdd(6), eps));
1593 double eps_wrench = 0.5, eps_torque = 0.3;
1595 unsigned int nj = kukaLWR.getNrOfJoints();
1596 unsigned int ns = kukaLWR.getNrOfSegments();
1597 CPPUNIT_ASSERT(
Equal(nj, ns));
1613 Frame end_effector_pose;
1614 Frame desired_end_eff_pose;
1618 Eigen::Matrix<double, 6, 1> end_eff_force;
1619 Eigen::Matrix<double, 6, 1> end_eff_pos_error;
1620 Eigen::Matrix<double, 6, 1> end_eff_vel_error;
1623 Vector linearAcc(0.0, 0.0, -9.81);
Vector angularAcc(0.0, 0.0, 0.0);
1634 int numberOfConstraints = 6;
1635 Jacobian alpha(numberOfConstraints);
1636 JntArray beta(numberOfConstraints);
1639 Twist vereshchagin_root_Acc(-linearAcc, angularAcc);
1643 double sample_frequency = 1000.0;
1644 double estimation_gain = 45.0;
1645 double filter_constant = 0.5;
1690 wrench_reference.
push_back(
Wrench(
Vector(dis_force(gen), dis_force(gen), dis_force(gen)),
Vector(dis_moment(gen), 0.0, dis_moment(gen))));
1697 double k_p = 1500.0;
1703 double k_p_rot = 100.0;
1704 double k_d_rot = 20.0;
1708 double k_d_jnt = 5.0;
1711 double simulationTime = 0.4;
1712 double timeDelta = 1.0 / sample_frequency;
1715 for (
unsigned int i = 0; i < jnt_pos.
size(); i++)
1719 qd(0) = dis_jnt_vel(gen);
1720 qd(1) = dis_jnt_vel(gen);
1721 qd(2) = dis_jnt_vel(gen);
1722 qd(3) = dis_jnt_vel(gen);
1723 qd(4) = dis_jnt_vel(gen);
1724 qd(5) = dis_jnt_vel(gen);
1725 qd(6) = dis_jnt_vel(gen);
1727 end_eff_force.setZero();
1728 end_eff_pos_error.setZero();
1729 end_eff_vel_error.setZero();
1730 f_ext_base = f_ext_zero;
1737 fksolverpos.
JntToCart(q, end_effector_pose);
1738 desired_end_eff_pose.
p(0) = end_effector_pose.
p(0) + 0.02;
1739 desired_end_eff_pose.
p(1) = end_effector_pose.
p(1) + 0.02;
1740 desired_end_eff_pose.
p(2) = end_effector_pose.
p(2) + 0.02;
1741 desired_end_eff_pose.
M = end_effector_pose.
M;
1742 desired_end_eff_twist.
p.
v(0) = 0.0;
1743 desired_end_eff_twist.
p.
v(1) = 0.0;
1744 desired_end_eff_twist.
p.
v(2) = 0.0;
1746 for (
double t = 0.0; t <= simulationTime; t = t + timeDelta)
1748 ret = jacobian_solver.
JntToJac(q, jacobian_end_eff);
1755 ret = fksolverpos.
JntToCart(q, end_effector_pose);
1762 jnt_position_velocity.
q = q;
1763 jnt_position_velocity.
qdot = qd;
1764 ret = fksolvervel.
JntToCart(jnt_position_velocity, end_eff_twist);
1771 end_eff_pos_error(0) = end_effector_pose.
p(0) - desired_end_eff_pose.
p(0);
1772 end_eff_pos_error(1) = end_effector_pose.
p(1) - desired_end_eff_pose.
p(1);
1773 end_eff_pos_error(2) = end_effector_pose.
p(2) - desired_end_eff_pose.
p(2);
1775 end_eff_vel_error(0) = end_eff_twist.
p.
v(0) - desired_end_eff_twist.
p.
v(0);
1776 end_eff_vel_error(1) = end_eff_twist.
p.
v(1) - desired_end_eff_twist.
p.
v(1);
1777 end_eff_vel_error(2) = end_eff_twist.
p.
v(2) - desired_end_eff_twist.
p.
v(2);
1779 const Vector rot_error =
diff(end_effector_pose.
M, desired_end_eff_pose.
M);
1780 end_eff_pos_error(3) = -rot_error(0);
1781 end_eff_pos_error(4) = -rot_error(1);
1782 end_eff_pos_error(5) = -rot_error(2);
1784 end_eff_vel_error(3) = end_eff_twist.
M.
w(0);
1785 end_eff_vel_error(4) = end_eff_twist.
M.
w(1);
1786 end_eff_vel_error(5) = end_eff_twist.
M.
w(2);
1788 end_eff_force = -end_eff_pos_error * k_p - end_eff_vel_error * k_d;
1789 end_eff_force(3) = -end_eff_pos_error(3) * k_p_rot - end_eff_vel_error(3) * k_d_rot;
1790 end_eff_force(4) = -end_eff_pos_error(4) * k_p_rot - end_eff_vel_error(4) * k_d_rot;
1791 end_eff_force(5) = -end_eff_pos_error(5) * k_p_rot - end_eff_vel_error(5) * k_d_rot;
1794 ret = IdSolver.
CartToJnt(q, jnt_array_zero, jnt_array_zero, f_ext_zero, gravity_torque);
1802 command_torque.
data = jacobian_end_eff.
data.transpose() * end_eff_force;
1803 command_torque.
data += gravity_torque.
data;
1804 command_torque.
data -= qd.
data * k_d_jnt;
1807 if (t > 0.2) f_ext_base[ns - 1] = end_effector_pose.
M * wrench_reference[i];
1810 ret = constraintSolver.
CartToJnt(q, qd, qdd, alpha, beta, f_ext_base, command_torque, constraint_tau);
1822 for (
unsigned int j = 0; j < nj; j++)
1825 if (q(j) < 0.0) q(j) += 360 *
deg2rad;
1829 extwrench_estimator.
JntToExtWrench(q, qd, command_torque, f_tool_estimated);
1833 Eigen::Matrix<double, 6, 1> wrench;
1834 wrench(0) = f_ext_base[ns - 1](0);
1835 wrench(1) = f_ext_base[ns - 1](1);
1836 wrench(2) = f_ext_base[ns - 1](2);
1837 wrench(3) = f_ext_base[ns - 1](3);
1838 wrench(4) = f_ext_base[ns - 1](4);
1839 wrench(5) = f_ext_base[ns - 1](5);
1840 ext_torque_reference.
data = jacobian_end_eff.
data.transpose() * wrench;
1848 CPPUNIT_ASSERT(
Equal(f_tool_estimated(0), wrench_reference[i](0), eps_wrench));
1849 CPPUNIT_ASSERT(
Equal(f_tool_estimated(1), wrench_reference[i](1), eps_wrench));
1850 CPPUNIT_ASSERT(
Equal(f_tool_estimated(2), wrench_reference[i](2), eps_wrench));
1851 CPPUNIT_ASSERT(
Equal(f_tool_estimated(3), wrench_reference[i](3), eps_wrench));
1852 CPPUNIT_ASSERT(
Equal(f_tool_estimated(4), wrench_reference[i](4), eps_wrench));
1853 CPPUNIT_ASSERT(
Equal(f_tool_estimated(5), wrench_reference[i](5), eps_wrench));
1855 CPPUNIT_ASSERT(
Equal(ext_torque_estimated(0), ext_torque_reference(0), eps_torque));
1856 CPPUNIT_ASSERT(
Equal(ext_torque_estimated(1), ext_torque_reference(1), eps_torque));
1857 CPPUNIT_ASSERT(
Equal(ext_torque_estimated(2), ext_torque_reference(2), eps_torque));
1858 CPPUNIT_ASSERT(
Equal(ext_torque_estimated(3), ext_torque_reference(3), eps_torque));
1859 CPPUNIT_ASSERT(
Equal(ext_torque_estimated(4), ext_torque_reference(4), eps_torque));
1860 CPPUNIT_ASSERT(
Equal(ext_torque_estimated(5), ext_torque_reference(5), eps_torque));
1861 CPPUNIT_ASSERT(
Equal(ext_torque_estimated(6), ext_torque_reference(6), eps_torque));