87 struct ScaledJointMotionSubspaceTpl
90 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
92 PINOCCHIO_CONSTRAINT_TYPEDEF_TPL(ScaledJointMotionSubspaceTpl)
102 RefJointMotionSubspace RefJointMotionSubspace;
103 typedef typename SE3GroupAction<RefJointMotionSubspace>::ReturnType SE3ActionReturnType;
105 ScaledJointMotionSubspaceTpl()
107 , m_scaling_factor(
Scalar(1))
111 explicit ScaledJointMotionSubspaceTpl(
const Scalar & scaling_factor)
113 , m_scaling_factor(scaling_factor)
117 template<
typename Constra
intTpl>
118 ScaledJointMotionSubspaceTpl(
const ConstraintTpl & constraint,
const Scalar & scaling_factor)
119 : m_constraint(constraint)
120 , m_scaling_factor(scaling_factor)
124 ScaledJointMotionSubspaceTpl(
const ScaledJointMotionSubspaceTpl & other)
125 : m_constraint(other.m_constraint)
126 , m_scaling_factor(other.m_scaling_factor)
130 ScaledJointMotionSubspaceTpl & operator=(
const ScaledJointMotionSubspaceTpl & other)
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());
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();
163 struct TransposeConst
165 const ScaledJointMotionSubspaceTpl & ref;
166 explicit TransposeConst(
const ScaledJointMotionSubspaceTpl & ref)
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;
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;
328 typedef const Constraint_t & ConstraintTypeConstRef;
329 typedef Constraint_t & ConstraintTypeRef;
330 typedef Transformation_t TansformTypeConstRef;
331 typedef Transformation_t TansformTypeRef;
332 typedef Motion_t MotionTypeConstRef;
333 typedef Motion_t MotionTypeRef;
334 typedef Bias_t BiasTypeConstRef;
335 typedef Bias_t BiasTypeRef;
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;
369 struct JointDataMimicTpl
370 :
public JointDataBase<JointDataMimicTpl<_Scalar, _Options, JointCollectionTpl>>
372 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
376 PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
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)
401 JointDataMimicTpl(
const JointDataMimicTpl & other)
406 JointDataMimicTpl & operator=(
const JointDataMimicTpl & other)
408 m_jdata_mimicking = other.m_jdata_mimicking;
413 S = Constraint_t(other.S);
418 bool isEqual(
const JointDataMimicTpl & other)
const 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();
482 const RefJointData & jdata()
const 484 return m_jdata_mimicking;
486 RefJointData & jdata()
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;
532 RefJointData m_jdata_mimicking;
557 struct JointModelMimicTpl
558 :
public JointModelBase<JointModelMimicTpl<_Scalar, _Options, JointCollectionTpl>>
560 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
564 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
570 typedef JointCollectionTpl<Scalar, Options> JointCollection;
580 using Base::idx_vExtended;
583 using Base::nvExtended;
584 using Base::setIndexes;
590 template<
typename Jo
intModel>
593 : JointModelMimicTpl(jmodel, jmodel, scaling, offset)
597 template<
typename Jo
intModelMimicking,
typename Jo
intModelMimicked>
603 : m_jmodel_mimicking(checkMimic((JointModel)jmodel_mimicking.derived()))
606 , m_nqExtended(jmodel_mimicking.nq())
607 , m_nvExtended(jmodel_mimicking.nvExtended())
610 PINOCCHIO_CHECK_ARGUMENT_SIZE(
611 jmodel_mimicking.nq(), jmodel_mimicked.nq(),
612 "Mimicking and mimicked configuration spaces have different sizes");
613 PINOCCHIO_CHECK_ARGUMENT_SIZE(
614 jmodel_mimicking.nv(), jmodel_mimicked.nv(),
615 "Mimicking and mimicked tangent spaces have different sizes");
616 PINOCCHIO_CHECK_ARGUMENT_SIZE(
617 jmodel_mimicking.nvExtended(), jmodel_mimicked.nvExtended(),
618 "Mimicking and mimicked extended tangent spaces have different sizes");
621 jmodel_mimicked.id(), jmodel_mimicked.idx_q(), jmodel_mimicked.idx_v(),
622 jmodel_mimicked.idx_vExtended());
627 return *
static_cast<Base *
>(
this);
629 const Base & base()
const 631 return *
static_cast<const Base *
>(
this);
634 inline int nq_impl()
const 638 inline int nv_impl()
const 642 inline int nvExtended_impl()
const 655 (
id > m_jmodel_mimicking.id()), std::invalid_argument,
656 "Mimic joint index is lower than its directing joint. Should never happen");
660 Base::i_vExtended = vExtended;
676 m_jmodel_mimicking.setIndexes(
id, 0, 0, vExtended);
683 JointDataDerived createData()
const 685 return JointDataDerived(
686 m_jmodel_mimicking.createData(), scaling(), m_nqExtended, m_nvExtended);
689 const std::vector<bool> hasConfigurationLimit()
const 694 const std::vector<bool> hasConfigurationLimitInTangent()
const 699 template<
typename ConfigVector>
700 PINOCCHIO_DONT_INLINE
void 701 calc(JointDataDerived & jdata,
const typename Eigen::MatrixBase<ConfigVector> & qs)
const 703 jdata.joint_q = qs.segment(Base::i_q, m_nqExtended);
705 m_jmodel_mimicking, jdata.joint_q, m_scaling, m_offset, jdata.joint_q_transformed);
706 m_jmodel_mimicking.calc(jdata.m_jdata_mimicking, jdata.joint_q_transformed);
709 template<
typename ConfigVector,
typename TangentVector>
710 PINOCCHIO_DONT_INLINE
void calc(
711 JointDataDerived & jdata,
712 const typename Eigen::MatrixBase<ConfigVector> & qs,
713 const typename Eigen::MatrixBase<TangentVector> & vs)
const 715 jdata.joint_q = qs.segment(Base::i_q, m_nqExtended);
716 jdata.joint_v = vs.segment(Base::i_v, m_nvExtended);
718 m_jmodel_mimicking, jdata.joint_q, m_scaling, m_offset, jdata.joint_q_transformed);
719 jdata.joint_v_transformed = m_scaling * jdata.joint_v;
721 m_jmodel_mimicking.calc(
722 jdata.m_jdata_mimicking, jdata.joint_q_transformed, jdata.joint_v_transformed);
725 template<
typename VectorLike,
typename Matrix6Like>
728 const Eigen::MatrixBase<VectorLike> &,
729 const Eigen::MatrixBase<Matrix6Like> &,
734 &&
"Joint Mimic is not supported for aba yet. Remove it from your model if you want to use " 738 static std::string classname()
740 return std::string(
"JointModelMimic");
743 std::string shortname()
const 749 template<
typename NewScalar>
755 ScalarCast<NewScalar, Scalar>::cast(m_scaling),
756 ScalarCast<NewScalar, Scalar>::cast(m_offset));
757 res.setIndexes(
id(), Base::i_q, Base::i_v, Base::i_vExtended);
758 res.setMimicIndexes(m_jmodel_mimicking.id(), Base::i_q, Base::i_v, Base::i_vExtended);
762 const JointModel & jmodel()
const 764 return m_jmodel_mimicking;
766 JointModel & jmodel()
768 return m_jmodel_mimicking;
771 const Scalar & scaling()
const 780 const Scalar & offset()
const 791 JointModel m_jmodel_mimicking;
792 Scalar m_scaling, m_offset;
793 int m_nqExtended, m_nvExtended;
799 typename SizeDepType<NQ>::template SegmentReturn<D>::ConstType
800 JointMappedConfigSelector_impl(
const Eigen::MatrixBase<D> & a)
const 802 return SizeDepType<NQ>::segment(a.derived(), Base::i_q, m_nqExtended);
807 typename SizeDepType<NQ>::template SegmentReturn<D>::Type
808 JointMappedConfigSelector_impl(Eigen::MatrixBase<D> & a)
const 810 return SizeDepType<NQ>::segment(a.derived(), Base::i_q, m_nqExtended);
815 typename SizeDepType<NQ>::template SegmentReturn<D>::ConstType
816 JointMappedVelocitySelector_impl(
const Eigen::MatrixBase<D> & a)
const 818 return SizeDepType<NQ>::segment(a.derived(), Base::i_v, m_nvExtended);
823 typename SizeDepType<NQ>::template SegmentReturn<D>::Type
824 JointMappedVelocitySelector_impl(Eigen::MatrixBase<D> & a)
const 826 return SizeDepType<NQ>::segment(a.derived(), Base::i_v, m_nvExtended);
832 typename SizeDepType<NV>::template ColsReturn<D>::ConstType
833 jointCols_impl(
const Eigen::MatrixBase<D> & A)
const 835 return SizeDepType<NV>::middleCols(A.derived(), Base::i_v, m_nvExtended);
840 typename SizeDepType<NV>::template ColsReturn<D>::Type
841 jointCols_impl(Eigen::MatrixBase<D> & A)
const 843 return SizeDepType<NV>::middleCols(A.derived(), Base::i_v, m_nvExtended);
849 typename SizeDepType<NV>::template RowsReturn<D>::ConstType
850 jointRows_impl(
const Eigen::MatrixBase<D> & A)
const 852 return SizeDepType<NV>::middleRows(A.derived(), Base::i_v, m_nvExtended);
857 typename SizeDepType<NV>::template RowsReturn<D>::Type
858 jointRows_impl(Eigen::MatrixBase<D> & A)
const 860 return SizeDepType<NV>::middleRows(A.derived(), Base::i_v, m_nvExtended);
867 typename SizeDepType<NV>::template BlockReturn<D>::ConstType
868 jointBlock_impl(
const Eigen::MatrixBase<D> & Mat)
const 870 return SizeDepType<NV>::block(
871 Mat.derived(), Base::i_v, Base::i_v, m_nvExtended, m_nvExtended);
876 typename SizeDepType<NV>::template BlockReturn<D>::Type
877 jointBlock_impl(Eigen::MatrixBase<D> & Mat)
const 879 return SizeDepType<NV>::block(
880 Mat.derived(), Base::i_v, Base::i_v, m_nvExtended, m_nvExtended);
883 void disp(std::ostream & os)
const 886 os <<
" Mimicking joint type: " << m_jmodel_mimicking.shortname() << std::endl;
887 os <<
" Mimicked joint id: " << m_jmodel_mimicking.id() << std::endl;
888 os <<
" Mimic scaling: " << m_scaling << std::endl;
889 os <<
" Mimic offset: " << m_offset << std::endl;