5 #ifndef __pinocchio_multibody_joint_mimic_hpp__ 
    6 #define __pinocchio_multibody_joint_mimic_hpp__ 
    8 #include "pinocchio/multibody/joint/fwd.hpp" 
    9 #include "pinocchio/multibody/joint/joint-collection.hpp" 
   10 #include "pinocchio/macros.hpp" 
   11 #include "pinocchio/multibody/joint/joint-base.hpp" 
   12 #include "pinocchio/multibody/joint/joint-basic-visitors.hpp" 
   16   template<
typename _Scalar, 
int _Options, 
int MaxDim>
 
   17   struct ScaledJointMotionSubspaceTpl;
 
   19   template<
typename _Scalar, 
int _Options, 
int _MaxDim>
 
   45   template<
typename _Scalar, 
int _Options, 
int _MaxDim>
 
   53   template<
typename _Scalar, 
int _Options, 
int _MaxDim, 
typename MotionDerived>
 
   61       MotionDerived>::ReturnType ReturnType;
 
   64   template<
typename _Scalar, 
int _Options, 
int _MaxDim, 
typename ForceDerived>
 
   68       typename ScaledJointMotionSubspaceTpl<_Scalar, _Options, _MaxDim>::RefJointMotionSubspace
 
   69         RefJointMotionSubspace;
 
   71       typename ConstraintForceOp<RefJointMotionSubspace, ForceDerived>::ReturnType RefReturnType;
 
   72     typedef typename ScalarMatrixProduct<_Scalar, RefReturnType>::type ReturnType;
 
   75   template<
typename _Scalar, 
int _Options, 
int _MaxDim, 
typename ForceSet>
 
   79       typename ScaledJointMotionSubspaceTpl<_Scalar, _Options, _MaxDim>::RefJointMotionSubspace
 
   80         RefJointMotionSubspace;
 
   82       typename ConstraintForceSetOp<RefJointMotionSubspace, ForceSet>::ReturnType RefReturnType;
 
   83     typedef typename ScalarMatrixProduct<_Scalar, RefReturnType>::type ReturnType;
 
   86   template<
typename _Scalar, 
int _Options, 
int _MaxDim>
 
   90     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
  102       RefJointMotionSubspace RefJointMotionSubspace;
 
  103     typedef typename SE3GroupAction<RefJointMotionSubspace>::ReturnType SE3ActionReturnType;
 
  107     , m_scaling_factor(Scalar(1))
 
  113     , m_scaling_factor(scaling_factor)
 
  117     template<
typename Constra
intTpl>
 
  119     : m_constraint(constraint)
 
  120     , m_scaling_factor(scaling_factor)
 
  125     : m_constraint(other.m_constraint)
 
  126     , m_scaling_factor(other.m_scaling_factor)
 
  132       m_constraint = other.m_constraint;
 
  133       m_scaling_factor = other.m_scaling_factor;
 
  137     template<
typename VectorLike>
 
  138     JointMotion __mult__(
const Eigen::MatrixBase<VectorLike> & v)
 const 
  141       assert(v.size() == nv());
 
  142       JointMotion jm = m_constraint * v;
 
  143       return m_scaling_factor * jm;
 
  146     template<
typename S1, 
int O1>
 
  149       return m_scaling_factor * m_constraint.se3Action(m);
 
  152     template<
typename S1, 
int O1>
 
  153     SE3ActionReturnType se3ActionInverse(
const SE3Tpl<S1, O1> & m)
 const 
  155       return m_scaling_factor * m_constraint.se3ActionInverse(m);
 
  160       return m_constraint.nv();
 
  171       template<
typename Derived>
 
  175         return ref.m_scaling_factor * (ref.m_constraint.transpose() * f);
 
  179       template<
typename Derived>
 
  180       typename ConstraintForceSetOp<ScaledJointMotionSubspaceTpl, Derived>::ReturnType
 
  183         return ref.m_scaling_factor * (ref.m_constraint.transpose() * F);
 
  188     TransposeConst transpose()
 const 
  190       return TransposeConst(*
this);
 
  193     const DenseBase & matrix_impl()
 const 
  195       S = m_scaling_factor * m_constraint.matrix_impl();
 
  199     DenseBase & matrix_impl()
 
  201       S = m_scaling_factor * m_constraint.matrix_impl();
 
  205     template<
typename MotionDerived>
 
  206     typename MotionAlgebraAction<ScaledJointMotionSubspaceTpl, MotionDerived>::ReturnType
 
  207     motionAction(
const MotionDense<MotionDerived> & m)
 const 
  209       return m_scaling_factor * m_constraint.motionAction(m);
 
  212     inline const Scalar & scaling()
 const 
  214       return m_scaling_factor;
 
  216     inline Scalar & scaling()
 
  218       return m_scaling_factor;
 
  221     inline const RefJointMotionSubspace & constraint()
 const 
  223       return m_constraint.derived();
 
  225     inline RefJointMotionSubspace & constraint()
 
  227       return m_constraint.derived();
 
  230     bool isEqual(
const ScaledJointMotionSubspaceTpl & other)
 const 
  232       return m_constraint == other.m_constraint && m_scaling_factor == other.m_scaling_factor;
 
  236     RefJointMotionSubspace m_constraint;
 
  237     Scalar m_scaling_factor;
 
  241   template<
typename S1, 
int O1, 
typename S2, 
int O2, 
int MD2>
 
  246     typedef typename Constraint::Scalar Scalar;
 
  248     typedef Eigen::Matrix<S2, 6, Eigen::Dynamic, O2, 6, MD2> ReturnType;
 
  254     template<
typename S1, 
int O1, 
typename S2, 
int O2, 
int MD2>
 
  261       static inline ReturnType run(
const Inertia & Y, 
const Constraint & scaled_constraint)
 
  263         return scaled_constraint.scaling() * (Y * scaled_constraint.constraint());
 
  268   template<
typename M6Like, 
typename S2, 
int O2, 
int MD2>
 
  272     typedef Eigen::Matrix<S2, 6, Eigen::Dynamic, O2, 6, MD2> ReturnType;
 
  278     template<
typename M6Like, 
typename S2, 
int O2, 
int MD2>
 
  285       static inline ReturnType
 
  286       run(
const Eigen::MatrixBase<M6Like> & Y, 
const Constraint & scaled_constraint)
 
  288         return scaled_constraint.scaling() * (Y.derived() * scaled_constraint.constraint());
 
  293   template<
typename Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  295   template<
typename Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  297   template<
typename Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  300   template<
typename _Scalar, 
int _Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  303     typedef _Scalar Scalar;
 
  310       NVExtended = Eigen::Dynamic,
 
  314     typedef JointCollectionTpl<Scalar, Options> JointCollection;
 
  324     typedef Eigen::Matrix<Scalar, 6, Eigen::Dynamic, Options> U_t;
 
  325     typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, Options> D_t;
 
  326     typedef Eigen::Matrix<Scalar, 6, Eigen::Dynamic, Options> UD_t;
 
  336     typedef U_t UTypeConstRef;
 
  337     typedef U_t UTypeRef;
 
  338     typedef D_t DTypeConstRef;
 
  339     typedef D_t DTypeRef;
 
  340     typedef UD_t UDTypeConstRef;
 
  341     typedef UD_t UDTypeRef;
 
  343     typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1, Options> ConfigVector_t;
 
  344     typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1, Options> TangentVector_t;
 
  346     typedef const ConfigVector_t & ConfigVectorTypeConstRef;
 
  347     typedef ConfigVector_t & ConfigVectorTypeRef;
 
  348     typedef const TangentVector_t TangentVectorTypeConstRef;
 
  349     typedef TangentVector_t & TangentVectorTypeRef;
 
  351     typedef boost::mpl::false_ is_mimicable_t;
 
  354   template<
typename _Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  358     typedef _Scalar Scalar;
 
  361   template<
typename _Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  365     typedef _Scalar Scalar;
 
  368   template<
typename _Scalar, 
int _Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  370   : 
public JointDataBase<JointDataMimicTpl<_Scalar, _Options, JointCollectionTpl>>
 
  372     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
  379     typedef typename RefJointData::JointDataVariant RefJointDataVariant;
 
  391       const RefJointData & jdata, 
const Scalar & scaling, 
const int & 
nq, 
const int & 
nv)
 
  392     : m_jdata_mimicking(checkMimic(jdata.derived()))
 
  393     , S(m_jdata_mimicking.S(), scaling)
 
  408       m_jdata_mimicking = other.m_jdata_mimicking;
 
  413       S = Constraint_t(other.S);
 
  420       return Base::isEqual(other) && m_jdata_mimicking == other.m_jdata_mimicking
 
  425     static std::string classname()
 
  427       return std::string(
"JointDataMimic");
 
  430     std::string shortname()
 const 
  436     ConstraintTypeConstRef S_accessor()
 const 
  440     ConstraintTypeRef S_accessor()
 
  445     Transformation_t M_accessor()
 const 
  447       return m_jdata_mimicking.M();
 
  450     Motion_t v_accessor()
 const 
  452       return m_jdata_mimicking.v();
 
  455     Bias_t c_accessor()
 const 
  457       return m_jdata_mimicking.c();
 
  460     U_t U_accessor()
 const 
  462       return m_jdata_mimicking.U();
 
  465     D_t Dinv_accessor()
 const 
  467       return m_jdata_mimicking.Dinv();
 
  470     UD_t UDinv_accessor()
 const 
  472       return m_jdata_mimicking.UDinv();
 
  475     D_t StU_accessor()
 const 
  477       return m_jdata_mimicking.StU();
 
  484       return m_jdata_mimicking;
 
  488       return m_jdata_mimicking;
 
  491     ConfigVectorTypeRef joint_q_accessor()
 
  495     ConfigVectorTypeConstRef joint_q_accessor()
 const 
  500     ConfigVector_t & q_transformed()
 
  504     const ConfigVector_t & q_transformed()
 const 
  508     TangentVectorTypeRef joint_v_accessor()
 
  512     TangentVectorTypeConstRef joint_v_accessor()
 const 
  517     TangentVector_t & v_transformed()
 
  521     const TangentVector_t & v_transformed()
 const 
  526     void disp(std::ostream & os)
 const 
  529       os << 
"  Mimicking joint data: " << m_jdata_mimicking.shortname() << std::endl;
 
  550     template<
typename S, 
int O> 
class JointCollectionTpl>
 
  556   template<
typename _Scalar, 
int _Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  558   : 
public JointModelBase<JointModelMimicTpl<_Scalar, _Options, JointCollectionTpl>>
 
  560     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
  570     typedef JointCollectionTpl<Scalar, Options> JointCollection;
 
  580     using Base::idx_vExtended;
 
  583     using Base::nvExtended;
 
  584     using Base::setIndexes;
 
  590     template<
typename Jo
intModel>
 
  597     template<
typename Jo
intModelMimicking, 
typename Jo
intModelMimicked>
 
  601       const Scalar & scaling,
 
  602       const Scalar & offset)
 
  603     : m_jmodel_mimicking(checkMimic((
JointModel)jmodel_mimicking.derived()))
 
  606     , m_nqExtended(jmodel_mimicking.nq())
 
  607     , m_nvExtended(jmodel_mimicking.nvExtended())
 
  609       assert(jmodel_mimicking.nq() == jmodel_mimicked.nq());
 
  610       assert(jmodel_mimicking.nv() == jmodel_mimicked.nv());
 
  611       assert(jmodel_mimicking.nvExtended() == jmodel_mimicked.nvExtended());
 
  614         jmodel_mimicked.id(), jmodel_mimicked.idx_q(), jmodel_mimicked.idx_v(),
 
  615         jmodel_mimicked.idx_vExtended());
 
  620       return *
static_cast<Base *
>(
this);
 
  622     const Base & base()
 const 
  624       return *
static_cast<const Base *
>(
this);
 
  627     inline int nq_impl()
 const 
  631     inline int nv_impl()
 const 
  635     inline int nvExtended_impl()
 const 
  648         (
id > m_jmodel_mimicking.id()), std::invalid_argument,
 
  649         "Mimic joint index is lower than its directing joint. Should never happen");
 
  653       Base::i_vExtended = vExtended;
 
  669       m_jmodel_mimicking.setIndexes(
id, 0, 0, vExtended);
 
  676     JointDataDerived createData()
 const 
  678       return JointDataDerived(
 
  679         m_jmodel_mimicking.createData(), scaling(), m_nqExtended, m_nvExtended);
 
  682     const std::vector<bool> hasConfigurationLimit()
 const 
  684       return m_jmodel_mimicking.hasConfigurationLimit();
 
  687     const std::vector<bool> hasConfigurationLimitInTangent()
 const 
  689       return m_jmodel_mimicking.hasConfigurationLimitInTangent();
 
  692     template<
typename ConfigVector>
 
  693     PINOCCHIO_DONT_INLINE 
void 
  694     calc(JointDataDerived & jdata, 
const typename Eigen::MatrixBase<ConfigVector> & qs)
 const 
  696       jdata.joint_q = qs.segment(Base::i_q, m_nqExtended);
 
  698         m_jmodel_mimicking, jdata.joint_q, m_scaling, m_offset, jdata.joint_q_transformed);
 
  699       m_jmodel_mimicking.calc(jdata.m_jdata_mimicking, jdata.joint_q_transformed);
 
  702     template<
typename ConfigVector, 
typename TangentVector>
 
  703     PINOCCHIO_DONT_INLINE 
void calc(
 
  704       JointDataDerived & jdata,
 
  705       const typename Eigen::MatrixBase<ConfigVector> & qs,
 
  706       const typename Eigen::MatrixBase<TangentVector> & vs)
 const 
  708       jdata.joint_q = qs.segment(Base::i_q, m_nqExtended);
 
  709       jdata.joint_v = vs.segment(Base::i_v, m_nvExtended);
 
  711         m_jmodel_mimicking, jdata.joint_q, m_scaling, m_offset, jdata.joint_q_transformed);
 
  712       jdata.joint_v_transformed = m_scaling * jdata.joint_v;
 
  714       m_jmodel_mimicking.calc(
 
  715         jdata.m_jdata_mimicking, jdata.joint_q_transformed, jdata.joint_v_transformed);
 
  718     template<
typename VectorLike, 
typename Matrix6Like>
 
  721       const Eigen::MatrixBase<VectorLike> &,
 
  722       const Eigen::MatrixBase<Matrix6Like> &,
 
  727         && 
"Joint Mimic is not supported for aba yet. Remove it from your model if you want to use " 
  731     static std::string classname()
 
  733       return std::string(
"JointModelMimic");
 
  736     std::string shortname()
 const 
  742     template<
typename NewScalar>
 
  747         m_jmodel_mimicking.template cast<NewScalar>(),
 
  750       res.setIndexes(
id(), Base::i_q, Base::i_v, Base::i_vExtended);
 
  751       res.setMimicIndexes(m_jmodel_mimicking.id(), Base::i_q, Base::i_v, Base::i_vExtended);
 
  757       return m_jmodel_mimicking;
 
  759     JointModel & jmodel()
 
  761       return m_jmodel_mimicking;
 
  764     const Scalar & scaling()
 const 
  773     const Scalar & offset()
 const 
  784     JointModel m_jmodel_mimicking;
 
  785     Scalar m_scaling, m_offset;
 
  786     int m_nqExtended, m_nvExtended;
 
  792     typename SizeDepType<NQ>::template SegmentReturn<D>::ConstType
 
  793     JointMappedConfigSelector_impl(
const Eigen::MatrixBase<D> & a)
 const 
  795       return SizeDepType<NQ>::segment(a.derived(), Base::i_q, m_nqExtended);
 
  800     typename SizeDepType<NQ>::template SegmentReturn<D>::Type
 
  801     JointMappedConfigSelector_impl(Eigen::MatrixBase<D> & a)
 const 
  803       return SizeDepType<NQ>::segment(a.derived(), Base::i_q, m_nqExtended);
 
  808     typename SizeDepType<NQ>::template SegmentReturn<D>::ConstType
 
  809     JointMappedVelocitySelector_impl(
const Eigen::MatrixBase<D> & a)
 const 
  811       return SizeDepType<NQ>::segment(a.derived(), Base::i_v, m_nvExtended);
 
  816     typename SizeDepType<NQ>::template SegmentReturn<D>::Type
 
  817     JointMappedVelocitySelector_impl(Eigen::MatrixBase<D> & a)
 const 
  819       return SizeDepType<NQ>::segment(a.derived(), Base::i_v, m_nvExtended);
 
  825     typename SizeDepType<NV>::template ColsReturn<D>::ConstType
 
  826     jointCols_impl(
const Eigen::MatrixBase<D> & A)
 const 
  828       return SizeDepType<NV>::middleCols(A.derived(), Base::i_v, m_nvExtended);
 
  833     typename SizeDepType<NV>::template ColsReturn<D>::Type
 
  834     jointCols_impl(Eigen::MatrixBase<D> & A)
 const 
  836       return SizeDepType<NV>::middleCols(A.derived(), Base::i_v, m_nvExtended);
 
  842     typename SizeDepType<NV>::template RowsReturn<D>::ConstType
 
  843     jointRows_impl(
const Eigen::MatrixBase<D> & A)
 const 
  845       return SizeDepType<NV>::middleRows(A.derived(), Base::i_v, m_nvExtended);
 
  850     typename SizeDepType<NV>::template RowsReturn<D>::Type
 
  851     jointRows_impl(Eigen::MatrixBase<D> & A)
 const 
  853       return SizeDepType<NV>::middleRows(A.derived(), Base::i_v, m_nvExtended);
 
  860     typename SizeDepType<NV>::template BlockReturn<D>::ConstType
 
  861     jointBlock_impl(
const Eigen::MatrixBase<D> & Mat)
 const 
  863       return SizeDepType<NV>::block(
 
  864         Mat.derived(), Base::i_v, Base::i_v, m_nvExtended, m_nvExtended);
 
  869     typename SizeDepType<NV>::template BlockReturn<D>::Type
 
  870     jointBlock_impl(Eigen::MatrixBase<D> & Mat)
 const 
  872       return SizeDepType<NV>::block(
 
  873         Mat.derived(), Base::i_v, Base::i_v, m_nvExtended, m_nvExtended);
 
  876     void disp(std::ostream & os)
 const 
  879       os << 
"  Mimicking joint type: " << m_jmodel_mimicking.shortname() << std::endl;
 
  880       os << 
"  Mimicked joint id: " << m_jmodel_mimicking.id() << std::endl;
 
  881       os << 
"  Mimic scaling: " << m_scaling << std::endl;
 
  882       os << 
"  Mimic offset: " << m_offset << std::endl;
 
  889 #include <boost/type_traits.hpp> 
  893   template<
typename Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  894   struct has_nothrow_constructor<
 
  896   : 
public integral_constant<bool, true>
 
  900   template<
typename Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  902   : 
public integral_constant<bool, true>
 
  906   template<
typename Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  907   struct has_nothrow_constructor<
 
  909   : 
public integral_constant<bool, true>
 
  913   template<
typename Scalar, 
int Options, 
template<
typename S, 
int O> 
class JointCollectionTpl>
 
  915   : 
public integral_constant<bool, true>
 
Main pinocchio namespace.
 
JointIndex id(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointIdVisitor to get the index of the joint in the kinematic chain.
 
int nv(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNvVisitor to get the dimension of the joint tangent space.
 
int nq(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel)
Visit a JointModelTpl through JointNqVisitor to get the dimension of the joint configuration space.
 
void configVectorAffineTransform(const JointModelTpl< Scalar, Options, JointCollectionTpl > &jmodel, const Eigen::MatrixBase< ConfigVectorIn > &qIn, const Scalar &scaling, const Scalar &offset, const Eigen::MatrixBase< ConfigVectorOut > &qOut)
Apply the correct affine transform, on a joint configuration, depending on the joint type.
 
Type of the cast of a class C templated by Scalar and Options, to a new NewScalar type....
 
Return type of the Constraint::Transpose * Force operation.
 
Return type of the Constraint::Transpose * ForceSet operation.
 
bool isEqual(const JointDataBase< Derived > &other) const
 
 
ConfigVector_t joint_q
original configuration vector
 
TangentVector_t joint_v
original velocity vector
 
bool isEqual(const JointDataBase< Derived > &other) const
 
 
TangentVector_t joint_v_transformed
Transform velocity vector.
 
ConfigVector_t joint_q_transformed
Transformed configuration vector.
 
void setMimicIndexes(JointIndex id, int q, int v, int vExtended)
Specific way for mimic joints to set the mimicked q,v indexes. Used for manipulating tree (e....
 
void setIndexes_impl(JointIndex id, int, int, int vExtended)
 
CastType< NewScalar, JointModelMimicTpl >::type cast() const
 
Return type of the ation of a Motion onto an object of type D.
 
Forward declaration of the multiplication operation return type. Should be overloaded,...
 
Cast scalar type from type FROM to type TO.
 
ConstraintForceSetOp< ScaledJointMotionSubspaceTpl, Derived >::ReturnType operator*(const Eigen::MatrixBase< Derived > &F) const
[CRBA] MatrixBase operator* (RefConstraint::Transpose S, ForceSet::Block)
 
Common traits structure to fully define base classes for CRTP.