11 #include "utils/macros.hpp"
15 #include <boost/test/unit_test.hpp>
16 #include <boost/utility/binary.hpp>
20 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
26 SE3 amb = SE3::Random();
27 SE3 bmc = SE3::Random();
31 ForceSet F2(Eigen::Matrix<double, 3, 2>::Zero(), Eigen::Matrix<double, 3, 2>::Zero());
33 BOOST_CHECK_EQUAL(F.
matrix().col(10).norm(), 0.0);
34 BOOST_CHECK(std::isnan(F.
matrix()(0, 9)));
36 ForceSet F3(Eigen::Matrix<double, 3, 12>::Random(), Eigen::Matrix<double, 3, 12>::Random());
38 SE3::Matrix6 aXb = amb;
39 BOOST_CHECK((aXb.transpose().inverse() * F3.
matrix()).isApprox(F4.
matrix(), 1e-12));
48 (aXb.transpose().inverse() * F3.
matrix().block(0, 3, 6, 6)).isApprox(F36.
matrix(), 1e-12));
52 BOOST_CHECK((aXb.transpose().inverse() * F3.
matrix().block(0, 3, 6, 6))
53 .isApprox(F36full.
matrix().block(0, 3, 6, 6), 1e-12));
61 JointDataRX::Constraint_t
S;
65 BOOST_CHECK(F1.
matrix().isApprox(
Y.matrix().col(3), 1e-12));
67 ForceSet F2(Eigen::Matrix<double, 3, 9>::Random(), Eigen::Matrix<double, 3, 9>::Random());
68 Eigen::MatrixXd StF2 =
S.transpose() * F2.
block(5, 3).
matrix();
69 BOOST_CHECK(StF2.isApprox(
S.matrix().transpose() * F2.
matrix().block(0, 5, 6, 3), 1e-12));
72 template<
typename Jo
intModel>
75 BOOST_CHECK(jmodel.
nq() == nq_ref);
78 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollection>
82 BOOST_CHECK(jmodel.
jmodel().nq() == nq_ref);
85 template<
typename Jo
intModel,
typename Constra
intDerived>
90 BOOST_CHECK(constraint.
nv() == jmodel.
nv());
96 template<
typename,
int>
class JointCollection,
97 typename ConstraintDerived>
102 BOOST_CHECK(constraint.
nv() == jmodel.
jmodel().nv());
105 template<
class Jo
intModel>
111 model.addJoint(0, jmodel, SE3::Identity(),
"joint");
117 template<
typename Jo
intModel>
123 typedef Eigen::Matrix<typename JointModel::Scalar, 6, Eigen::Dynamic>
Matrix6x;
126 typedef typename JointModel::ConfigVector_t ConfigVector_t;
135 model, ConfigVector_t::Constant(
model.nq, -1.), ConfigVector_t::Constant(
model.nq, 1.));
138 jmodel.
calc(jdata,
q);
140 ConstraintType constraint(jdata.
S);
143 BOOST_CHECK(constraint.cols() == constraint.nv());
144 BOOST_CHECK(constraint.rows() == 6);
146 typedef typename JointModel::TangentVector_t TangentVector_t;
147 TangentVector_t
v = TangentVector_t::Random(constraint.nv());
149 typename ConstraintType::DenseBase constraint_mat = constraint.matrix();
153 BOOST_CHECK(
m.isApprox(m_ref));
157 SE3 M = SE3::Random();
158 typename ConstraintType::DenseBase
S =
M.act(constraint);
159 typename ConstraintType::DenseBase S_ref(6, constraint.nv());
161 for (Eigen::DenseIndex k = 0; k < constraint.nv(); ++k)
163 typedef typename ConstraintType::DenseBase::ColXpr Vector6Like;
169 BOOST_CHECK(
S.isApprox(S_ref));
174 SE3 M = SE3::Random();
175 typename ConstraintType::DenseBase
S =
M.actInv(constraint);
176 typename ConstraintType::DenseBase S_ref(6, constraint.nv());
178 for (Eigen::DenseIndex k = 0; k < constraint.nv(); ++k)
180 typedef typename ConstraintType::DenseBase::ColXpr Vector6Like;
183 m_out =
M.actInv(m_in);
186 BOOST_CHECK(
S.isApprox(S_ref));
191 const SE3 M = SE3::Random();
192 const SE3 Minv =
M.inverse();
194 typename ConstraintType::DenseBase S1_vice =
M.actInv(constraint);
195 typename ConstraintType::DenseBase S2_vice = Minv.act(constraint);
197 BOOST_CHECK(S1_vice.isApprox(S2_vice));
199 typename ConstraintType::DenseBase S1_versa =
M.act(constraint);
200 typename ConstraintType::DenseBase S2_versa = Minv.actInv(constraint);
202 BOOST_CHECK(S1_versa.isApprox(S2_versa));
209 typename ConstraintType::DenseBase
S =
v.cross(constraint);
210 typename ConstraintType::DenseBase S_ref(6, constraint.nv());
212 for (Eigen::DenseIndex k = 0; k < constraint.nv(); ++k)
214 typedef typename ConstraintType::DenseBase::ColXpr Vector6Like;
217 m_out =
v.cross(m_in);
219 BOOST_CHECK(
S.isApprox(S_ref));
224 const Eigen::DenseIndex
dim = 20;
226 Eigen::MatrixXd Fout = constraint.transpose() * Fin;
227 Eigen::MatrixXd Fout_ref = constraint_mat.transpose() * Fin;
228 BOOST_CHECK(Fout.isApprox(Fout_ref));
230 Force force_in(Force::Random());
231 Eigen::MatrixXd Stf = (constraint.transpose() * force_in);
232 Eigen::MatrixXd Stf_ref = constraint_mat.transpose() * force_in.toVector();
233 BOOST_CHECK(Stf_ref.isApprox(Stf));
238 const Inertia Y = Inertia::Random();
239 Eigen::MatrixXd YS =
Y * constraint;
240 Eigen::MatrixXd YS_ref =
Y.matrix() * constraint_mat;
241 BOOST_CHECK(YS.isApprox(YS_ref));
246 const Inertia Y = Inertia::Random();
247 const Inertia::Matrix6 Y_mat =
Y.matrix();
248 Eigen::MatrixXd YS = Y_mat * constraint;
249 Eigen::MatrixXd YS_ref = Y_mat * constraint_mat;
250 BOOST_CHECK(YS.isApprox(YS_ref));
255 Eigen::MatrixXd StS = constraint.transpose() * constraint;
256 Eigen::MatrixXd StS_ref = constraint_mat.transpose() * constraint_mat;
257 BOOST_CHECK(StS.isApprox(StS_ref));
261 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollection>
267 template<
typename Jo
intModel_>
270 template<
typename Jo
intModel_>
276 jmodel.setIndexes(0, 0, 0);
281 template<
typename Scalar,
int Options>
289 JointModel jmodel(Vector3::Random().normalized());
296 template<
typename Scalar,
int Options>
304 JointModel jmodel(Vector3::Random().normalized());
311 template<
typename Scalar,
int Options>
319 JointModel jmodel(Vector3::Random().normalized());
326 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollection>
341 template<
typename Scalar,
int Options>
355 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollection>
370 jmodel.setIndexes(0, 0, 0);
376 template<
typename Scalar,
int Options,
template<
typename,
int>
class JointCollection>
386 jmodel.setIndexes(1, 0, 0, 0);
392 template<
typename Scalar,
int Options,
int axis>
406 template<
typename Scalar,
int Options>
414 JointModel jmodel(Vector3::Random().normalized());
424 template<
typename Jo
intModel>
438 BOOST_AUTO_TEST_SUITE_END()