5 #ifndef __pinocchio_multibody_joint_mimic_hpp__
6 #define __pinocchio_multibody_joint_mimic_hpp__
8 #include "pinocchio/macros.hpp"
9 #include "pinocchio/multibody/joint/joint-base.hpp"
16 template<
class Constra
int>
32 template<
class Constra
int>
34 {
typedef typename SE3GroupAction<Constraint>::ReturnType ReturnType; };
36 template<
class Constra
int,
typename MotionDerived>
38 {
typedef typename MotionAlgebraAction<Constraint,MotionDerived>::ReturnType ReturnType; };
40 template<
class Constra
int,
typename ForceDerived>
43 typedef typename Constraint::Scalar Scalar;
44 typedef typename ConstraintForceOp<Constraint,ForceDerived>::ReturnType OriginalReturnType;
47 typedef Eigen::Matrix<Scalar,IdealReturnType::RowsAtCompileTime,IdealReturnType::ColsAtCompileTime,Constraint::Options> ReturnType;
50 template<
class Constra
int,
typename ForceSet>
53 typedef typename Constraint::Scalar Scalar;
54 typedef typename ConstraintForceSetOp<Constraint,ForceSet>::ReturnType OriginalReturnType;
56 typedef Eigen::Matrix<Scalar,Constraint::NV,ForceSet::ColsAtCompileTime,Constraint::Options | Eigen::RowMajor> ReturnType;
59 template<
class Constra
int>
63 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
66 enum { NV = Constraint::NV };
67 typedef ConstraintBase<ScaledConstraint> Base;
70 typedef typename SE3GroupAction<Constraint>::ReturnType SE3ActionReturnType;
74 explicit ScaledConstraint(
const Scalar & scaling_factor)
75 : m_scaling_factor(scaling_factor)
78 ScaledConstraint(
const Constraint & constraint,
79 const Scalar & scaling_factor)
80 : m_constraint(constraint)
81 , m_scaling_factor(scaling_factor)
84 ScaledConstraint(
const ScaledConstraint & other)
85 : m_constraint(other.m_constraint)
86 , m_scaling_factor(other.m_scaling_factor)
89 ScaledConstraint & operator=(
const ScaledConstraint & other)
91 m_constraint = other.m_constraint;
92 m_scaling_factor = other.m_scaling_factor;
96 template<
typename VectorLike>
97 JointMotion __mult__(
const Eigen::MatrixBase<VectorLike> & v)
const
99 assert(v.size() ==
nv());
100 JointMotion jm = m_constraint * v;
101 return jm * m_scaling_factor;
104 template<
typename S1,
int O1>
106 se3Action(
const SE3Tpl<S1,O1> & m)
const
108 SE3ActionReturnType res = m_constraint.se3Action(m);
109 return m_scaling_factor * res;
112 template<
typename S1,
int O1>
114 se3ActionInverse(
const SE3Tpl<S1,O1> & m)
const
116 SE3ActionReturnType res = m_constraint.se3ActionInverse(m);
117 return m_scaling_factor * res;
120 int nv_impl()
const {
return m_constraint.nv(); }
127 template<
typename Derived>
128 typename ConstraintForceOp<ScaledConstraint,Derived>::ReturnType
132 typedef typename ConstraintForceOp<ScaledConstraint,Derived>::ReturnType ReturnType;
133 return ReturnType(ref.m_scaling_factor * (ref.m_constraint.transpose() * f));
137 template<
typename Derived>
138 typename ConstraintForceSetOp<ScaledConstraint,Derived>::ReturnType
141 typedef typename ConstraintForceSetOp<ScaledConstraint,Derived>::ReturnType ReturnType;
142 return ReturnType(ref.m_scaling_factor * (ref.m_constraint.transpose() * F));
147 TransposeConst transpose()
const {
return TransposeConst(*
this); }
149 DenseBase matrix_impl()
const
151 DenseBase S = m_scaling_factor * m_constraint.matrix();
155 template<
typename MotionDerived>
156 typename MotionAlgebraAction<ScaledConstraint,MotionDerived>::ReturnType
157 motionAction(
const MotionDense<MotionDerived> & m)
const
159 typedef typename MotionAlgebraAction<ScaledConstraint,MotionDerived>::ReturnType ReturnType;
160 ReturnType res = m_scaling_factor * m_constraint.motionAction(m);
164 inline const Scalar & scaling()
const {
return m_scaling_factor; }
165 inline Scalar & scaling() {
return m_scaling_factor; }
167 inline const Constraint & constraint()
const {
return m_constraint; }
168 inline Constraint & constraint() {
return m_constraint; }
170 bool isEqual(
const ScaledConstraint & other)
const
172 return m_constraint == other.m_constraint
173 && m_scaling_factor == other.m_scaling_factor;
178 Constraint m_constraint;
179 Scalar m_scaling_factor;
182 template<
typename S1,
int O1,
typename _Constra
int>
187 typedef typename Constraint::Scalar Scalar;
191 typedef OriginalReturnType ReturnType;
197 template<
typename S1,
int O1,
typename _Constra
int>
204 static inline ReturnType run(
const Inertia & Y,
207 return scaled_constraint.scaling() * (Y * scaled_constraint.constraint());
212 template<
typename M6Like,
typename _Constra
int>
216 typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(OriginalReturnType) ReturnType;
222 template<
typename M6Like,
typename _Constra
int>
228 static inline ReturnType run(
const Eigen::MatrixBase<M6Like> & Y,
231 return scaled_constraint.scaling() * (Y.derived() * scaled_constraint.constraint());
240 template<
class Jo
int>
267 PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
273 template<
class Jo
int>
277 template<
class Jo
int>
281 template<
class Jo
intData>
285 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
290 PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
293 : m_scaling((Scalar)0)
299 JointDataMimic(
const JointDataMimic & other)
302 JointDataMimic(
const JointDataBase<JointData> & jdata,
303 const Scalar & scaling)
304 : m_jdata_ref(jdata.derived())
306 , S(m_jdata_ref.S,scaling)
309 JointDataMimic & operator=(
const JointDataMimic & other)
311 m_jdata_ref = other.m_jdata_ref;
312 m_scaling = other.m_scaling;
315 S = Constraint_t(m_jdata_ref.S,other.m_scaling);
320 bool isEqual(
const JointDataMimic & other)
const
323 && m_jdata_ref == other.m_jdata_ref
324 && m_scaling == other.m_scaling
330 static std::string classname()
332 return std::string(
"JointDataMimic<") + JointData::classname() + std::string(
">");
335 std::string shortname()
const
337 return std::string(
"JointDataMimic<") + m_jdata_ref.shortname() + std::string(
">");
341 ConstraintTypeConstRef S_accessor()
const {
return S; }
342 ConstraintTypeRef S_accessor() {
return S; }
344 TansformTypeConstRef M_accessor()
const {
return m_jdata_ref.M; }
345 TansformTypeRef M_accessor() {
return m_jdata_ref.M; }
347 MotionTypeConstRef v_accessor()
const {
return m_jdata_ref.v; }
348 MotionTypeRef v_accessor() {
return m_jdata_ref.v; }
350 BiasTypeConstRef c_accessor()
const {
return m_jdata_ref.c; }
351 BiasTypeRef c_accessor() {
return m_jdata_ref.c; }
353 UTypeConstRef U_accessor()
const {
return m_jdata_ref.U; }
354 UTypeRef U_accessor() {
return m_jdata_ref.U; }
356 DTypeConstRef Dinv_accessor()
const {
return m_jdata_ref.Dinv; }
357 DTypeRef Dinv_accessor() {
return m_jdata_ref.Dinv; }
359 UDTypeConstRef UDinv_accessor()
const {
return m_jdata_ref.UDinv; }
360 UDTypeRef UDinv_accessor() {
return m_jdata_ref.UDinv; }
362 template<
class Jo
intModel>
363 friend struct JointModelMimic;
365 const JointData & jdata()
const {
return m_jdata_ref; }
366 JointData & jdata() {
return m_jdata_ref; }
368 const Scalar & scaling()
const {
return m_scaling; }
369 Scalar & scaling() {
return m_scaling; }
371 ConfigVector_t & jointConfiguration() {
return m_q_transform; }
372 const ConfigVector_t & jointConfiguration()
const {
return m_q_transform; }
375 const TangentVector_t & jointVelocity()
const {
return m_v_transform; }
379 JointData m_jdata_ref;
394 template<
typename NewScalar,
typename Jo
intModel>
401 template<
class Jo
intModel>
405 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
409 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
417 using Base::setIndexes;
422 JointModelMimic(
const JointModelBase<JointModel> & jmodel,
423 const Scalar & scaling,
424 const Scalar & offset)
425 : m_jmodel_ref(jmodel.derived())
430 Base & base() {
return *
static_cast<Base*
>(
this); }
431 const Base & base()
const {
return *
static_cast<const Base*
>(
this); }
433 inline int nq_impl()
const {
return 0; }
434 inline int nv_impl()
const {
return 0; }
436 inline int idx_q_impl()
const {
return m_jmodel_ref.idx_q(); }
437 inline int idx_v_impl()
const {
return m_jmodel_ref.idx_v(); }
439 void setIndexes_impl(JointIndex
id,
int ,
int )
442 Base::i_q = m_jmodel_ref.idx_q();
443 Base::i_v = m_jmodel_ref.idx_v();
446 JointDataDerived createData()
const
448 return JointDataDerived(m_jmodel_ref.createData(),scaling());
451 const std::vector<bool> hasConfigurationLimit()
const
453 return m_jmodel_ref.hasConfigurationLimit();
456 const std::vector<bool> hasConfigurationLimitInTangent()
const
458 return m_jmodel_ref.hasConfigurationLimitInTangent();
461 template<
typename ConfigVector>
463 void calc(JointDataDerived & jdata,
464 const typename Eigen::MatrixBase<ConfigVector> & qs)
const
466 typedef typename ConfigVectorAffineTransform<JointDerived>::Type AffineTransform;
468 AffineTransform::run(qs.head(m_jmodel_ref.nq()),
469 m_scaling,m_offset,jdata.m_q_transform);
470 m_jmodel_ref.calc(jdata.m_jdata_ref,jdata.m_q_transform);
473 template<
typename ConfigVector,
typename TangentVector>
475 void calc(JointDataDerived & jdata,
476 const typename Eigen::MatrixBase<ConfigVector> & qs,
477 const typename Eigen::MatrixBase<TangentVector> & vs)
const
479 typedef typename ConfigVectorAffineTransform<JointDerived>::Type AffineTransform;
481 AffineTransform::run(qs.head(m_jmodel_ref.nq()),
482 m_scaling,m_offset,jdata.m_q_transform);
483 jdata.m_v_transform = m_scaling * vs.head(m_jmodel_ref.nv());
484 m_jmodel_ref.calc(jdata.m_jdata_ref,
486 jdata.m_v_transform);
489 template<
typename Matrix6Like>
490 void calc_aba(JointDataDerived & data,
491 const Eigen::MatrixBase<Matrix6Like> & I,
492 const bool update_I)
const
495 m_jmodel_ref.calc_aba(data.m_jdata_ref,
496 PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like,I),
500 static std::string classname()
502 return std::string(
"JointModelMimic<") + JointModel::classname() + std::string(
">");;
505 std::string shortname()
const
507 return std::string(
"JointModelMimic<") + m_jmodel_ref.shortname() + std::string(
">");
511 template<
typename NewScalar>
516 ReturnType res(m_jmodel_ref.template cast<NewScalar>(),
517 (NewScalar)m_scaling,
518 (NewScalar)m_offset);
523 const JointModel & jmodel()
const {
return m_jmodel_ref; }
524 JointModel & jmodel() {
return m_jmodel_ref; }
526 const Scalar & scaling()
const {
return m_scaling; }
527 Scalar & scaling() {
return m_scaling; }
529 const Scalar & offset()
const {
return m_offset; }
530 Scalar & offset() {
return m_offset; }
535 JointModel m_jmodel_ref;
536 Scalar m_scaling, m_offset;
543 typename SizeDepType<NQ>::template SegmentReturn<D>::ConstType
544 jointConfigSelector_impl(
const Eigen::MatrixBase<D> & a)
const
546 return SizeDepType<NQ>::segment(a.derived(),
547 m_jmodel_ref.idx_q(),
553 typename SizeDepType<NQ>::template SegmentReturn<D>::Type
554 jointConfigSelector_impl(Eigen::MatrixBase<D> & a)
const
556 return SizeDepType<NQ>::segment(a.derived(),
557 m_jmodel_ref.idx_q(),
564 typename SizeDepType<NV>::template SegmentReturn<D>::ConstType
565 jointVelocitySelector_impl(
const Eigen::MatrixBase<D> & a)
const
567 return SizeDepType<NV>::segment(a.derived(),
568 m_jmodel_ref.idx_v(),
574 typename SizeDepType<NV>::template SegmentReturn<D>::Type
575 jointVelocitySelector_impl(Eigen::MatrixBase<D> & a)
const
577 return SizeDepType<NV>::segment(a.derived(),
578 m_jmodel_ref.idx_v(),
585 typename SizeDepType<NV>::template ColsReturn<D>::ConstType
586 jointCols_impl(
const Eigen::MatrixBase<D> & A)
const
588 return SizeDepType<NV>::middleCols(A.derived(),
589 m_jmodel_ref.idx_v(),
595 typename SizeDepType<NV>::template ColsReturn<D>::Type
596 jointCols_impl(Eigen::MatrixBase<D> & A)
const
598 return SizeDepType<NV>::middleCols(A.derived(),
599 m_jmodel_ref.idx_v(),
606 typename SizeDepType<NV>::template RowsReturn<D>::ConstType
607 jointRows_impl(
const Eigen::MatrixBase<D> & A)
const
609 return SizeDepType<NV>::middleRows(A.derived(),
610 m_jmodel_ref.idx_v(),
616 typename SizeDepType<NV>::template RowsReturn<D>::Type
617 jointRows_impl(Eigen::MatrixBase<D> & A)
const
619 return SizeDepType<NV>::middleRows(A.derived(),
620 m_jmodel_ref.idx_v(),
627 typename SizeDepType<NV>::template BlockReturn<D>::ConstType
631 m_jmodel_ref.idx_v(),m_jmodel_ref.idx_v(),
632 m_jmodel_ref.nv(),m_jmodel_ref.nv());
641 m_jmodel_ref.idx_v(),m_jmodel_ref.idx_v(),
642 m_jmodel_ref.nv(),m_jmodel_ref.nv());
649 #endif // ifndef __pinocchio_multibody_joint_mimic_hpp__