18 #include <boost/test/unit_test.hpp>
19 #include <boost/utility/binary.hpp>
23 template<
typename Jo
intModel>
27 const std::string & parent_name,
28 const std::string &
name,
30 bool setRandomLimits =
true)
33 typedef typename JointModel::ConfigVector_t CV;
34 typedef typename JointModel::TangentVector_t TV;
40 model.getJointId(parent_name), joint, SE3::Random(),
name +
"_joint",
41 TV::Random() + TV::Constant(1), TV::Random() + TV::Constant(1),
42 CV::Random() - CV::Constant(1), CV::Random() + CV::Constant(1));
46 model.addJointFrame(idx);
48 model.appendBodyToJoint(idx, Inertia::Random(), SE3::Identity());
52 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
60 model.lowerPositionLimit.head<3>().
fill(-1.);
61 model.upperPositionLimit.head<3>().
fill(1.);
63 Eigen::VectorXd
v = Eigen::VectorXd::Ones(
model.nv);
66 data_ref.
M.triangularView<Eigen::StrictlyLower>() =
67 data_ref.
M.transpose().triangularView<Eigen::StrictlyLower>();
69 data_ref.Ycrb[0] = data_ref.liMi[1].act(data_ref.Ycrb[1]);
73 data_ref_other.
M.triangularView<Eigen::StrictlyLower>() =
74 data_ref_other.
M.transpose().triangularView<Eigen::StrictlyLower>();
75 BOOST_CHECK(data_ref_other.
M.isApprox(data_ref.
M));
77 pinocchio::SE3 cMo(pinocchio::SE3::Matrix3::Identity(), -data_ref.Ycrb[0].lever());
78 BOOST_CHECK(data_ref.Ycrb[0].isApprox(data_ref_other.oYcrb[0]));
81 BOOST_CHECK(
data.com[0].isApprox(-cMo.translation(), 1e-12));
82 BOOST_CHECK(
data.oYcrb[0].matrix().isApprox(data_ref.Ycrb[0].matrix(), 1e-12));
85 BOOST_CHECK(
data.Ig.matrix().isApprox(Ig_ref.matrix(), 1e-12));
91 cM1.inverse().toActionMatrix().transpose() * data_ref.
M.topRows<6>());
92 BOOST_CHECK(
data.Ag.isApprox(Ag_ref, 1e-12));
102 const Eigen::MatrixXd &
G = mimic_test_case.
G;
109 Eigen::VectorXd
v = Eigen::VectorXd::Random(
model_mimic.nv);
110 Eigen::VectorXd
a = Eigen::VectorXd::Random(
model_mimic.nv);
119 data_ref_mimic.
M.triangularView<Eigen::StrictlyLower>() =
120 data_ref_mimic.
M.transpose().triangularView<Eigen::StrictlyLower>();
122 data_ref_mimic.Ycrb[0] = data_ref_mimic.liMi[1].act(data_ref_mimic.Ycrb[1]);
125 data_ref_other.
M.triangularView<Eigen::StrictlyLower>() =
126 data_ref_other.
M.transpose().triangularView<Eigen::StrictlyLower>();
128 pinocchio::SE3 cMo(pinocchio::SE3::Matrix3::Identity(), -data_ref_mimic.Ycrb[0].lever());
129 BOOST_CHECK(data_ref_mimic.Ycrb[0].isApprox(data_ref_other.oYcrb[0]));
136 BOOST_CHECK(
data_mimic.com[0].isApprox(-cMo.translation(), 1e-12));
137 BOOST_CHECK(
data_mimic.oYcrb[0].matrix().isApprox(data_ref_mimic.Ycrb[0].matrix(), 1e-12));
140 BOOST_CHECK(
data_mimic.Ig.matrix().isApprox(Ig_ref.matrix(), 1e-12));
145 cM1.inverse().toActionMatrix().transpose() * data_ref_other.
M.topRows<6>());
146 BOOST_CHECK(
data_mimic.Ag.isApprox(Ag_ref, 1e-12));
156 model.lowerPositionLimit.head<3>().
fill(-1.);
157 model.upperPositionLimit.head<3>().
fill(1.);
159 Eigen::VectorXd
v = Eigen::VectorXd::Zero(
model.nv);
164 BOOST_CHECK(
data.J.isApprox(data_ref.
J));
165 BOOST_CHECK(
data.Ag.isApprox(data_ref.
Ag));
169 BOOST_CHECK(
data.J.isApprox(data_ref.
J));
180 model.lowerPositionLimit.head<7>().
fill(-1.);
181 model.upperPositionLimit.head<7>().
fill(1.);
185 Eigen::VectorXd
v = Eigen::VectorXd::Random(
model.nv);
186 Eigen::VectorXd
a = Eigen::VectorXd::Random(
model.nv);
188 const Eigen::VectorXd g =
rnea(
model, data_ref,
q, 0 *
v, 0 *
a);
192 data_ref.
M.triangularView<Eigen::StrictlyLower>() =
193 data_ref.
M.transpose().triangularView<Eigen::StrictlyLower>();
195 SE3 cMo(SE3::Identity());
196 data_ref.Ycrb[0] = data_ref.liMi[1].act(data_ref.Ycrb[1]);
197 cMo.translation() = -data_ref.Ycrb[0].lever();
199 SE3 oM1(data_ref.liMi[1]);
201 Data::Matrix6x Ag_ref(cM1.toDualActionMatrix() * data_ref.
M.topRows<6>());
203 Force hdot_ref(cM1.act(
Force(data_ref.
tau.head<6>() - g.head<6>())));
207 BOOST_CHECK(
data.Ag.isApprox(Ag_ref));
208 BOOST_CHECK(
data.Ag.isApprox(data_ref.
Ag));
209 BOOST_CHECK(
data.hg.isApprox(data_ref.
hg));
212 BOOST_CHECK(data_ref.com[0].isApprox(data_ref.Ycrb[0].lever()));
213 BOOST_CHECK(data_ref.vcom[0].isApprox(
data.hg.linear() / data_ref.
M(0, 0)));
214 BOOST_CHECK(data_ref.vcom[0].isApprox(
data.vcom[0]));
215 BOOST_CHECK(data_ref.acom[0].isApprox(hdot_ref.linear() / data_ref.
M(0, 0)));
218 BOOST_CHECK(hdot.isApprox(hdot_ref));
221 BOOST_CHECK(
data.dAg.isZero());
228 const double alpha = 1e-8;
229 Eigen::VectorXd q_plus(
model.nq);
238 for (
size_t i = 1;
i < (size_t)
model.njoints; ++
i)
240 Inertia::Matrix6 dYcrb = (data_ref_plus.oMi[
i].act(data_ref_plus.Ycrb[
i]).matrix()
241 - data_ref.oMi[
i].act(data_ref.Ycrb[
i]).matrix())
243 BOOST_CHECK(
data.doYcrb[
i].isApprox(dYcrb, sqrt(
alpha)));
250 SE3 oMc_ref(SE3::Identity());
251 oMc_ref.translation() = data_ref.com[0];
255 data_ref.oMi[1].toDualActionMatrix() * data_ref.
M.topRows<6>();
257 const double alpha = 1e-8;
258 Eigen::VectorXd q_plus(
model.nq);
261 SE3 oMc_ref_plus(SE3::Identity());
262 oMc_ref_plus.translation() = data_ref.com[0];
263 const Data::Matrix6x Ag_plus_ref = oMc_ref_plus.toDualActionMatrix() * data_ref.
Ag;
266 data_ref.oMi[1].toDualActionMatrix() * data_ref.
M.topRows<6>();
271 SE3 oMc(SE3::Identity());
272 oMc.translation() =
data.com[0];
274 BOOST_CHECK(oMc.isApprox(oMc_ref));
275 BOOST_CHECK(dAg_ref.isApprox(dAg_ref_from_M, sqrt(
alpha)));
284 const double alpha = 1e-8;
285 Eigen::VectorXd q_plus(
model.nq);
292 BOOST_CHECK(
data.dAg.isApprox(dAg_ref, sqrt(
alpha)));
297 std::vector<Data::Matrix6x> dAgdq((
size_t)
model.nv, Data::Matrix6x::Zero(6,
model.nv));
299 Eigen::VectorXd v_fd(Eigen::VectorXd::Zero(
model.nv));
301 SE3 oMc_ref(SE3::Identity());
302 oMc_ref.translation() = data_fd.com[0];
305 const Force hg0 = oMc_ref.act(data_fd.
hg);
309 const double alpha = 1e-8;
310 Eigen::VectorXd q_plus(
model.nq);
312 for (
int k = 0; k <
model.nv; ++k)
317 SE3 oMc_fd(SE3::Identity());
318 oMc_fd.translation() = data_fd.com[0];
319 Ag_fd = oMc_fd.toDualActionMatrix() * data_fd.
Ag;
320 hg_fd = oMc_fd.act(data_fd.
hg);
321 dAgdq[(size_t)k] = (Ag_fd - Ag0) /
alpha;
322 dhdq.col(k) = (hg_fd - hg0).toVector() /
alpha;
328 for (
int k = 0; k <
model.nv; ++k)
330 dAg_ref.col(k) = dAgdq[(size_t)k] *
v;
333 BOOST_CHECK(dhdq.isApprox(dAg_ref, sqrt(
alpha)));
344 model.lowerPositionLimit.head<3>().
fill(-1.);
345 model.upperPositionLimit.head<3>().
fill(1.);
347 Eigen::VectorXd
v = Eigen::VectorXd::Zero(
model.nv);
352 BOOST_CHECK(
data.J.isApprox(data_ref.
J));
353 BOOST_CHECK(
data.dJ.isApprox(data_ref.
dJ));
354 BOOST_CHECK(
data.Ag.isApprox(data_ref.
Ag));
355 BOOST_CHECK(
data.dAg.isApprox(data_ref.
dAg));
359 BOOST_CHECK(
data.J.isApprox(data_ref.
J));
360 BOOST_CHECK(
data.dJ.isApprox(data_ref.
dJ));
371 model.lowerPositionLimit.head<7>().
fill(-1.);
372 model.upperPositionLimit.head<7>().
fill(1.);
376 Eigen::VectorXd
v = Eigen::VectorXd::Random(
model.nv);
377 Eigen::VectorXd
a = Eigen::VectorXd::Random(
model.nv);
384 BOOST_CHECK(
data.mass[0] == data_ref.
mass[0]);
385 BOOST_CHECK(
data.com[0].isApprox(data_ref.com[0]));
386 BOOST_CHECK(
data.hg.isApprox(data_ref.
hg));
387 for (
size_t k = 1; k < (size_t)
model.njoints; ++k)
389 BOOST_CHECK(
data.mass[k] == data_ref.
mass[k]);
390 BOOST_CHECK(
data.com[k].isApprox(data_ref.com[k]));
391 BOOST_CHECK(
data.v[k].isApprox(data_ref.v[k]));
398 BOOST_CHECK(data_fk1.hg.isApprox(
data.hg));
401 model.gravity.setZero();
406 BOOST_CHECK(
data.mass[0] == data_ref.
mass[0]);
407 BOOST_CHECK(
data.com[0].isApprox(data_ref.com[0]));
408 BOOST_CHECK(
data.hg.isApprox(data_ref.
hg));
409 BOOST_CHECK(
data.dhg.isApprox(hgdot));
410 for (
size_t k = 1; k < (size_t)
model.njoints; ++k)
412 BOOST_CHECK(
data.mass[k] == data_ref.
mass[k]);
413 BOOST_CHECK(
data.com[k].isApprox(data_ref.com[k]));
414 BOOST_CHECK(
data.v[k].isApprox(data_ref.v[k]));
415 BOOST_CHECK(
data.a[k].isApprox(data_ref.a_gf[k]));
416 BOOST_CHECK(
data.f[k].isApprox(data_ref.f[k]));
423 BOOST_CHECK(data_fk2.hg.isApprox(
data.hg));
424 BOOST_CHECK(data_fk2.dhg.isApprox(
data.dhg));
428 const double eps = 1e-8;
429 Eigen::VectorXd v_plus =
v +
eps *
a;
433 const SE3::Vector3
com = data_fd.com[0];
435 const SE3::Vector3 com_plus = data_fd.com[0];
441 BOOST_CHECK(
data.dhg.isApprox(dhg_ref, sqrt(
eps)));
444 BOOST_AUTO_TEST_SUITE_END()