18 #ifndef __se3_lie_group_operation_base_hpp__    19 #define __se3_lie_group_operation_base_hpp__    21 #include "pinocchio/macros.hpp"    22 #include "pinocchio/spatial/fwd.hpp"     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;                             \    38   typedef TYPENAME Base::ConfigVector_t ConfigVector_t;                        \    39   typedef TYPENAME Base::TangentVector_t TangentVector_t;                      \    40   typedef TYPENAME Base::JacobianMatrix_t JacobianMatrix_t    42 #define SE3_LIE_GROUP_PUBLIC_INTERFACE(Derived)                                \    43 SE3_LIE_GROUP_PUBLIC_INTERFACE_GENERIC(Derived,PINOCCHIO_MACRO_EMPTY_ARG)    45 #define SE3_LIE_GROUP_TPL_PUBLIC_INTERFACE(Derived)                            \    46 SE3_LIE_GROUP_PUBLIC_INTERFACE_GENERIC(Derived,typename)    48   template<
typename Derived>
    51     typedef Derived LieGroupDerived;
    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;
    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;
    87     template <
class Config_t, 
class Tangent_t, 
class JacobianOut_t>
    89                        const Eigen::MatrixBase<Tangent_t>  & v,
    90                        const Eigen::MatrixBase<JacobianOut_t>& J) 
const;
   100     template <
class Config_t, 
class Tangent_t, 
class JacobianOut_t>
   102                        const Eigen::MatrixBase<Tangent_t>  & v,
   103                        const Eigen::MatrixBase<JacobianOut_t>& J) 
const;
   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,
   118                      const Eigen::MatrixBase<ConfigOut_t>& qout) 
const;
   126     template <
class Config_t>
   127     void normalize (
const Eigen::MatrixBase<Config_t>& qout) 
const;
   137     template <
class Config_t>
   138     void random (
const Eigen::MatrixBase<Config_t>& qout) 
const;
   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;
   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;
   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;
   191     template <
class ConfigL_t, 
class ConfigR_t>
   193                            const Eigen::MatrixBase<ConfigR_t> & q1) 
const;
   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;
   213     template <
class ConfigL_t, 
class ConfigR_t>
   215                              const Eigen::MatrixBase<ConfigR_t> & q1,
   216                              const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision()) 
const;
   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 ;
   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;
   231     ConfigVector_t random() 
const;
   233     template <
class ConfigL_t, 
class ConfigR_t>
   235     (
const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
   236      const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit) 
const;
   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;
   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,
   251                           const Eigen::MatrixBase<ConfigOut_t>& qout) 
const;
   253     template <
class Config_t>
   254     void normalize_impl(
const Eigen::MatrixBase<Config_t> & qout) 
const;
   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;
   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;
   272     ConfigVector_t 
neutral () 
const;
   275     std::string 
name () 
const;
   279       return static_cast <Derived&> (*this);
   282     const Derived& derived ()
 const   284       return static_cast <
const Derived&> (*this);
   302 #include "pinocchio/multibody/liegroup/operation-base.hxx"   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's configuration with a tangent vector during one unit time duration. 
 
std::string name() const 
Get name of instance. 
 
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'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...