joint-mimic.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2019 INRIA
3 //
4 
7 
8 #include <boost/test/unit_test.hpp>
9 #include <boost/utility/binary.hpp>
10 
11 using namespace pinocchio;
12 
13 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
14 
15 typedef Eigen::Matrix<double, 6, Eigen::Dynamic> Matrix6x;
16 
17 template<typename JointModel>
19 {
20  typedef typename traits<JointModel>::JointDerived Joint;
21  typedef typename traits<Joint>::Constraint_t ConstraintType;
25 
26  JointData jdata = jmodel.createData();
27 
28  const double scaling_factor = 2.;
29  ConstraintRef constraint_ref(jdata.S.matrix()), constraint_ref_shared(jdata.S.matrix());
30  ScaledConstraint scaled_constraint(constraint_ref_shared, scaling_factor);
31 
32  BOOST_CHECK(constraint_ref.nv() == scaled_constraint.nv());
33 
34  typedef typename JointModel::TangentVector_t TangentVector_t;
35  TangentVector_t v = TangentVector_t::Random();
36 
37  Motion m = scaled_constraint * v;
38  Motion m_ref = scaling_factor * (Motion)(constraint_ref * v);
39 
40  BOOST_CHECK(m.isApprox(m_ref));
41 
42  {
43  SE3 M = SE3::Random();
44  typename ScaledConstraint::DenseBase S = M.act(scaled_constraint);
45  typename ScaledConstraint::DenseBase S_ref = scaling_factor * M.act(constraint_ref);
46 
47  BOOST_CHECK(S.isApprox(S_ref));
48  }
49 
50  {
51  typename ScaledConstraint::DenseBase S = scaled_constraint.matrix();
52  typename ScaledConstraint::DenseBase S_ref = scaling_factor * constraint_ref.matrix();
53 
54  BOOST_CHECK(S.isApprox(S_ref));
55  }
56 
57  {
59  typename ScaledConstraint::DenseBase S = v.cross(scaled_constraint);
60  typename ScaledConstraint::DenseBase S_ref = scaling_factor * v.cross(constraint_ref);
61 
62  BOOST_CHECK(S.isApprox(S_ref));
63  }
64 
65  // Test transpose operations
66  {
67  const Eigen::DenseIndex dim = ScaledConstraint::MaxDim;
68  const Matrix6x Fin = Matrix6x::Random(6, dim);
69  Eigen::MatrixXd Fout = scaled_constraint.transpose() * Fin;
70  Eigen::MatrixXd Fout_ref = scaling_factor * (constraint_ref.transpose() * Fin);
71  BOOST_CHECK(Fout.isApprox(Fout_ref));
72 
73  Force force_in(Force::Random());
74  Eigen::MatrixXd Stf = (scaled_constraint.transpose() * force_in);
75  Eigen::MatrixXd Stf_ref = scaling_factor * (constraint_ref.transpose() * force_in);
76  BOOST_CHECK(Stf_ref.isApprox(Stf));
77  }
78 
79  // CRBA Y*S
80  {
81  Inertia Y = Inertia::Random();
82  Eigen::MatrixXd YS = Y * scaled_constraint;
83  Eigen::MatrixXd YS_ref = scaling_factor * (Y * constraint_ref);
84 
85  BOOST_CHECK(YS.isApprox(YS_ref));
86  }
87 }
88 
90 {
91 
92  template<typename JointModel>
94  {
95  JointModel jmodel;
96  jmodel.setIndexes(1, 0, 0, 0);
97 
98  test_constraint_mimic(jmodel);
99  }
100 
102  {
103  JointModelRevoluteUnaligned jmodel(1.5, 1., 0.);
104  jmodel.setIndexes(1, 0, 0, 0);
105 
106  test_constraint_mimic(jmodel);
107  }
108 
110  {
111  JointModelPrismaticUnaligned jmodel(1.5, 1., 0.);
112  jmodel.setIndexes(1, 0, 0, 0);
113 
114  test_constraint_mimic(jmodel);
115  }
116 };
117 
118 BOOST_AUTO_TEST_CASE(test_constraint)
119 {
120  using namespace pinocchio;
121  typedef boost::variant<
124  Variant;
125 
126  boost::mpl::for_each<Variant::types>(TestJointConstraint());
127 }
128 
129 template<typename JointModel, typename MimicConfigurationTransform, bool MimicIdentity>
131 {
132  typedef typename traits<JointModel>::JointDerived Joint;
134 
135  JointData jdata = jmodel.createData();
136 
137  const double scaling_factor = MimicIdentity ? 1. : 2.5;
138  const double offset = MimicIdentity ? 0 : 0.75;
139 
140  // test constructor
141  JointModelMimic jmodel_mimic(jmodel.derived(), scaling_factor, offset);
142  JointDataMimic jdata_mimic = jmodel_mimic.createData();
143 
144  // Non-const ref accessors trigger asserts, usefull const ref to call const ref accessors...
145  const JointDataMimic & jdata_mimic_const_ref{jdata_mimic};
146 
147  BOOST_CHECK(jmodel_mimic.nq() == 0);
148  BOOST_CHECK(jmodel_mimic.nv() == 0);
149 
150  BOOST_CHECK(jmodel_mimic.idx_q() == jmodel.idx_q());
151  BOOST_CHECK(jmodel_mimic.idx_v() == jmodel.idx_v());
152 
153  typedef typename JointModel::ConfigVector_t ConfigVectorType;
154  typedef typename LieGroup<JointModel>::type LieGroupType;
156  LieGroupType().randomConfiguration(-ConfigVectorType::Ones(), ConfigVectorType::Ones());
157  ConfigVectorType q0_mimic;
158  MimicConfigurationTransform::run(q0, scaling_factor, offset, q0_mimic);
159 
160  jmodel.calc(jdata, q0_mimic);
161  jmodel_mimic.calc(jdata_mimic, q0);
162 
163  BOOST_CHECK(((SE3)jdata.M).isApprox((SE3)jdata_mimic.M()));
164  BOOST_CHECK((scaling_factor * jdata.S.matrix()).isApprox(jdata_mimic.S.matrix()));
165 
166  typedef typename JointModel::TangentVector_t TangentVectorType;
167 
168  q0 = LieGroupType().randomConfiguration(-ConfigVectorType::Ones(), ConfigVectorType::Ones());
169  MimicConfigurationTransform::run(q0, scaling_factor, offset, q0_mimic);
170  TangentVectorType v0 = TangentVectorType::Random();
171  TangentVectorType v0_mimic = v0 * scaling_factor;
172  jmodel.calc(jdata, q0_mimic, v0_mimic);
173  jmodel_mimic.calc(jdata_mimic, q0, v0);
174 
175  BOOST_CHECK(((SE3)jdata.M).isApprox((SE3)jdata_mimic.M()));
176  BOOST_CHECK((scaling_factor * jdata.S.matrix()).isApprox(jdata_mimic.S.matrix()));
177  BOOST_CHECK(((Motion)jdata.v).isApprox((Motion)jdata_mimic.v()));
178 }
179 
180 template<typename MimicConfigurationTransform, bool MimicIdentity>
182 {
183 
184  template<typename JointModel>
186  {
187  JointModel jmodel;
188  jmodel.setIndexes(1, 0, 0, 0);
189 
190  test_joint_mimic<JointModel, MimicConfigurationTransform, MimicIdentity>(jmodel);
191  }
192 
194  {
195  JointModelRevoluteUnaligned jmodel(1.5, 1., 0.);
196  jmodel.setIndexes(1, 0, 0, 0);
197 
198  test_joint_mimic<JointModelRevoluteUnaligned, MimicConfigurationTransform, MimicIdentity>(
199  jmodel);
200  }
201 
203  {
204  JointModelPrismaticUnaligned jmodel(1.5, 1., 0.);
205  jmodel.setIndexes(1, 0, 0, 0);
206 
207  test_joint_mimic<JointModelPrismaticUnaligned, MimicConfigurationTransform, MimicIdentity>(
208  jmodel);
209  }
210 };
211 
213 {
214  using namespace pinocchio;
215  typedef boost::variant<
218  VariantLinear;
219 
220  typedef boost::variant<JointModelRUBX, JointModelRUBY, JointModelRUBZ> VariantUnboundedRevolute;
221 
222  // Test specific transforms for non trivial affine values
223  boost::mpl::for_each<VariantLinear::types>(TestJointMimic<LinearAffineTransform, false>());
224  boost::mpl::for_each<VariantUnboundedRevolute::types>(
226 }
227 
228 BOOST_AUTO_TEST_CASE(test_transform_linear_affine)
229 {
230  typedef JointModelRX::ConfigVector_t ConfigVectorType;
231  double scaling = 1., offset = 0.;
232 
233  ConfigVectorType q0 = ConfigVectorType::Random();
235  LinearAffineTransform::run(q0, scaling, offset, q1);
236  BOOST_CHECK(q0 == q1);
237 
238  scaling = 2.5;
239  offset = 1.5;
240  LinearAffineTransform::run(ConfigVectorType::Zero(), scaling, offset, q1);
241  BOOST_CHECK(q1 == ConfigVectorType::Constant(offset));
242 
243  LinearAffineTransform::run(q0, scaling, offset, q1);
244  BOOST_CHECK((scaling * q0 + ConfigVectorType::Ones() * offset) == q1);
245 }
246 
247 BOOST_AUTO_TEST_CASE(test_transform_linear_revolute_unbounded)
248 {
249  typedef JointModelRUBX::ConfigVector_t ConfigVectorType;
250  double scaling = 1., offset = 0.;
251 
252  ConfigVectorType q0 = ConfigVectorType::Random().normalized();
254  UnboundedRevoluteAffineTransform::run(q0, scaling, offset, q1);
255  BOOST_CHECK(q0.isApprox(q1));
256 
257  scaling = 2.5;
258  offset = 1.5;
259  UnboundedRevoluteAffineTransform::run(q0, scaling, offset, q1);
260  const double theta = atan2(q0[1], q0[0]);
261  BOOST_CHECK(
262  q1
263  == ConfigVectorType(math::cos(theta * scaling + offset), math::sin(theta * scaling + offset)));
264 }
265 
266 BOOST_AUTO_TEST_CASE(test_joint_generic_cast)
267 {
268  JointModelRX jmodel_ref;
269  jmodel_ref.setIndexes(1, 2, 3, 3);
270 
271  JointModelMimic jmodel(jmodel_ref, 2., 1.);
272  jmodel.setIndexes(2, -1, -1, 3);
273 
274  BOOST_CHECK(jmodel.idx_q() == jmodel_ref.idx_q());
275  BOOST_CHECK(jmodel.idx_v() == jmodel_ref.idx_v());
276 
277  JointModel jmodel_generic(jmodel);
278  jmodel_generic.setIndexes(2, -2, -2, 3);
279 
280  BOOST_CHECK(jmodel_generic.id() == jmodel.id());
281 }
282 BOOST_AUTO_TEST_SUITE_END()
pinocchio::JointModelRevoluteUnalignedTpl::setIndexes
void setIndexes(JointIndex id, int q, int v)
Definition: joint-model-base.hpp:205
pinocchio::JointModelBase::createData
JointDataDerived createData() const
Definition: joint-model-base.hpp:94
test_joint_mimic
void test_joint_mimic(const JointModelBase< JointModel > &jmodel)
Definition: joint-mimic.cpp:130
pinocchio::JointDataTpl::v
Motion_t v() const
Definition: joint-generic.hpp:134
Eigen
pinocchio::JointModelRevoluteTpl::idx_q
int idx_q() const
Definition: joint-model-base.hpp:171
test-cpp2pybind11.m
m
Definition: test-cpp2pybind11.py:25
pinocchio::ScaledJointMotionSubspaceTpl
Definition: joint-mimic.hpp:17
omniidl_be_python_with_docstring.run
def run(tree, args)
Definition: cmake/hpp/idl/omniidl_be_python_with_docstring.py:140
meshcat-viewer.v0
int v0
Definition: meshcat-viewer.py:88
pinocchio::JointModelBase
Definition: joint-model-base.hpp:78
pinocchio::SE3
context::SE3 SE3
Definition: spatial/fwd.hpp:59
pinocchio::JointModelRX
JointModelRevoluteTpl< context::Scalar, context::Options, 0 > JointModelRX
Definition: joint-revolute.hpp:877
pinocchio::UnboundedRevoluteAffineTransform::run
static void run(const Eigen::MatrixBase< ConfigVectorIn > &qIn, const Scalar &scaling, const Scalar &offset, const Eigen::MatrixBase< ConfigVectorOut > &qOut)
Definition: joint-common-operations.hpp:70
pinocchio::JointDataTpl
Definition: multibody/joint/fwd.hpp:176
pinocchio::LinearAffineTransform::run
static void run(const Eigen::MatrixBase< ConfigVectorIn > &qIn, const Scalar &scaling, const Scalar &offset, const Eigen::MatrixBase< ConfigVectorOut > &qOut)
Definition: joint-common-operations.hpp:55
pinocchio::Joint
JointTpl< context::Scalar > Joint
Definition: joint-generic.hpp:22
TestJointMimic
Definition: joint-mimic.cpp:181
pinocchio::JointModelRevoluteTpl::setIndexes
void setIndexes(JointIndex id, int q, int v)
Definition: joint-model-base.hpp:205
pinocchio::JointModelRY
JointModelRevoluteTpl< context::Scalar, context::Options, 1 > JointModelRY
Definition: joint-revolute.hpp:881
pinocchio::JointModelTpl::setIndexes
void setIndexes(JointIndex id, int nq, int nv)
Definition: joint-generic.hpp:450
BOOST_AUTO_TEST_CASE
BOOST_AUTO_TEST_CASE(test_constraint)
Definition: joint-mimic.cpp:118
pinocchio::JointDataMimicTpl::S
Constraint_t S
Definition: joint-mimic.hpp:543
simulation-contact-dynamics.S
S
Definition: simulation-contact-dynamics.py:80
pinocchio::Force
context::Force Force
Definition: spatial/fwd.hpp:63
pinocchio::JointData
JointDataTpl< context::Scalar > JointData
Definition: multibody/joint/fwd.hpp:176
TestJointConstraint
Definition: joint-mimic.cpp:89
TestJointConstraint::operator()
void operator()(const JointModelBase< JointModelRevoluteUnaligned > &) const
Definition: joint-mimic.cpp:101
joint-generic.hpp
pinocchio::Dynamic
const int Dynamic
Definition: fwd.hpp:140
TestJointMimic::operator()
void operator()(const JointModelBase< JointModel > &) const
Definition: joint-mimic.cpp:185
ConfigVectorType
Model::ConfigVectorType ConfigVectorType
Definition: timings-cppad-jit.cpp:57
pinocchio::JointModelTpl
Definition: multibody/joint/fwd.hpp:169
pinocchio::JointModelRZ
JointModelRevoluteTpl< context::Scalar, context::Options, 2 > JointModelRZ
Definition: joint-revolute.hpp:885
pinocchio::JointModelPY
JointModelPrismaticTpl< context::Scalar, context::Options, 1 > JointModelPY
Definition: joint-prismatic.hpp:785
pinocchio::q0
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > & q0
Definition: joint-configuration.hpp:1137
pinocchio::Inertia
context::Inertia Inertia
Definition: spatial/fwd.hpp:64
test_constraint_mimic
void test_constraint_mimic(const JointModelBase< JointModel > &jmodel)
Definition: joint-mimic.cpp:18
pinocchio::JointModelRevoluteTpl::idx_v
int idx_v() const
Definition: joint-model-base.hpp:175
M
M
pinocchio::JointDataTpl::S
Constraint_t S() const
Definition: joint-generic.hpp:126
pinocchio::MotionTpl::Random
static MotionTpl Random()
Definition: motion-tpl.hpp:140
pinocchio::JointModelRevoluteTpl
Definition: multibody/joint/fwd.hpp:33
TestJointMimic::operator()
void operator()(const JointModelBase< JointModelPrismaticUnaligned > &) const
Definition: joint-mimic.cpp:202
pinocchio::JointModelPZ
JointModelPrismaticTpl< context::Scalar, context::Options, 2 > JointModelPZ
Definition: joint-prismatic.hpp:789
TangentVectorType
Model::TangentVectorType TangentVectorType
Definition: timings-cppad-jit.cpp:58
pinocchio::JointModelMimicTpl::calc
PINOCCHIO_DONT_INLINE void calc(JointDataDerived &jdata, const typename Eigen::MatrixBase< ConfigVector > &qs) const
Definition: joint-mimic.hpp:694
Matrix6x
Eigen::Matrix< double, 6, Eigen::Dynamic > Matrix6x
Definition: joint-mimic.cpp:15
pinocchio::JointModelBase::idx_v
int idx_v() const
Definition: joint-model-base.hpp:175
pinocchio::v
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > const Eigen::MatrixBase< TangentVectorType > & v
Definition: joint-configuration.hpp:1084
pinocchio::JointModelRevoluteUnalignedTpl
Definition: multibody/joint/fwd.hpp:38
pinocchio::JointModelPrismaticUnalignedTpl
Definition: multibody/joint/fwd.hpp:94
pinocchio::JointModelBase::idx_q
int idx_q() const
Definition: joint-model-base.hpp:171
TestJointConstraint::operator()
void operator()(const JointModelBase< JointModel > &) const
Definition: joint-mimic.cpp:93
liegroup.hpp
pinocchio::JointModelBase::calc
void calc(JointDataDerived &data, const Eigen::MatrixBase< ConfigVectorType > &qs) const
Definition: joint-model-base.hpp:110
pinocchio::JointModelPrismaticUnalignedTpl::setIndexes
void setIndexes(JointIndex id, int q, int v)
Definition: joint-model-base.hpp:205
pinocchio::Motion
MotionTpl<::CppAD::AD< double >, 0 > Motion
Definition: context/cppad.hpp:39
pinocchio::q1
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > const Eigen::MatrixBase< ConfigVectorIn2 > & q1
Definition: joint-configuration.hpp:1138
pinocchio::JointModelMimicTpl
Definition: multibody/joint/fwd.hpp:155
Y
Y
pinocchio::JointModelPX
JointModelPrismaticTpl< context::Scalar, context::Options, 0 > JointModelPX
Definition: joint-prismatic.hpp:781
pinocchio::traits
Common traits structure to fully define base classes for CRTP.
Definition: fwd.hpp:71
pinocchio::VectorSpaceOperationTpl
Definition: vector-space.hpp:16
pinocchio::JointModelRevoluteUnaligned
JointModelRevoluteUnalignedTpl< context::Scalar > JointModelRevoluteUnaligned
Definition: multibody/joint/fwd.hpp:38
TestJointMimic::operator()
void operator()(const JointModelBase< JointModelRevoluteUnaligned > &) const
Definition: joint-mimic.cpp:193
dim
int dim
TestJointConstraint::operator()
void operator()(const JointModelBase< JointModelPrismaticUnaligned > &) const
Definition: joint-mimic.cpp:109
pinocchio::JointDataMimicTpl
Definition: multibody/joint/fwd.hpp:162
pinocchio::MotionTpl
Definition: context/casadi.hpp:28
pinocchio::JointDataTpl::M
Transformation_t M() const
Definition: joint-generic.hpp:130
pinocchio::JointModelMimicTpl::createData
JointDataDerived createData() const
Definition: joint-mimic.hpp:676
pinocchio::JointMotionSubspaceTpl
Definition: joint-motion-subspace-generic.hpp:65
pinocchio::JointModelBase::derived
JointModelDerived & derived()
Definition: joint-model-base.hpp:85
pinocchio
Main pinocchio namespace.
Definition: timings.cpp:33


pinocchio
Author(s):
autogenerated on Wed Apr 16 2025 02:41:48