cartesian-product-liegroups.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2020 INRIA
3 //
4 
10 
12 
13 #include <boost/test/unit_test.hpp>
14 #include <boost/utility/binary.hpp>
15 #include <boost/algorithm/string.hpp>
16 
17 using namespace pinocchio;
18 
19 namespace pinocchio {
20 template<typename Derived>
21 std::ostream& operator<< (std::ostream& os, const LieGroupBase<Derived>& lg)
22 {
23  return os << lg.name();
24 }
25 template<typename LieGroupCollection>
26 std::ostream& operator<< (std::ostream& os, const LieGroupGenericTpl<LieGroupCollection>& lg)
27 {
28  return os << lg.name();
29 }
30 } // namespace pinocchio
31 
32 
33 template<typename Scalar, int Options, template<typename S, int O> class LieGroupCollectionTpl>
35 {
36 
37  typedef LieGroupCollectionTpl<Scalar,Options> LieGroupCollection;
38 
40  typedef typename LieGroupGeneric::ConfigVector_t ConfigVector_t;
41  typedef typename LieGroupGeneric::TangentVector_t TangentVector_t;
42 
44 
45  template<typename Derived>
46  void operator() (const LieGroupBase<Derived> & lg) const
47  {
49  CartesianProduct cp(lg_generic);
50  test(lg,cp);
51 
52  CartesianProduct cp2;
53  cp2.append(lg);
54  BOOST_CHECK(cp == cp2);
55  }
56 
57  template<typename LieGroup>
58  static void test(const LieGroupBase<LieGroup> & lg,
59  const CartesianProduct & cp)
60  {
61  BOOST_CHECK(lg.nq() == cp.nq());
62  BOOST_CHECK(lg.nv() == cp.nv());
63 
64  std::cout << "name: " << cp.name() << std::endl;
65 
66  BOOST_CHECK(lg.neutral() == cp.neutral());
67 
68  typedef typename LieGroup::ConfigVector_t ConfigVector;
69  typedef typename LieGroup::TangentVector_t TangentVector;
70  typedef typename LieGroup::JacobianMatrix_t JacobianMatrix;
71 
72  ConfigVector q0 = lg.random();
73  ConfigVector q1 = lg.random();
74  TangentVector v = TangentVector_t::Random(lg.nv());
77  ConfigVector qout_ref(lg.nq()), qout(lg.nq());
78  lg.integrate(q0, v, qout_ref);
79  cp.integrate(q0, v, qout);
81 
82  BOOST_CHECK(qout.isApprox(qout_ref));
83 
86  TangentVector v_diff_ref(lg.nv()), v_diff(lg.nv());
87  lg.difference(q0,q1,v_diff_ref);
88  cp.difference(q0,q1,v_diff);
90 
91  BOOST_CHECK(v_diff_ref.isApprox(v_diff));
92  BOOST_CHECK_EQUAL(lg.squaredDistance(q0, q1), cp.squaredDistance(q0, q1));
93  BOOST_CHECK_EQUAL(lg.distance(q0, q1), cp.distance(q0, q1));
94 
95  JacobianMatrix
96  J_ref(JacobianMatrix::Zero(lg.nv(),lg.nv())),
97  J(JacobianMatrix::Zero(lg.nv(),lg.nv()));
98 
99  lg.dDifference(q0, q1, J_ref, ARG0);
100  cp.dDifference(q0, q1, J, ARG0);
101 
102  BOOST_CHECK(J.isApprox(J_ref));
103 
104  lg.dDifference(q0, q1, J_ref, ARG1);
105  cp.dDifference(q0, q1, J, ARG1);
106 
107  BOOST_CHECK(J.isApprox(J_ref));
108 
109  lg.dIntegrate(q0, v, J_ref, ARG0);
110  cp.dIntegrate(q0, v, J, ARG0);
111 
112  BOOST_CHECK(J.isApprox(J_ref));
113 
114  lg.dIntegrate(q0, v, J_ref, ARG1);
115  cp.dIntegrate(q0, v, J, ARG1);
116 
117  BOOST_CHECK(J.isApprox(J_ref));
118 
119  BOOST_CHECK(cp.isSameConfiguration(q0,q0));
122  ConfigVector q_rand;
123  cp.random(q_rand);
124  ConfigVector q_rand_copy = q_rand;
125 
126  lg.normalize(q_rand_copy);
127  cp.normalize(q_rand);
128  BOOST_CHECK(q_rand.isApprox(q_rand_copy));
129 
130  const ConfigVector lb(-ConfigVector::Ones(lg.nq()));
131  const ConfigVector ub( ConfigVector::Ones(lg.nq()));
132 
133  cp.randomConfiguration(lb, ub, q_rand);
135  }
136 };
137 
138 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
139 
140 BOOST_AUTO_TEST_CASE(test_cartesian_product_with_liegroup_variant)
141 {
142  boost::mpl::for_each<LieGroupCollectionDefault::LieGroupVariant::types>(TestCartesianProduct<double,0,LieGroupCollectionDefaultTpl>());
143 }
144 
145 BOOST_AUTO_TEST_CASE(test_cartesian_product_vs_cartesian_product_variant)
146 {
149 
152 
153  SE3 lg1; Rn lg2;
154  typedef LieGroupGenericTpl<CP::LieGroupCollection> LieGroupGeneric;
155  LieGroupGeneric lg1_variant(lg1);
156  LieGroupGeneric lg2_variant(lg2);
157 
158  CP cartesian_product(lg1_variant,lg2_variant);
159  CP cartesian_product2(lg1_variant); cartesian_product2.append(lg2_variant);
160  std::cout << "cartesian_product: " << cartesian_product << std::endl;
161 
162  BOOST_CHECK(cartesian_product == cartesian_product2);
163  CPRef cartesian_product_ref;
164 
166  cartesian_product);
167 }
168 
169 BOOST_AUTO_TEST_SUITE_END()
pinocchio::SE3
SE3Tpl< double, 0 > SE3
Definition: spatial/fwd.hpp:53
pinocchio::CartesianProductOperation
Definition: cartesian-product.hpp:31
pinocchio::LieGroupGenericTpl
Definition: multibody/liegroup/fwd.hpp:12
pinocchio::CartesianProductOperationVariantTpl::append
void append(const LieGroupGeneric &lg)
Append a Lie group to the Cartesian product.
pinocchio::SpecialEuclideanOperationTpl
Definition: special-euclidean.hpp:24
TestCartesianProduct::ConfigVector_t
LieGroupGeneric::ConfigVector_t ConfigVector_t
Definition: cartesian-product-liegroups.cpp:40
test
def test(dtype)
TestCartesianProduct::TangentVector_t
LieGroupGeneric::TangentVector_t TangentVector_t
Definition: cartesian-product-liegroups.cpp:41
pinocchio::LieGroupBase::dDifference
void dDifference(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< JacobianOut_t > &J) const
Computes the Jacobian of the difference operation with respect to q0 or q1.
TestCartesianProduct::test
static void test(const LieGroupBase< LieGroup > &lg, const CartesianProduct &cp)
Definition: cartesian-product-liegroups.cpp:58
cartesian-product.hpp
TestCartesianProduct::LieGroupGeneric
LieGroupGenericTpl< LieGroupCollection > LieGroupGeneric
Definition: cartesian-product-liegroups.cpp:39
pinocchio::SE3Tpl< double, 0 >
inverse-kinematics.J
J
Definition: inverse-kinematics.py:31
BOOST_AUTO_TEST_CASE
BOOST_AUTO_TEST_CASE(test_cartesian_product_with_liegroup_variant)
Definition: cartesian-product-liegroups.cpp:140
pinocchio::CartesianProductOperationVariantTpl
Dynamic Cartesian product composed of elementary Lie groups defined in LieGroupVariant.
Definition: cartesian-product-variant.hpp:18
PINOCCHIO_COMPILER_DIAGNOSTIC_POP
#define PINOCCHIO_COMPILER_DIAGNOSTIC_POP
Definition: include/pinocchio/macros.hpp:95
pinocchio::LieGroupBase::normalize
void normalize(const Eigen::MatrixBase< Config_t > &qout) const
Normalize the joint configuration given as input. For instance, the quaternion must be unitary.
pinocchio::ARG0
@ ARG0
Definition: fwd.hpp:61
PINOCCHIO_COMPILER_DIAGNOSTIC_IGNORED_MAYBE_UNINITIALIZED
#define PINOCCHIO_COMPILER_DIAGNOSTIC_IGNORED_MAYBE_UNINITIALIZED
Definition: include/pinocchio/macros.hpp:97
pinocchio::LieGroupBase::name
std::string name() const
Get name of instance.
cartesian-product-variant.hpp
TestCartesianProduct::CartesianProduct
CartesianProductOperationVariantTpl< Scalar, Options, LieGroupCollectionTpl > CartesianProduct
Definition: cartesian-product-liegroups.cpp:43
pinocchio::LieGroupGenericTpl::name
std::string name() const
Definition: liegroup-generic.hpp:73
pinocchio::LieGroupBase::derived
Derived & derived()
Definition: liegroup-base.hpp:616
joint-generic.hpp
pinocchio::LieGroupBase::nv
Index nv() const
Get dimension of Lie Group tangent space.
liegroup-generic.hpp
pinocchio::LieGroupBase::dIntegrate
void dIntegrate(const Eigen::MatrixBase< Config_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianOut_t > &J, AssignmentOperatorType op=SETTO) const
Computes the Jacobian of a small variation of the configuration vector or the tangent vector into tan...
Definition: liegroup-base.hpp:102
pinocchio::ARG1
@ ARG1
Definition: fwd.hpp:62
pinocchio::LieGroupBase::neutral
ConfigVector_t neutral() const
Get neutral element as a vector.
pinocchio::LieGroupBase::random
void random(const Eigen::MatrixBase< Config_t > &qout) const
Generate a random joint configuration, normalizing quaternions when necessary.
pinocchio::q0
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > & q0
Definition: joint-configuration.hpp:785
pinocchio::LieGroupBase::squaredDistance
Scalar squaredDistance(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1) const
Squared distance between two joint configurations.
PINOCCHIO_COMPILER_DIAGNOSTIC_PUSH
#define PINOCCHIO_COMPILER_DIAGNOSTIC_PUSH
macros for pragma push/pop/ignore deprecated warnings
Definition: include/pinocchio/macros.hpp:94
TestCartesianProduct
Definition: cartesian-product-liegroups.cpp:34
pinocchio::operator<<
std::ostream & operator<<(std::ostream &os, const FrameTpl< Scalar, Options > &f)
Definition: multibody/frame.hpp:151
pinocchio::LieGroupBase
Definition: liegroup-base.hpp:40
collisions.cp
cp
Definition: collisions.py:47
pinocchio::v
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorType > const Eigen::MatrixBase< TangentVectorType > & v
Definition: joint-configuration.hpp:748
pinocchio::LieGroupBase::integrate
void integrate(const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout) const
Integrate a joint's configuration with a tangent vector during one unit time duration.
liegroup.hpp
pinocchio::q1
JointCollectionTpl const Eigen::MatrixBase< ConfigVectorIn1 > const Eigen::MatrixBase< ConfigVectorIn2 > & q1
Definition: joint-configuration.hpp:786
pinocchio::LieGroupBase::difference
void difference(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< Tangent_t > &v) const
Computes the tangent vector that must be integrated during one unit time to go from q0 to q1.
TestCartesianProduct::LieGroupCollection
LieGroupCollectionTpl< Scalar, Options > LieGroupCollection
Definition: cartesian-product-liegroups.cpp:37
pinocchio::VectorSpaceOperationTpl
Definition: vector-space.hpp:15
liegroup-collection.hpp
pinocchio::LieGroupBase::nq
Index nq() const
pinocchio::LieGroupBase::distance
Scalar distance(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1) const
Distance between two configurations of the joint.
pinocchio
Main pinocchio namespace.
Definition: timings.cpp:28


pinocchio
Author(s):
autogenerated on Tue Feb 13 2024 03:43:57