18 #include <boost/test/unit_test.hpp>
19 #include <boost/utility/binary.hpp>
21 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
25 using namespace Eigen;
33 model.lowerPositionLimit.head<3>().
fill(-1.);
34 model.upperPositionLimit.head<3>().
fill(1.);
36 VectorXd
v(VectorXd::Zero(
model.nv));
37 VectorXd
a(VectorXd::Zero(
model.nv));
41 g_partial_dq.setZero();
48 g_partial_dq_fd.setZero();
50 VectorXd v_eps(Eigen::VectorXd::Zero(
model.nv));
51 VectorXd q_plus(
model.nq);
52 VectorXd g_plus(
model.nv);
53 const double alpha = 1e-8;
54 for (
int k = 0; k <
model.nv; ++k)
60 g_partial_dq_fd.col(k) = (g_plus - g0) /
alpha;
69 using namespace Eigen;
77 model.lowerPositionLimit.head<3>().
fill(-1.);
78 model.upperPositionLimit.head<3>().
fill(1.);
82 ForceVector fext((
size_t)
model.njoints);
83 for (ForceVector::iterator it = fext.begin(); it != fext.end(); ++it)
87 MatrixXd static_vec_partial_dq(
model.nv,
model.nv);
88 static_vec_partial_dq.setZero();
94 MatrixXd static_vec_partial_dq_fd(
model.nv,
model.nv);
96 VectorXd v_eps(Eigen::VectorXd::Zero(
model.nv));
97 VectorXd q_plus(
model.nq);
98 VectorXd tau_plus(
model.nv);
99 const double alpha = 1e-8;
100 for (
int k = 0; k <
model.nv; ++k)
106 static_vec_partial_dq_fd.col(k) = (tau_plus - tau0) /
alpha;
110 BOOST_CHECK(static_vec_partial_dq.isApprox(static_vec_partial_dq_fd, sqrt(
alpha)));
115 using namespace Eigen;
120 model.armature = VectorXd::Random(
model.nv) + VectorXd::Ones(
model.nv);
124 model.lowerPositionLimit.head<3>().
fill(-1.);
125 model.upperPositionLimit.head<3>().
fill(1.);
127 VectorXd
v(VectorXd::Random(
model.nv));
128 VectorXd
a(VectorXd::Random(
model.nv));
132 rnea_partial_dq.setZero();
134 rnea_partial_dv.setZero();
136 rnea_partial_da.setZero();
139 rnea_partial_dv, rnea_partial_da);
147 g_partial_dq.setZero();
151 BOOST_CHECK(rnea_partial_dq.isApprox(g_partial_dq));
155 MatrixXd rnea_partial_dq_fd(
model.nv,
model.nv);
156 rnea_partial_dq_fd.setZero();
158 VectorXd v_eps(VectorXd::Zero(
model.nv));
159 VectorXd q_plus(
model.nq);
160 VectorXd tau_plus(
model.nv);
161 const double alpha = 1e-8;
162 for (
int k = 0; k <
model.nv; ++k)
166 tau_plus =
rnea(
model, data_fd, q_plus, VectorXd::Zero(
model.nv), VectorXd::Zero(
model.nv));
168 rnea_partial_dq_fd.col(k) = (tau_plus - tau0) /
alpha;
175 rnea_partial_dq_fd.setZero();
177 for (
int k = 0; k <
model.nv; ++k)
183 rnea_partial_dq_fd.col(k) = (tau_plus - tau0) /
alpha;
187 rnea_partial_dq.setZero();
189 model,
data,
q, VectorXd::Zero(
model.nv),
a, rnea_partial_dq, rnea_partial_dv, rnea_partial_da);
205 model.gravity.setZero();
207 rnea_partial_dq_fd.setZero();
209 for (
int k = 0; k <
model.nv; ++k)
215 rnea_partial_dq_fd.col(k) = (tau_plus - tau0) /
alpha;
220 MatrixXd rnea_partial_dv_fd(
model.nv,
model.nv);
221 rnea_partial_dv_fd.setZero();
223 for (
int k = 0; k <
model.nv; ++k)
228 rnea_partial_dv_fd.col(k) = (tau_plus - tau0) /
alpha;
232 rnea_partial_dq.setZero();
233 rnea_partial_dv.setZero();
235 model,
data,
q,
v, VectorXd::Zero(
model.nv), rnea_partial_dq, rnea_partial_dv, rnea_partial_da);
257 rnea_partial_dq_fd.setZero();
259 for (
int k = 0; k <
model.nv; ++k)
265 rnea_partial_dq_fd.col(k) = (tau_plus - tau0) /
alpha;
269 rnea_partial_dv_fd.setZero();
270 for (
int k = 0; k <
model.nv; ++k)
275 rnea_partial_dv_fd.col(k) = (tau_plus - tau0) /
alpha;
279 rnea_partial_dq.setZero();
280 rnea_partial_dv.setZero();
294 data_ref.
M.triangularView<Eigen::StrictlyLower>() =
295 data_ref.
M.transpose().triangularView<Eigen::StrictlyLower>();
297 rnea_partial_da.triangularView<Eigen::StrictlyLower>() =
298 rnea_partial_da.transpose().triangularView<Eigen::StrictlyLower>();
307 data2.
M.triangularView<Eigen::StrictlyLower>() =
308 data2.
M.transpose().triangularView<Eigen::StrictlyLower>();
317 using namespace Eigen;
326 model.lowerPositionLimit.head<3>().
fill(-1.);
327 model.upperPositionLimit.head<3>().
fill(1.);
329 VectorXd
v(VectorXd::Random(
model.nv));
330 VectorXd
a(VectorXd::Random(
model.nv));
333 ForceVector fext((
size_t)
model.njoints);
334 for (ForceVector::iterator it = fext.begin(); it != fext.end(); ++it)
339 rnea_partial_dq.setZero();
341 rnea_partial_dv.setZero();
343 rnea_partial_da.setZero();
346 model,
data,
q,
v,
a, fext, rnea_partial_dq, rnea_partial_dv, rnea_partial_da);
355 MatrixXd rnea_partial_dq_fd(
model.nv,
model.nv);
356 rnea_partial_dq_fd.setZero();
357 MatrixXd rnea_partial_dv_fd(
model.nv,
model.nv);
358 rnea_partial_dv_fd.setZero();
359 MatrixXd rnea_partial_da_fd(
model.nv,
model.nv);
360 rnea_partial_da_fd.setZero();
362 VectorXd v_eps(VectorXd::Zero(
model.nv));
363 VectorXd q_plus(
model.nq);
364 VectorXd tau_plus(
model.nv);
365 const double eps = 1e-8;
367 const VectorXd tau_ref =
rnea(
model, data_ref,
q,
v,
a, fext);
368 for (
int k = 0; k <
model.nv; ++k)
372 tau_plus =
rnea(
model, data_fd, q_plus,
v,
a, fext);
374 rnea_partial_dq_fd.col(k) = (tau_plus - tau_ref) /
eps;
378 BOOST_CHECK(rnea_partial_dq.isApprox(rnea_partial_dq_fd, sqrt(
eps)));
381 for (
int k = 0; k <
model.nv; ++k)
385 tau_plus =
rnea(
model, data_fd,
q, v_plus,
a, fext);
387 rnea_partial_dv_fd.col(k) = (tau_plus - tau_ref) /
eps;
391 BOOST_CHECK(rnea_partial_dv.isApprox(rnea_partial_dv_fd, sqrt(
eps)));
394 for (
int k = 0; k <
model.nv; ++k)
398 tau_plus =
rnea(
model, data_fd,
q,
v, a_plus, fext);
400 rnea_partial_da_fd.col(k) = (tau_plus - tau_ref) /
eps;
405 rnea_partial_da.triangularView<Eigen::Lower>() =
406 rnea_partial_da.transpose().triangularView<Eigen::Lower>();
407 BOOST_CHECK(rnea_partial_da.isApprox(rnea_partial_da_fd, sqrt(
eps)));
414 data_shortcut.
M.triangularView<Eigen::Lower>() =
415 data_shortcut.
M.transpose().triangularView<Eigen::Lower>();
421 using namespace Eigen;
429 model.lowerPositionLimit.head<3>().
fill(-1.);
430 model.upperPositionLimit.head<3>().
fill(1.);
432 VectorXd
v(VectorXd::Random(
model.nv));
433 VectorXd
a(VectorXd::Random(
model.nv));
437 rnea_partial_dq.setZero();
439 rnea_partial_dv.setZero();
441 rnea_partial_da.setZero();
449 for (
size_t k = 1; k < (size_t)
model.njoints; ++k)
459 using namespace Eigen;
467 model.lowerPositionLimit.head<3>().
fill(-1.);
468 model.upperPositionLimit.head<3>().
fill(1.);
470 VectorXd
v(VectorXd::Random(
model.nv));
471 VectorXd
a(VectorXd::Random(
model.nv));
476 for (
int k = 0; k < 20; ++k)
498 using namespace Eigen;
504 model.lowerPositionLimit.head<3>().
fill(-1.);
505 model.upperPositionLimit.head<3>().
fill(1.);
511 VectorXd
v = VectorXd::Random(
model.nv);
512 VectorXd
tau = VectorXd::Random(
model.nv);
531 BOOST_AUTO_TEST_SUITE_END()