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.