10 #include <boost/test/unit_test.hpp>
11 #include <boost/utility/binary.hpp>
15 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
22 std::vector<Eigen::VectorXd>
qs(2);
23 std::vector<Eigen::VectorXd> qdots(2);
24 std::vector<Eigen::VectorXd> results(2);
29 qs[0] = Eigen::VectorXd::Ones(
model.nq);
32 qdots[0] = Eigen::VectorXd::Zero(
model.nv);
37 "integration of full body with zero velocity - wrong results");
46 model, -1 * Eigen::VectorXd::Ones(
model.nq), Eigen::VectorXd::Ones(
model.nq)));
48 model, -1 * Eigen::VectorXd::Ones(
model.nq), Eigen::VectorXd::Ones(
model.nq)));
62 std::vector<Eigen::VectorXd>
qs(2);
63 std::vector<Eigen::VectorXd> vs(2);
64 std::vector<Eigen::MatrixXd> results(2, Eigen::MatrixXd::Zero(
model.nv,
model.nv));
65 std::vector<Eigen::MatrixXd> results_fd(2, Eigen::MatrixXd::Zero(
model.nv,
model.nv));
67 qs[0] = Eigen::VectorXd::Ones(
model.nq);
70 vs[0] = Eigen::VectorXd::Zero(
model.nv);
71 vs[1] = Eigen::VectorXd::Ones(
model.nv);
74 Eigen::VectorXd q_fd(
model.nq), v_fd(
model.nv);
76 const double eps = 1e-8;
77 for (Eigen::DenseIndex k = 0; k <
model.nv; ++k)
84 BOOST_CHECK(results[0].isIdentity(sqrt(
eps)));
85 BOOST_CHECK(results[0].
isApprox(results_fd[0], sqrt(
eps)));
88 BOOST_CHECK(results[1].
isApprox(results[0]));
91 Eigen::VectorXd q_fd_intermediate(
model.nq);
93 for (Eigen::DenseIndex k = 0; k <
model.nv; ++k)
102 BOOST_CHECK(results[0].
isApprox(results_fd[0], sqrt(
eps)));
106 for (Eigen::DenseIndex k = 0; k <
model.nv; ++k)
114 BOOST_CHECK(results[1].
isApprox(results_fd[1], sqrt(
eps)));
122 std::vector<Eigen::VectorXd>
qs(2);
123 std::vector<Eigen::VectorXd> vs(2);
124 std::vector<Eigen::MatrixXd> results(2, Eigen::MatrixXd::Zero(
model.nv,
model.nv));
125 std::vector<Eigen::MatrixXd> results_fd(2, Eigen::MatrixXd::Zero(
model.nv,
model.nv));
127 qs[0] = Eigen::VectorXd::Random(
model.nq);
129 const Eigen::VectorXd &
q0 =
qs[0];
130 qs[1] = Eigen::VectorXd::Random(
model.nq);
132 const Eigen::VectorXd &
q1 =
qs[1];
134 vs[0] = Eigen::VectorXd::Zero(
model.nv);
135 vs[1] = Eigen::VectorXd::Ones(
model.nv);
138 Eigen::VectorXd q_fd(
model.nq), v_fd(
model.nv);
140 const double eps = 1e-8;
142 for (Eigen::DenseIndex k = 0; k <
model.nv; ++k)
149 BOOST_CHECK(results[0].
isApprox(results_fd[0], sqrt(
eps)));
152 BOOST_CHECK((-results[0]).isIdentity());
155 BOOST_CHECK(results[1].isIdentity());
158 for (Eigen::DenseIndex k = 0; k <
model.nv; ++k)
165 BOOST_CHECK(results[1].
isApprox(results_fd[1], sqrt(
eps)));
173 std::vector<Eigen::VectorXd>
qs(2);
174 std::vector<Eigen::VectorXd> vs(2);
175 std::vector<Eigen::MatrixXd> results(2, Eigen::MatrixXd::Zero(
model.nv,
model.nv));
176 std::vector<Eigen::MatrixXd> results_fd(2, Eigen::MatrixXd::Zero(
model.nv,
model.nv));
178 Eigen::VectorXd
q0 = Eigen::VectorXd::Random(
model.nq);
181 Eigen::VectorXd
v = Eigen::VectorXd::Random(
model.nv);
185 BOOST_CHECK(v_diff.isApprox(
v));
187 Eigen::MatrixXd J_int_dq = Eigen::MatrixXd::Zero(
model.nv,
model.nv);
188 Eigen::MatrixXd J_int_dv = Eigen::MatrixXd::Zero(
model.nv,
model.nv);
192 Eigen::MatrixXd J_diff_dq0 = Eigen::MatrixXd::Zero(
model.nv,
model.nv);
193 Eigen::MatrixXd J_diff_dq1 = Eigen::MatrixXd::Zero(
model.nv,
model.nv);
197 BOOST_CHECK(J_int_dq.isApprox(Eigen::MatrixXd(-(J_int_dv * J_diff_dq0))));
198 BOOST_CHECK(Eigen::MatrixXd(J_int_dv * J_diff_dq1).isIdentity());
206 std::vector<Eigen::MatrixXd> results(3, Eigen::MatrixXd::Zero(
model.nv,
model.nv));
208 Eigen::VectorXd
qs = Eigen::VectorXd::Ones(
model.nq);
211 Eigen::VectorXd vs = Eigen::VectorXd::Random(
model.nv);
216 BOOST_CHECK(results[0].
isApprox(results[1]));
219 results[1] = Eigen::MatrixXd::Random(
model.nv,
model.nv);
220 results[2] = results[1];
221 results[0].setZero();
224 BOOST_CHECK(results[1].
isApprox(results[2] + results[0]));
227 results[1] = Eigen::MatrixXd::Random(
model.nv,
model.nv);
228 results[2] = results[1];
229 results[0].setZero();
232 BOOST_CHECK(results[1].
isApprox(results[2] - results[0]));
235 results[0].setZero();
236 results[1].setZero();
239 BOOST_CHECK(results[0].
isApprox(results[1]));
242 results[1] = Eigen::MatrixXd::Random(
model.nv,
model.nv);
243 results[2] = results[1];
244 results[0].setZero();
247 BOOST_CHECK(results[1].
isApprox(results[2] + results[0]));
250 results[1] = Eigen::MatrixXd::Random(
model.nv,
model.nv);
251 results[2] = results[1];
252 results[0].setZero();
255 BOOST_CHECK(results[1].
isApprox(results[2] - results[0]));
258 std::vector<Eigen::MatrixXd>
J(2, Eigen::MatrixXd::Zero(
model.nv, 2 *
model.nv));
259 J[0] = Eigen::MatrixXd::Random(
model.nv, 2 *
model.nv);
260 results[0].setZero();
263 BOOST_CHECK(
J[1].
isApprox(results[0] *
J[0]));
265 J[0] = Eigen::MatrixXd::Random(
model.nv, 2 *
model.nv);
266 results[0].setZero();
269 BOOST_CHECK(
J[1].
isApprox(results[0] *
J[0]));
272 J[1] = Eigen::MatrixXd::Random(
model.nv, 2 *
model.nv);
274 results[0].setZero();
277 BOOST_CHECK(
J[1].
isApprox(results[0] *
J[0]));
279 J[1] = Eigen::MatrixXd::Random(
model.nv, 2 *
model.nv);
281 results[0].setZero();
284 BOOST_CHECK(
J[1].
isApprox(results[0] *
J[0]));
293 model, -1 * Eigen::VectorXd::Ones(
model.nq), Eigen::VectorXd::Ones(
model.nq)));
295 model, -1 * Eigen::VectorXd::Ones(
model.nq), Eigen::VectorXd::Ones(
model.nq)));
296 Eigen::VectorXd qdot(Eigen::VectorXd::Random(
model.nv));
300 "Integrate (difference) - wrong results");
304 "difference (integrate) - wrong results");
312 Eigen::VectorXd expected(
model.nq);
313 expected << 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
317 neutral_config.isApprox(expected, 1e-12),
"neutral configuration - wrong results");
330 BOOST_CHECK_MESSAGE(
dist > 0.,
"distance - wrong results");
340 model, -1 * Eigen::VectorXd::Ones(
model.nq), Eigen::VectorXd::Ones(
model.nq)));
342 model, -1 * Eigen::VectorXd::Ones(
model.nq), Eigen::VectorXd::Ones(
model.nq)));
347 BOOST_CHECK_SMALL(
dist - math::sqrt(squaredDistance_.sum()), 1e-12);
355 model.lowerPositionLimit = -1 * Eigen::VectorXd::Ones(
model.nq);
356 model.upperPositionLimit = Eigen::VectorXd::Ones(
model.nq);
363 " UniformlySample : Generated config not in bounds");
372 Eigen::VectorXd
q(Eigen::VectorXd::Ones(
model.nq));
375 BOOST_CHECK(
q.head<3>().isApprox(Eigen::VectorXd::Ones(3)));
377 fabs(
q.segment<4>(3).norm() - 1)
378 < Eigen::NumTraits<double>::epsilon());
380 fabs(
q.segment<4>(7).norm() - 1)
381 < Eigen::NumTraits<double>::epsilon());
382 const int n =
model.nq - 7 - 4 - 4;
383 BOOST_CHECK(
q.tail(
n).isApprox(Eigen::VectorXd::Ones(
n)));
392 q = Eigen::VectorXd::Ones(
model.nq);
405 model.lowerPositionLimit = -1 * Eigen::VectorXd::Ones(
model.nq);
406 model.upperPositionLimit = Eigen::VectorXd::Ones(
model.nq);
417 Eigen::VectorXd
q(Eigen::VectorXd::Ones(
model.nq));
426 Eigen::VectorXd q_plus;
427 const double eps = 1e-8;
429 Eigen::VectorXd v_eps(Eigen::VectorXd::Zero(
model.nv));
430 for (
int k = 0; k <
model.nv; ++k)
434 jac_fd.col(k) = (q_plus -
q) /
eps;
438 BOOST_CHECK(
jac.isApprox(jac_fd, sqrt(
eps)));
441 BOOST_AUTO_TEST_SUITE_END()