18 #ifndef __se3_lie_group_operation_base_hxx__    19 #define __se3_lie_group_operation_base_hxx__    21 #include "pinocchio/macros.hpp"    27   template <
class Derived>
    28   template <
class ConfigIn_t, 
class Tangent_t, 
class ConfigOut_t>
    30       const Eigen::MatrixBase<ConfigIn_t> & q,
    31       const Eigen::MatrixBase<Tangent_t>  & v,
    32       const Eigen::MatrixBase<ConfigOut_t>& qout)
 const    34     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigIn_t , ConfigVector_t);
    35     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Tangent_t  , TangentVector_t);
    36     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigOut_t, ConfigVector_t);
    37     derived().integrate_impl(q, v, qout);
    40   template <
class Derived>
    41   template <
class Config_t, 
class Tangent_t, 
class JacobianOut_t>
    43       const Eigen::MatrixBase<Config_t >  & q,
    44       const Eigen::MatrixBase<Tangent_t>  & v,
    45       const Eigen::MatrixBase<JacobianOut_t>& J)
 const    47     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Config_t     , ConfigVector_t);
    48     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Tangent_t    , TangentVector_t);
    49     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(JacobianOut_t, JacobianMatrix_t);
    50     derived().dIntegrate_dq_impl(q, v, J);
    53   template <
class Derived>
    54   template <
class Config_t, 
class Tangent_t, 
class JacobianOut_t>
    56       const Eigen::MatrixBase<Config_t >  & q,
    57       const Eigen::MatrixBase<Tangent_t>  & v,
    58       const Eigen::MatrixBase<JacobianOut_t>& J)
 const    60     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Config_t     , ConfigVector_t);
    61     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Tangent_t    , TangentVector_t);
    62     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(JacobianOut_t, JacobianMatrix_t);
    63     derived().dIntegrate_dv_impl(q, v, J);
    75   template <
class Derived>
    76   template <
class ConfigL_t, 
class ConfigR_t, 
class ConfigOut_t>
    78       const Eigen::MatrixBase<ConfigL_t> & q0,
    79       const Eigen::MatrixBase<ConfigR_t> & q1,
    81       const Eigen::MatrixBase<ConfigOut_t>& qout)
 const    83     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t  , ConfigVector_t);
    84     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t  , ConfigVector_t);
    85     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigOut_t, ConfigVector_t);
    86     Derived().interpolate_impl(q0, q1, u, qout);
    89   template <
class Derived>
    90   template <
class Config_t>
    92   (
const Eigen::MatrixBase<Config_t>& qout) 
const    94     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Config_t, ConfigVector_t);
    95     return derived().normalize_impl (qout);
   106   template <
class Derived>
   107   template <
class Config_t>
   109   (
const Eigen::MatrixBase<Config_t>& qout) 
const   111     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Config_t, ConfigVector_t);
   112     return derived().random_impl (qout);
   115   template <
class Derived>
   116   template <
class ConfigL_t, 
class ConfigR_t, 
class ConfigOut_t>
   118       const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
   119       const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit,
   120       const Eigen::MatrixBase<ConfigOut_t> & qout)
 const   122     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t  , ConfigVector_t);
   123     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t  , ConfigVector_t);
   124     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigOut_t, ConfigVector_t);
   125     derived ().randomConfiguration_impl(lower_pos_limit, upper_pos_limit, qout);
   128   template <
class Derived>
   129   template <
class ConfigL_t, 
class ConfigR_t, 
class Tangent_t>
   131       const Eigen::MatrixBase<ConfigL_t> & q0,
   132       const Eigen::MatrixBase<ConfigR_t> & q1,
   133       const Eigen::MatrixBase<Tangent_t>& d)
 const   135     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t, ConfigVector_t);
   136     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t, ConfigVector_t);
   137     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Tangent_t, TangentVector_t);
   138     derived().difference_impl(q0, q1, d);
   141   template <
class Derived>
   142   template <
class ConfigL_t, 
class ConfigR_t, 
class JacobianLOut_t, 
class JacobianROut_t>
   144       const Eigen::MatrixBase<ConfigL_t> & q0,
   145       const Eigen::MatrixBase<ConfigR_t> & q1,
   146       const Eigen::MatrixBase<JacobianLOut_t>& J0,
   147       const Eigen::MatrixBase<JacobianROut_t>& J1)
 const   149     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t, ConfigVector_t);
   150     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t, ConfigVector_t);
   151     EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(JacobianLOut_t, JacobianMatrix_t);
   152     EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(JacobianROut_t, JacobianMatrix_t);
   153     derived().Jdifference_impl (q0, q1, J0, J1);
   156   template <
class Derived>
   157   template <
class ConfigL_t, 
class ConfigR_t>
   158   typename LieGroupBase<Derived>::Scalar
   160       const Eigen::MatrixBase<ConfigL_t> & q0,
   161       const Eigen::MatrixBase<ConfigR_t> & q1)
 const   163     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t, ConfigVector_t);
   164     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t, ConfigVector_t);
   165     return derived().squaredDistance_impl(q0, q1);
   168   template <
class Derived>
   169   template <
class ConfigL_t, 
class ConfigR_t>
   170   typename LieGroupBase<Derived>::Scalar
   172       const Eigen::MatrixBase<ConfigL_t> & q0,
   173       const Eigen::MatrixBase<ConfigR_t> & q1)
 const   178   template <
class Derived>
   179   template <
class ConfigL_t, 
class ConfigR_t>
   181       const Eigen::MatrixBase<ConfigL_t> & q0,
   182       const Eigen::MatrixBase<ConfigR_t> & q1,
   183       const Scalar & prec)
 const   185     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigL_t, ConfigVector_t);
   186     EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigR_t, ConfigVector_t);
   187     return derived().isSameConfiguration_impl(q0, q1, prec);
   193   template <
class Derived>
   194   template <
class Config_t, 
class Tangent_t>
   195   typename LieGroupBase<Derived>::ConfigVector_t
   197                                             const Eigen::MatrixBase<Tangent_t> & v)
 const   204   template <
class Derived>
   205   template <
class ConfigL_t, 
class ConfigR_t>
   207       const Eigen::MatrixBase<ConfigL_t> & q0,
   208       const Eigen::MatrixBase<ConfigR_t> & q1,
   209       const Scalar& u)
 const   216   template <
class Derived>
   217   typename LieGroupBase<Derived>::ConfigVector_t
   225   template <
class Derived>
   226   template <
class ConfigL_t, 
class ConfigR_t>
   227   typename LieGroupBase<Derived>::ConfigVector_t
   229   (
const Eigen::MatrixBase<ConfigL_t> & lower_pos_limit,
   230    const Eigen::MatrixBase<ConfigR_t> & upper_pos_limit)
 const   237   template <
class Derived>
   238   template <
class ConfigL_t, 
class ConfigR_t>
   240       const Eigen::MatrixBase<ConfigL_t> & q0,
   241       const Eigen::MatrixBase<ConfigR_t> & q1)
 const   243     TangentVector_t diff;
   249   template <
class Derived>
   250   template <
class ConfigL_t, 
class ConfigR_t, 
class ConfigOut_t>
   252       const Eigen::MatrixBase<ConfigL_t> & q0,
   253       const Eigen::MatrixBase<ConfigR_t> & q1,
   255       const Eigen::MatrixBase<ConfigOut_t>& qout)
 const   257     if     (u == 0) 
const_cast<Eigen::MatrixBase<ConfigOut_t>&
>(qout) = q0;
   258     else if(u == 1) 
const_cast<Eigen::MatrixBase<ConfigOut_t>&
>(qout) = q1;
   261       TangentVector_t vdiff(u * 
difference(q0, q1));
   266   template <
class Derived>
   267   template <
class ConfigL_t, 
class ConfigR_t>
   268   typename LieGroupBase<Derived>::Scalar
   270       const Eigen::MatrixBase<ConfigL_t> & q0,
   271       const Eigen::MatrixBase<ConfigR_t> & q1)
 const   275     return t.squaredNorm();
   278   template <
class Derived>
   279   template <
class ConfigL_t, 
class ConfigR_t>
   281       const Eigen::MatrixBase<ConfigL_t> & q0,
   282       const Eigen::MatrixBase<ConfigR_t> & q1,
   283       const Scalar & prec)
 const   285     return q0.isApprox(q1, prec);
   288   template <
class Derived>
   289   typename LieGroupBase <Derived>::Index
   292     return derived().
nq();
   295   template <
class Derived>
   296   typename LieGroupBase <Derived>::Index
   299     return derived().
nv();
   302   template <
class Derived>
   303   typename LieGroupBase <Derived>::ConfigVector_t
   309   template <
class Derived>
   312     return derived().
name();
   317 #endif // __se3_lie_group_operation_base_hxx__ 
Eigen::VectorXd squaredDistance(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1)
Squared distance between two configuration vectors. 
 
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. 
 
Eigen::VectorXd difference(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1)
Compute the tangent vector that must be integrated during one unit time to go from q0 to q1...
 
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. 
 
Eigen::VectorXd interpolate(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1, const double u)
Interpolate the model between two configurations. 
 
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. 
 
Eigen::VectorXd integrate(const Model &model, const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Integrate a configuration for the specified model for a tangent vector during one unit time...
 
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. 
 
Eigen::VectorXd randomConfiguration(const Model &model, const Eigen::VectorXd &lowerLimits, const Eigen::VectorXd &upperLimits)
Generate a configuration vector uniformly sampled among provided limits. 
 
Index nv() const 
Get dimension of Lie Group tangent space. 
 
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...