pinocchio  UNKNOWN
operation-base.hpp
1 //
2 // Copyright (c) 2016-2018 CNRS
3 //
4 // This file is part of Pinocchio
5 // Pinocchio is free software: you can redistribute it
6 // and/or modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation, either version
8 // 3 of the License, or (at your option) any later version.
9 //
10 // Pinocchio is distributed in the hope that it will be
11 // useful, but WITHOUT ANY WARRANTY; without even the implied warranty
12 // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Lesser Public License for more details. You should have
14 // received a copy of the GNU Lesser General Public License along with
15 // Pinocchio If not, see
16 // <http://www.gnu.org/licenses/>.
17 
18 #ifndef __se3_lie_group_operation_base_hpp__
19 #define __se3_lie_group_operation_base_hpp__
20 
21 #include "pinocchio/macros.hpp"
22 #include "pinocchio/spatial/fwd.hpp" // struct traits
23 
24 #include <Eigen/Core>
25 #include <limits>
26 
27 namespace se3
28 {
29 
30 #define SE3_LIE_GROUP_PUBLIC_INTERFACE_GENERIC(Derived,TYPENAME) \
31  typedef LieGroupBase<Derived> Base; \
32  typedef TYPENAME Base::Index Index; \
33  typedef TYPENAME traits<Derived>::Scalar Scalar; \
34  enum { \
35  NQ = Base::NQ, \
36  NV = Base::NV \
37  }; \
38  typedef TYPENAME Base::ConfigVector_t ConfigVector_t; \
39  typedef TYPENAME Base::TangentVector_t TangentVector_t; \
40  typedef TYPENAME Base::JacobianMatrix_t JacobianMatrix_t
41 
42 #define SE3_LIE_GROUP_PUBLIC_INTERFACE(Derived) \
43 SE3_LIE_GROUP_PUBLIC_INTERFACE_GENERIC(Derived,PINOCCHIO_MACRO_EMPTY_ARG)
44 
45 #define SE3_LIE_GROUP_TPL_PUBLIC_INTERFACE(Derived) \
46 SE3_LIE_GROUP_PUBLIC_INTERFACE_GENERIC(Derived,typename)
47 
48  template<typename Derived>
49  struct LieGroupBase
50  {
51  typedef Derived LieGroupDerived;
52  typedef int Index;
53  typedef typename traits<LieGroupDerived>::Scalar Scalar;
54  enum {
57  };
58 
59  typedef Eigen::Matrix<Scalar,NQ,1> ConfigVector_t;
60  typedef Eigen::Matrix<Scalar,NV,1> TangentVector_t;
61  typedef Eigen::Matrix<Scalar,NV,NV> JacobianMatrix_t;
62 
65 
74  template <class ConfigIn_t, class Tangent_t, class ConfigOut_t>
75  void integrate(const Eigen::MatrixBase<ConfigIn_t> & q,
76  const Eigen::MatrixBase<Tangent_t> & v,
77  const Eigen::MatrixBase<ConfigOut_t>& qout) const;
78 
87  template <class Config_t, class Tangent_t, class JacobianOut_t>
88  void dIntegrate_dq(const Eigen::MatrixBase<Config_t > & q,
89  const Eigen::MatrixBase<Tangent_t> & v,
90  const Eigen::MatrixBase<JacobianOut_t>& J) const;
91 
100  template <class Config_t, class Tangent_t, class JacobianOut_t>
101  void dIntegrate_dv(const Eigen::MatrixBase<Config_t > & q,
102  const Eigen::MatrixBase<Tangent_t> & v,
103  const Eigen::MatrixBase<JacobianOut_t>& J) const;
104 
114  template <class ConfigL_t, class ConfigR_t, class ConfigOut_t>
115  void interpolate(const Eigen::MatrixBase<ConfigL_t> & q0,
116  const Eigen::MatrixBase<ConfigR_t> & q1,
117  const Scalar& u,
118  const Eigen::MatrixBase<ConfigOut_t>& qout) const;
119 
126  template <class Config_t>
127  void normalize (const Eigen::MatrixBase<Config_t>& qout) const;
128 
137  template <class Config_t>
138  void random (const Eigen::MatrixBase<Config_t>& qout) const;
139 
149  template <class ConfigL_t, class ConfigR_t, class ConfigOut_t>
151  (const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
152  const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit,
153  const Eigen::MatrixBase<ConfigOut_t> & qout) const;
154 
163  template <class ConfigL_t, class ConfigR_t, class Tangent_t>
164  void difference(const Eigen::MatrixBase<ConfigL_t> & q0,
165  const Eigen::MatrixBase<ConfigR_t> & q1,
166  const Eigen::MatrixBase<Tangent_t>& v) const;
167 
177  template <class ConfigL_t, class ConfigR_t, class JacobianLOut_t, class JacobianROut_t>
178  void Jdifference(const Eigen::MatrixBase<ConfigL_t> & q0,
179  const Eigen::MatrixBase<ConfigR_t> & q1,
180  const Eigen::MatrixBase<JacobianLOut_t>& J0,
181  const Eigen::MatrixBase<JacobianROut_t>& J1) const;
182 
191  template <class ConfigL_t, class ConfigR_t>
192  Scalar squaredDistance(const Eigen::MatrixBase<ConfigL_t> & q0,
193  const Eigen::MatrixBase<ConfigR_t> & q1) const;
194 
203  template <class ConfigL_t, class ConfigR_t>
204  Scalar distance(const Eigen::MatrixBase<ConfigL_t> & q0,
205  const Eigen::MatrixBase<ConfigR_t> & q1) const;
206 
213  template <class ConfigL_t, class ConfigR_t>
214  bool isSameConfiguration(const Eigen::MatrixBase<ConfigL_t> & q0,
215  const Eigen::MatrixBase<ConfigR_t> & q1,
216  const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision()) const;
218 
221 
222  template <class Config_t, class Tangent_t>
223  ConfigVector_t integrate(const Eigen::MatrixBase<Config_t> & q,
224  const Eigen::MatrixBase<Tangent_t> & v) const ;
225 
226  template <class ConfigL_t, class ConfigR_t>
227  ConfigVector_t interpolate(const Eigen::MatrixBase<ConfigL_t> & q0,
228  const Eigen::MatrixBase<ConfigR_t> & q1,
229  const Scalar& u) const;
230 
231  ConfigVector_t random() const;
232 
233  template <class ConfigL_t, class ConfigR_t>
234  ConfigVector_t randomConfiguration
235  (const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
236  const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit) const;
237 
238  template <class ConfigL_t, class ConfigR_t>
239  TangentVector_t difference(const Eigen::MatrixBase<ConfigL_t> & q0,
240  const Eigen::MatrixBase<ConfigR_t> & q1) const;
242 
243 
246 
247  template <class ConfigL_t, class ConfigR_t, class ConfigOut_t>
248  void interpolate_impl(const Eigen::MatrixBase<ConfigL_t> & q0,
249  const Eigen::MatrixBase<ConfigR_t> & q1,
250  const Scalar& u,
251  const Eigen::MatrixBase<ConfigOut_t>& qout) const;
252 
253  template <class Config_t>
254  void normalize_impl(const Eigen::MatrixBase<Config_t> & qout) const;
255 
256  template <class ConfigL_t, class ConfigR_t>
257  Scalar squaredDistance_impl(const Eigen::MatrixBase<ConfigL_t> & q0,
258  const Eigen::MatrixBase<ConfigR_t> & q1) const;
259 
260  template <class ConfigL_t, class ConfigR_t>
261  bool isSameConfiguration_impl(const Eigen::MatrixBase<ConfigL_t> & q0,
262  const Eigen::MatrixBase<ConfigR_t> & q1,
263  const Scalar & prec) const;
268  Index nq () const;
270  Index nv () const;
272  ConfigVector_t neutral () const;
273 
275  std::string name () const;
276 
277  Derived& derived ()
278  {
279  return static_cast <Derived&> (*this);
280  }
281 
282  const Derived& derived () const
283  {
284  return static_cast <const Derived&> (*this);
285  }
287 
288  protected:
293 
297  LieGroupBase( const LieGroupBase & /*clone*/) {}
298  }; // struct LieGroupBase
299 
300 } // namespace se3
301 
302 #include "pinocchio/multibody/liegroup/operation-base.hxx"
303 
304 #endif // ifndef __se3_lie_group_operation_base_hpp__
LieGroupBase(const LieGroupBase &)
Scalar distance(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1) const
Distance between two configurations of the joint.
void normalize(const Eigen::MatrixBase< Config_t > &qout) const
Normalize the joint configuration given as input. For instance, the quaternion must be unitary...
void integrate(const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout) const
Integrate a joint&#39;s configuration with a tangent vector during one unit time duration.
std::string name() const
Get name of instance.
Index nq() const
void interpolate(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Scalar &u, const Eigen::MatrixBase< ConfigOut_t > &qout) const
Interpolation between two joint&#39;s configurations.
void dIntegrate_dq(const Eigen::MatrixBase< Config_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianOut_t > &J) const
Computes the Jacobian of the Integrate operation.
Scalar squaredDistance(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1) const
Squared distance between two joint configurations.
bool isSameConfiguration(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Scalar &prec=Eigen::NumTraits< Scalar >::dummy_precision()) const
Check if two configurations are equivalent within the given precision.
void randomConfiguration(const Eigen::MatrixBase< ConfigL_t > &lower_pos_limit, const Eigen::MatrixBase< ConfigR_t > &upper_pos_limit, const Eigen::MatrixBase< ConfigOut_t > &qout) const
Generate a configuration vector uniformly sampled among provided limits.
Index nv() const
Get dimension of Lie Group tangent space.
void random(const Eigen::MatrixBase< Config_t > &qout) const
Generate a random joint configuration, normalizing quaternions when necessary.
ConfigVector_t neutral() const
Get neutral element as a vector.
void dIntegrate_dv(const Eigen::MatrixBase< Config_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< JacobianOut_t > &J) const
Computes the Jacobian of the Integrate operation.
void Jdifference(const Eigen::MatrixBase< ConfigL_t > &q0, const Eigen::MatrixBase< ConfigR_t > &q1, const Eigen::MatrixBase< JacobianLOut_t > &J0, const Eigen::MatrixBase< JacobianROut_t > &J1) const
Computes the Jacobian of the difference operation.
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...