26 typedef _Scalar Scalar;
39 typedef Eigen::Matrix<Scalar, 3, 1, Options> JointForce;
40 typedef Eigen::Matrix<Scalar, 6, 3, Options> DenseBase;
41 typedef Eigen::Matrix<Scalar, 3, 3, Options> ReducedSquaredMatrix;
43 typedef DenseBase MatrixReturnType;
44 typedef const DenseBase ConstMatrixReturnType;
46 typedef ReducedSquaredMatrix StDiagonalMatrixSOperationReturnType;
50 struct JointMotionSubspaceSphericalZYXTpl
53 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
55 PINOCCHIO_CONSTRAINT_TYPEDEF_TPL(JointMotionSubspaceSphericalZYXTpl)
61 typedef Eigen::Matrix<Scalar, 3, 3, Options> Matrix3;
63 JointMotionSubspaceSphericalZYXTpl()
67 template<
typename Matrix3Like>
68 JointMotionSubspaceSphericalZYXTpl(
const Eigen::MatrixBase<Matrix3Like> & subspace)
71 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix3Like, 3, 3);
74 template<
typename Vector3Like>
75 JointMotion __mult__(
const Eigen::MatrixBase<Vector3Like> & v)
const 77 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector3Like, 3);
81 Matrix3 & operator()()
85 const Matrix3 & operator()()
const 95 struct ConstraintTranspose
98 const JointMotionSubspaceSphericalZYXTpl & ref;
99 ConstraintTranspose(
const JointMotionSubspaceSphericalZYXTpl & ref)
104 template<
typename Derived>
106 Eigen::Transpose<const Matrix3>,
107 Eigen::Block<const typename ForceDense<Derived>::Vector6, 3, 1>>
::type 110 return ref.m_S.transpose() * phi.
angular();
116 typename Eigen::Transpose<const Matrix3>,
117 typename Eigen::MatrixBase<const D>::template NRowsBlockXpr<3>::Type>
::type 118 operator*(
const Eigen::MatrixBase<D> & F)
const 121 D::RowsAtCompileTime == 6, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)
122 return ref.m_S.transpose() * F.template middleRows<3>(ANGULAR);
134 S.template middleRows<3>(LINEAR).setZero();
135 S.template middleRows<3>(ANGULAR) = m_S;
143 template<
typename S1,
int O1>
144 Eigen::Matrix<Scalar, 6, 3, Options> se3Action(
const SE3Tpl<S1, O1> & m)
const 152 Eigen::Matrix<Scalar, 6, 3, Options> result;
155 result.template middleRows<3>(ANGULAR).noalias() = m.rotation() * m_S;
159 m.translation(), result.template middleRows<3>(Motion::ANGULAR),
160 result.template middleRows<3>(LINEAR));
165 template<
typename S1,
int O1>
166 Eigen::Matrix<Scalar, 6, 3, Options> se3ActionInverse(
const SE3Tpl<S1, O1> & m)
const 168 Eigen::Matrix<Scalar, 6, 3, Options> result;
171 cross(m.translation(), m_S, result.template middleRows<3>(ANGULAR));
172 result.template middleRows<3>(LINEAR).noalias() =
173 -m.rotation().transpose() * result.template middleRows<3>(ANGULAR);
176 result.template middleRows<3>(ANGULAR).noalias() = m.rotation().transpose() * m_S;
181 template<
typename MotionDerived>
182 DenseBase motionAction(
const MotionDense<MotionDerived> & m)
const 184 const typename MotionDerived::ConstLinearType v = m.linear();
185 const typename MotionDerived::ConstAngularType w = m.angular();
188 cross(v, m_S, res.template middleRows<3>(LINEAR));
189 cross(w, m_S, res.template middleRows<3>(ANGULAR));
194 Matrix3 & angularSubspace()
198 const Matrix3 & angularSubspace()
const 203 bool isEqual(
const JointMotionSubspaceSphericalZYXTpl & other)
const 205 return internal::comparison_eq(m_S, other.m_S);
285 typedef _Scalar Scalar;
298 typedef Eigen::Matrix<Scalar, 6, NV, Options> U_t;
299 typedef Eigen::Matrix<Scalar, NV, NV, Options> D_t;
300 typedef Eigen::Matrix<Scalar, 6, NV, Options> UD_t;
302 typedef Eigen::Matrix<Scalar, NQ, 1, Options> ConfigVector_t;
303 typedef Eigen::Matrix<Scalar, NV, 1, Options> TangentVector_t;
305 typedef boost::mpl::false_ is_mimicable_t;
307 PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
325 struct JointDataSphericalZYXTpl
326 :
public JointDataBase<JointDataSphericalZYXTpl<_Scalar, _Options>>
328 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
330 PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
331 PINOCCHIO_JOINT_DATA_BASE_DEFAULT_ACCESSOR
333 ConfigVector_t joint_q;
334 TangentVector_t joint_v;
347 JointDataSphericalZYXTpl()
348 : joint_q(ConfigVector_t::Zero())
349 , joint_v(TangentVector_t::Zero())
350 , S(Constraint_t::Matrix3::Zero())
351 , M(Transformation_t::Identity())
352 , v(Motion_t::Vector3::Zero())
353 , c(Bias_t::Vector3::Zero())
356 , UDinv(UD_t::Zero())
361 static std::string classname()
363 return std::string(
"JointDataSphericalZYX");
365 std::string shortname()
const 375 :
public JointModelBase<JointModelSphericalZYXTpl<_Scalar, _Options>>
377 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
379 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
385 using Base::idx_vExtended;
386 using Base::setIndexes;
388 JointDataDerived createData()
const 390 return JointDataDerived();
393 const std::vector<bool> hasConfigurationLimit()
const 395 return {
true,
true,
true};
398 const std::vector<bool> hasConfigurationLimitInTangent()
const 400 return {
true,
true,
true};
403 template<
typename ConfigVector>
404 void calc(JointDataDerived & data,
const typename Eigen::MatrixBase<ConfigVector> & qs)
const 406 data.joint_q = qs.template segment<NQ>(idx_q());
409 SINCOS(data.joint_q(0), &s0, &c0);
411 SINCOS(data.joint_q(1), &s1, &c1);
413 SINCOS(data.joint_q(2), &s2, &c2);
415 data.M.rotation() << c0 * c1, c0 * s1 * s2 - s0 * c2, c0 * s1 * c2 + s0 * s2, s0 * c1,
416 s0 * s1 * s2 + c0 * c2, s0 * s1 * c2 - c0 * s2, -s1, c1 * s2, c1 * c2;
418 data.S.angularSubspace() << -s1,
Scalar(0),
Scalar(1), c1 * s2, c2,
Scalar(0), c1 * c2, -s2,
422 template<
typename TangentVector>
424 calc(JointDataDerived & data,
const Blank,
const typename Eigen::MatrixBase<TangentVector> & vs)
427 data.joint_v = vs.template segment<NV>(idx_v());
428 data.v().noalias() = data.S.angularSubspace() * data.joint_v;
439 template<
typename ConfigVector,
typename TangentVector>
441 JointDataDerived & data,
442 const typename Eigen::MatrixBase<ConfigVector> & qs,
443 const typename Eigen::MatrixBase<TangentVector> & vs)
const 445 data.joint_q = qs.template segment<NQ>(idx_q());
448 SINCOS(data.joint_q(0), &s0, &c0);
450 SINCOS(data.joint_q(1), &s1, &c1);
452 SINCOS(data.joint_q(2), &s2, &c2);
454 data.M.rotation() << c0 * c1, c0 * s1 * s2 - s0 * c2, c0 * s1 * c2 + s0 * s2, s0 * c1,
455 s0 * s1 * s2 + c0 * c2, s0 * s1 * c2 - c0 * s2, -s1, c1 * s2, c1 * c2;
457 data.S.angularSubspace() << -s1,
Scalar(0),
Scalar(1), c1 * s2, c2,
Scalar(0), c1 * c2, -s2,
460 data.joint_v = vs.template segment<NV>(idx_v());
461 data.v().noalias() = data.S.angularSubspace() * data.joint_v;
463#define q_dot data.joint_v 464 data.c()(0) = -c1 * q_dot(0) * q_dot(1);
466 -s1 * s2 * q_dot(0) * q_dot(1) + c1 * c2 * q_dot(0) * q_dot(2) - s2 * q_dot(1) * q_dot(2);
468 -s1 * c2 * q_dot(0) * q_dot(1) - c1 * s2 * q_dot(0) * q_dot(2) - c2 * q_dot(1) * q_dot(2);
472 template<
typename VectorLike,
typename Matrix6Like>
474 JointDataDerived & data,
475 const Eigen::MatrixBase<VectorLike> & armature,
476 const Eigen::MatrixBase<Matrix6Like> & I,
477 const bool update_I)
const 479 data.U.noalias() = I.template middleCols<3>(Motion::ANGULAR) * data.S.angularSubspace();
481 data.S.angularSubspace().transpose() * data.U.template middleRows<3>(Motion::ANGULAR);
482 data.StU.diagonal() += armature;
484 internal::PerformStYSInversion<Scalar>::run(data.StU, data.Dinv);
486 data.UDinv.noalias() = data.U * data.Dinv;
489 PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like, I).noalias() -= data.UDinv * data.U.transpose();
492 static std::string classname()
494 return std::string(
"JointModelSphericalZYX");
496 std::string shortname()
const 502 template<
typename NewScalar>
507 res.setIndexes(
id(), idx_q(), idx_v(), idx_vExtended());