18 #include <boost/test/unit_test.hpp>
19 #include <boost/utility/binary.hpp>
21 template<
typename Jo
intModel>
25 const std::string & parent_name,
26 const std::string &
name,
28 bool setRandomLimits =
true)
31 typedef typename JointModel::ConfigVector_t CV;
32 typedef typename JointModel::TangentVector_t TV;
38 model.getJointId(parent_name), joint, SE3::Random(),
name +
"_joint",
39 TV::Random() + TV::Constant(1), TV::Random() + TV::Constant(1),
40 CV::Random() - CV::Constant(1), CV::Random() + CV::Constant(1));
44 model.addJointFrame(idx);
46 model.appendBodyToJoint(idx, Inertia::Random(), SE3::Identity());
50 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
56 const std::string parent_name =
model.names.back();
57 const std::string
joint_name =
"ee_spherical_joint";
62 model.lowerPositionLimit.head<7>().
fill(-1.);
63 model.upperPositionLimit.head<7>().
fill(1.);
66 Eigen::VectorXd
v = Eigen::VectorXd::Random(
model.nv);
67 Eigen::VectorXd
a = Eigen::VectorXd::Random(
model.nv);
70 dhdot_da(6,
model.nv);
72 model,
data,
q,
v,
a, dh_dq, dhdot_dq, dhdot_dv, dhdot_da);
75 for (
size_t k = 0; k < (size_t)
model.njoints; ++k)
77 BOOST_CHECK(
data.oMi[k].isApprox(data_ref.oMi[k]));
78 BOOST_CHECK(
data.oYcrb[k].isApprox(data_ref.oYcrb[k]));
80 BOOST_CHECK(dhdot_da.isApprox(data_ref.
Ag));
83 for (
size_t k = 1; k < (size_t)
model.njoints; ++k)
85 BOOST_CHECK(
data.v[k].isApprox(data_ref.v[k]));
86 BOOST_CHECK(
data.ov[k].isApprox(
data.oMi[k].act(data_ref.v[k])));
87 BOOST_CHECK(
data.oa[k].isApprox(
data.oMi[k].act(data_ref.a[k])));
88 BOOST_CHECK(
data.oh[k].isApprox(
data.oMi[k].act(data_ref.h[k])));
91 BOOST_CHECK(
data.mass[0] == data_ref.
mass[0]);
92 BOOST_CHECK(
data.com[0].isApprox(data_ref.com[0]));
94 BOOST_CHECK(
data.oh[0].isApprox(data_ref.h[0]));
95 BOOST_CHECK(
data.of[0].isApprox(data_ref.f[0]));
97 BOOST_CHECK(
data.hg.isApprox(data_ref.
hg));
98 BOOST_CHECK(
data.dhg.isApprox(data_ref.
dhg));
99 BOOST_CHECK(
data.Ag.isApprox(data_ref.
Ag));
103 const double eps = 1e-8;
107 BOOST_CHECK(
data.hg.isApprox(data_ref.
hg));
110 Eigen::VectorXd q_plus(
model.nq, 1);
111 Eigen::VectorXd v_eps(
model.nv, 1);
116 for (Eigen::DenseIndex k = 0; k <
model.nv; ++k)
124 dhdot_dq_fd.col(k) = (dhg_plus - dhg).toVector() /
eps;
125 dh_dq_fd.col(k) = (hg_plus - hg).toVector() /
eps;
129 BOOST_CHECK(dhdot_dq.isApprox(dhdot_dq_fd, sqrt(
eps)));
130 BOOST_CHECK(dh_dq.isApprox(dh_dq_fd, sqrt(
eps)));
132 Eigen::VectorXd v_plus(
v);
135 for (Eigen::DenseIndex k = 0; k <
model.nv; ++k)
141 dhdot_dv_fd.col(k) = (dhg_plus - dhg).toVector() /
eps;
146 BOOST_CHECK(dhdot_dv.isApprox(dhdot_dv_fd, sqrt(
eps)));
149 Eigen::VectorXd a_plus(
a);
152 for (Eigen::DenseIndex k = 0; k <
model.nv; ++k)
158 dhdot_da_fd.col(k) = (dhg_plus - dhg).toVector() /
eps;
163 BOOST_CHECK(dhdot_da.isApprox(dhdot_da_fd, sqrt(
eps)));
166 BOOST_CHECK(
data.dAdv.isApprox(data_ref.
dAdv));
167 BOOST_CHECK(
data.dAdq.isApprox(data_ref.
dAdq));
168 BOOST_CHECK(
data.J.isApprox(data_ref.
J));
169 BOOST_CHECK(
data.dJ.isApprox(data_ref.
dJ));
170 BOOST_CHECK(
data.dVdq.isApprox(data_ref.
dVdq));
173 BOOST_CHECK(
data.Ag.isApprox(data_ref.
Ag));
182 model.lowerPositionLimit.head<7>().
fill(-1.);
183 model.upperPositionLimit.head<7>().
fill(1.);
186 Eigen::VectorXd
v = Eigen::VectorXd::Random(
model.nv);
187 Eigen::VectorXd
a = Eigen::VectorXd::Random(
model.nv);
190 dhdot_da(6,
model.nv);
192 dhdot_dv_ref(6,
model.nv), dhdot_da_ref(6,
model.nv);
195 model, data_ref,
q,
v,
a, dh_dq_ref, dhdot_dq_ref, dhdot_dv_ref, dhdot_da_ref);
200 BOOST_CHECK(
data.J.isApprox(data_ref.
J));
204 BOOST_CHECK(
data.oYcrb[k].isApprox(data_ref.oYcrb[k]));
208 BOOST_CHECK(force.isApprox(force_ref));
211 BOOST_CHECK(
data.com[0].isApprox(data_ref.com[0]));
213 BOOST_CHECK(
data.hg.isApprox(data_ref.
hg));
214 BOOST_CHECK(
data.dhg.isApprox(data_ref.
dhg));
216 BOOST_CHECK(
data.Fcrb[0].isApprox(data_ref.
dFdq));
217 BOOST_CHECK(
data.dFdv.isApprox(data_ref.
dFdv));
218 BOOST_CHECK(
data.dFda.isApprox(data_ref.
dFda));
219 BOOST_CHECK(dh_dq.isApprox(dh_dq_ref));
220 BOOST_CHECK(dhdot_dq.isApprox(dhdot_dq_ref));
221 BOOST_CHECK(dhdot_dv.isApprox(dhdot_dv_ref));
222 BOOST_CHECK(dhdot_da.isApprox(dhdot_da_ref));
231 model.lowerPositionLimit.head<7>().
fill(-1.);
232 model.upperPositionLimit.head<7>().
fill(1.);
235 Eigen::VectorXd
v = Eigen::VectorXd::Random(
model.nv);
236 Eigen::VectorXd
a = Eigen::VectorXd::Random(
model.nv);
239 dhdot_da(6,
model.nv);
241 dhdot_dv_ref(6,
model.nv), dhdot_da_ref(6,
model.nv);
244 model, data_ref,
q,
v,
a, dh_dq_ref, dhdot_dq_ref, dhdot_dv_ref, dhdot_da_ref);
251 BOOST_CHECK(
data.J.isApprox(data_ref.J));
252 BOOST_CHECK(
data.dVdq.isApprox(data_rnea.
dVdq));
253 BOOST_CHECK(
data.dAdq.isApprox(data_rnea.
dAdq));
254 BOOST_CHECK(
data.dAdv.isApprox(data_rnea.
dAdv));
255 BOOST_CHECK(
data.dFdq.isApprox(data_rnea.
dFdq));
256 BOOST_CHECK(
data.dFdv.isApprox(data_rnea.
dFdv));
257 BOOST_CHECK(
data.dFda.isApprox(data_rnea.
dFda));
261 BOOST_CHECK(
data.oYcrb[k].isApprox(data_ref.oYcrb[k]));
262 BOOST_CHECK(
data.oh[k].isApprox(data_ref.oh[k]));
266 BOOST_CHECK(force.isApprox(force_ref));
269 BOOST_CHECK(
data.com[0].isApprox(data_ref.com[0]));
271 BOOST_CHECK(
data.hg.isApprox(data_ref.hg));
272 BOOST_CHECK(
data.dhg.isApprox(data_ref.dhg));
274 BOOST_CHECK(
data.Fcrb[0].isApprox(data_ref.dFdq));
275 BOOST_CHECK(
data.dFdv.isApprox(data_ref.dFdv));
276 BOOST_CHECK(
data.dFda.isApprox(data_ref.dFda));
277 BOOST_CHECK(dh_dq.isApprox(dh_dq_ref));
278 BOOST_CHECK(dhdot_dq.isApprox(dhdot_dq_ref));
279 BOOST_CHECK(dhdot_dv.isApprox(dhdot_dv_ref));
280 BOOST_CHECK(dhdot_da.isApprox(dhdot_da_ref));
283 BOOST_AUTO_TEST_SUITE_END()