102 RefJointMotionSubspace RefJointMotionSubspace;
103 typedef typename SE3GroupAction<RefJointMotionSubspace>::ReturnType SE3ActionReturnType;
107 , m_scaling_factor(Scalar(1))
117 template<
typename Constra
intTpl>
119 : m_constraint(constraint)
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
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>
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;
370 :
public JointDataBase<JointDataMimicTpl<_Scalar, _Options, JointCollectionTpl>>
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);
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;
558 :
public JointModelBase<JointModelMimicTpl<_Scalar, _Options, JointCollectionTpl>>
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)
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");
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>
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;