37 typedef _Scalar Scalar;
42 typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
43 typedef Eigen::Matrix<Scalar, 6, 1, Options> Vector6;
44 typedef Eigen::Matrix<Scalar, 4, 4, Options> Matrix4;
45 typedef Eigen::Matrix<Scalar, 6, 6, Options> Matrix6;
46 typedef typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6) ToVectorConstReturnType;
47 typedef typename PINOCCHIO_EIGEN_REF_TYPE(Vector6) ToVectorReturnType;
48 typedef Vector3 AngularType;
49 typedef Vector3 LinearType;
50 typedef const Vector3 ConstAngularType;
51 typedef const Vector3 ConstLinearType;
52 typedef Matrix6 ActionMatrixType;
53 typedef Matrix4 HomogeneousMatrixType;
55 typedef MotionPlain PlainReturnType;
76 typedef _Scalar Scalar;
78 typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
79 typedef Eigen::Matrix<Scalar, 3, 3, Options> Matrix3;
80 typedef Matrix3 AngularType;
81 typedef Matrix3 AngularRef;
82 typedef Matrix3 ConstAngularRef;
83 typedef typename Vector3::ConstantReturnType LinearType;
84 typedef typename Vector3::ConstantReturnType LinearRef;
85 typedef const typename Vector3::ConstantReturnType ConstLinearRef;
97 struct TransformRevoluteTpl :
SE3Base<TransformRevoluteTpl<_Scalar, _Options, axis>>
99 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
100 PINOCCHIO_SE3_TYPEDEF_TPL(TransformRevoluteTpl);
102 TransformRevoluteTpl()
105 TransformRevoluteTpl(
const Scalar & sin,
const Scalar & cos)
114 _setRotation(res.rotation());
123 template<
typename S2,
int O2>
124 typename SE3GroupAction<TransformRevoluteTpl>::ReturnType
127 typedef typename SE3GroupAction<TransformRevoluteTpl>::ReturnType
ReturnType;
132 res.rotation().col(0) = m.rotation().col(0);
133 res.rotation().col(1).noalias() = m_cos * m.rotation().col(1) + m_sin * m.rotation().col(2);
134 res.rotation().col(2).noalias() = res.rotation().col(0).cross(res.rotation().col(1));
138 res.rotation().col(2).noalias() = m_cos * m.rotation().col(2) + m_sin * m.rotation().col(0);
139 res.rotation().col(1) = m.rotation().col(1);
140 res.rotation().col(0).noalias() = res.rotation().col(1).cross(res.rotation().col(2));
144 res.rotation().col(0).noalias() = m_cos * m.rotation().col(0) + m_sin * m.rotation().col(1);
145 res.rotation().col(1).noalias() = res.rotation().col(2).cross(res.rotation().col(0));
146 res.rotation().col(2) = m.rotation().col(2);
150 assert(
false &&
"must never happened");
154 res.translation() = m.translation();
158 const Scalar & sin()
const 167 const Scalar & cos()
const 176 template<
typename OtherScalar>
177 void setValues(
const OtherScalar & sin,
const OtherScalar & cos)
183 LinearType translation()
const 185 return LinearType::PlainObject::Zero(3);
187 AngularType rotation()
const 189 AngularType m(AngularType::Identity());
194 bool isEqual(
const TransformRevoluteTpl & other)
const 196 return internal::comparison_eq(m_cos, other.m_cos)
197 && internal::comparison_eq(m_sin, other.m_sin);
202 inline void _setRotation(
typename PlainType::AngularRef & rot)
const 207 rot.coeffRef(1, 1) = m_cos;
208 rot.coeffRef(1, 2) = -m_sin;
209 rot.coeffRef(2, 1) = m_sin;
210 rot.coeffRef(2, 2) = m_cos;
214 rot.coeffRef(0, 0) = m_cos;
215 rot.coeffRef(0, 2) = m_sin;
216 rot.coeffRef(2, 0) = -m_sin;
217 rot.coeffRef(2, 2) = m_cos;
221 rot.coeffRef(0, 0) = m_cos;
222 rot.coeffRef(0, 1) = -m_sin;
223 rot.coeffRef(1, 0) = m_sin;
224 rot.coeffRef(1, 1) = m_cos;
228 assert(
false &&
"must never happened");
236 struct MotionRevoluteTpl :
MotionBase<MotionRevoluteTpl<_Scalar, _Options, axis>>
238 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
240 MOTION_TYPEDEF_TPL(MotionRevoluteTpl);
242 typedef typename Axis::CartesianAxis3 CartesianAxis3;
248 MotionRevoluteTpl(
const Scalar & w)
253 template<
typename Vector1Like>
254 MotionRevoluteTpl(
const Eigen::MatrixBase<Vector1Like> & v)
257 using namespace Eigen;
258 EIGEN_STATIC_ASSERT_SIZE_1x1(Vector1Like);
266 template<
typename OtherScalar>
267 MotionRevoluteTpl __mult__(
const OtherScalar & alpha)
const 269 return MotionRevoluteTpl(alpha * m_w);
272 template<
typename MotionDerived>
275 m.linear().setZero();
276 for (Eigen::DenseIndex k = 0; k < 3; ++k)
278 m.angular()[k] = k == axis ? m_w :
Scalar(0);
282 template<
typename MotionDerived>
285 typedef typename MotionDense<MotionDerived>::Scalar OtherScalar;
286 v.angular()[axis] += (OtherScalar)m_w;
289 template<
typename S2,
int O2,
typename D2>
292 v.angular().noalias() = m.rotation().col(axis) * m_w;
293 v.linear().noalias() = m.translation().cross(v.angular());
296 template<
typename S2,
int O2>
300 se3Action_impl(m, res);
304 template<
typename S2,
int O2,
typename D2>
308 CartesianAxis3::alphaCross(m_w, m.translation(), v.angular());
309 v.linear().noalias() = m.rotation().transpose() * v.angular();
312 v.angular().noalias() = m.rotation().transpose().col(axis) * m_w;
315 template<
typename S2,
int O2>
319 se3ActionInverse_impl(m, res);
323 template<
typename M1,
typename M2>
327 CartesianAxis3::alphaCross(-m_w, v.linear(), mout.linear());
330 CartesianAxis3::alphaCross(-m_w, v.angular(), mout.angular());
333 template<
typename M1>
337 motionAction(v, res);
345 const Scalar & angularRate()
const 350 bool isEqual_impl(
const MotionRevoluteTpl & other)
const 352 return internal::comparison_eq(m_w, other.m_w);
370 operator^(
const MotionDense<MotionDerived> & m1,
const MotionRevoluteTpl<S2, O2, axis> & m2)
406 typedef _Scalar Scalar;
418 typedef Eigen::Matrix<Scalar, 1, 1, Options> JointForce;
419 typedef Eigen::Matrix<Scalar, 6, 1, Options> DenseBase;
420 typedef Eigen::Matrix<Scalar, 1, 1, Options> ReducedSquaredMatrix;
422 typedef DenseBase MatrixReturnType;
423 typedef const DenseBase ConstMatrixReturnType;
425 typedef typename ReducedSquaredMatrix::IdentityReturnType StDiagonalMatrixSOperationReturnType;
429 struct JointMotionSubspaceRevoluteTpl
432 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
434 PINOCCHIO_CONSTRAINT_TYPEDEF_TPL(JointMotionSubspaceRevoluteTpl)
442 JointMotionSubspaceRevoluteTpl()
446 template<
typename Vector1Like>
447 JointMotion __mult__(
const Eigen::MatrixBase<Vector1Like> & v)
const 452 template<
typename S1,
int O1>
453 typename SE3GroupAction<JointMotionSubspaceRevoluteTpl>::ReturnType
456 typedef typename SE3GroupAction<JointMotionSubspaceRevoluteTpl>::ReturnType
ReturnType;
458 res.template segment<3>(LINEAR) = m.translation().cross(m.rotation().col(axis));
459 res.template segment<3>(ANGULAR) = m.rotation().col(axis);
463 template<
typename S1,
int O1>
464 typename SE3GroupAction<JointMotionSubspaceRevoluteTpl>::ReturnType
467 typedef typename SE3GroupAction<JointMotionSubspaceRevoluteTpl>::ReturnType
ReturnType;
468 typedef typename Axis::CartesianAxis3 CartesianAxis3;
470 res.template segment<3>(LINEAR).noalias() =
471 m.rotation().transpose() * CartesianAxis3::cross(m.translation());
472 res.template segment<3>(ANGULAR) = m.rotation().transpose().col(axis);
483 const JointMotionSubspaceRevoluteTpl & ref;
484 TransposeConst(
const JointMotionSubspaceRevoluteTpl & ref)
489 template<
typename ForceDerived>
490 typename ConstraintForceOp<JointMotionSubspaceRevoluteTpl, ForceDerived>::ReturnType
493 return f.
angular().template segment<1>(axis);
497 template<
typename Derived>
498 typename ConstraintForceSetOp<JointMotionSubspaceRevoluteTpl, Derived>::ReturnType
501 assert(F.rows() == 6);
502 return F.row(ANGULAR + axis);
506 TransposeConst transpose()
const 508 return TransposeConst(*
this);
517 DenseBase matrix_impl()
const 520 MotionRef<DenseBase> v(S);
525 template<
typename MotionDerived>
526 typename MotionAlgebraAction<JointMotionSubspaceRevoluteTpl, MotionDerived>::ReturnType
527 motionAction(
const MotionDense<MotionDerived> & m)
const 530 typename MotionAlgebraAction<JointMotionSubspaceRevoluteTpl, MotionDerived>::ReturnType
533 MotionRef<ReturnType> v(res);
538 bool isEqual(
const JointMotionSubspaceRevoluteTpl &)
const 614 static inline ReturnType run(
const Inertia & Y,
const Constraint & )
619 const S1 &m = Y.mass(), &x = Y.lever()[0], &y = Y.lever()[1], &z = Y.lever()[2];
620 const typename Inertia::Symmetric3 & I = Y.inertia();
622 res << -m * y, m * x, (S2)0, I(2, 0) - m * x * z, I(2, 1) - m * y * z,
623 I(2, 2) + m * (x * x + y * y);
665 typedef _Scalar Scalar;
678 typedef Eigen::Matrix<Scalar, 6, NV, Options> U_t;
679 typedef Eigen::Matrix<Scalar, NV, NV, Options> D_t;
680 typedef Eigen::Matrix<Scalar, 6, NV, Options> UD_t;
682 typedef Eigen::Matrix<Scalar, NQ, 1, Options> ConfigVector_t;
683 typedef Eigen::Matrix<Scalar, NV, 1, Options> TangentVector_t;
685 typedef boost::mpl::true_ is_mimicable_t;
687 PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
705 struct JointDataRevoluteTpl :
public JointDataBase<JointDataRevoluteTpl<_Scalar, _Options, axis>>
707 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
709 PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
710 PINOCCHIO_JOINT_DATA_BASE_DEFAULT_ACCESSOR
712 ConfigVector_t joint_q;
713 TangentVector_t joint_v;
726 JointDataRevoluteTpl()
727 : joint_q(ConfigVector_t::Zero())
728 , joint_v(TangentVector_t::Zero())
733 , UDinv(UD_t::Zero())
738 static std::string classname()
742 std::string shortname()
const 756 struct JointModelRevoluteTpl
757 :
public JointModelBase<JointModelRevoluteTpl<_Scalar, _Options, axis>>
759 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
761 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
767 using Base::idx_vExtended;
768 using Base::setIndexes;
770 typedef Eigen::Matrix<Scalar, 3, 1, _Options> Vector3;
772 JointDataDerived createData()
const 774 return JointDataDerived();
777 JointModelRevoluteTpl()
781 const std::vector<bool> hasConfigurationLimit()
const 786 const std::vector<bool> hasConfigurationLimitInTangent()
const 791 template<
typename ConfigVector>
792 PINOCCHIO_DONT_INLINE
void 793 calc(JointDataDerived & data,
const typename Eigen::MatrixBase<ConfigVector> & qs)
const 795 data.joint_q[0] = qs[idx_q()];
797 SINCOS(data.joint_q[0], &sa, &ca);
798 data.M.setValues(sa, ca);
801 template<
typename TangentVector>
802 PINOCCHIO_DONT_INLINE
void 803 calc(JointDataDerived & data,
const Blank,
const typename Eigen::MatrixBase<TangentVector> & vs)
806 data.joint_v[0] = vs[idx_v()];
807 data.v.angularRate() = data.joint_v[0];
810 template<
typename ConfigVector,
typename TangentVector>
811 PINOCCHIO_DONT_INLINE
void calc(
812 JointDataDerived & data,
813 const typename Eigen::MatrixBase<ConfigVector> & qs,
814 const typename Eigen::MatrixBase<TangentVector> & vs)
const 816 calc(data, qs.derived());
818 data.joint_v[0] = vs[idx_v()];
819 data.v.angularRate() = data.joint_v[0];
822 template<
typename VectorLike,
typename Matrix6Like>
824 JointDataDerived & data,
825 const Eigen::MatrixBase<VectorLike> & armature,
826 const Eigen::MatrixBase<Matrix6Like> & I,
827 const bool update_I)
const 829 data.U = I.col(Inertia::ANGULAR + axis);
831 Scalar(1) / (I(Inertia::ANGULAR + axis, Inertia::ANGULAR + axis) + armature[0]);
832 data.UDinv.noalias() = data.U * data.Dinv[0];
835 PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like, I).noalias() -= data.UDinv * data.U.transpose();
838 static std::string classname()
842 std::string shortname()
const 847 Vector3 getMotionAxis()
const 852 return Vector3::UnitX();
854 return Vector3::UnitY();
856 return Vector3::UnitZ();
858 assert(
false &&
"must never happen");
864 template<
typename NewScalar>
865 JointModelRevoluteTpl<NewScalar, Options, axis>
cast()
const 867 typedef JointModelRevoluteTpl<NewScalar, Options, axis>
ReturnType;
869 res.setIndexes(
id(), idx_q(), idx_v(), idx_vExtended());