6 #ifndef __pinocchio_multibody_joint_spherical_ZYX_hpp__ 
    7 #define __pinocchio_multibody_joint_spherical_ZYX_hpp__ 
   20   template<
typename Scalar, 
int Options>
 
   23   template<
typename _Scalar, 
int _Options>
 
   40     typedef Eigen::Matrix<Scalar, 6, 3, Options> 
DenseBase;
 
   49   template<
typename _Scalar, 
int _Options>
 
   53     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
   61     typedef Eigen::Matrix<Scalar, 3, 3, Options> 
Matrix3;
 
   67     template<
typename Matrix3Like>
 
   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);
 
   78       return JointMotion(
m_S * 
v);
 
  104       template<
typename Derived>
 
  106         Eigen::Transpose<const Matrix3>,
 
  107         Eigen::Block<const typename ForceDense<Derived>::Vector6, 3, 1>>
::type 
  116         typename Eigen::Transpose<const Matrix3>,
 
  117         typename Eigen::MatrixBase<const D>::template NRowsBlockXpr<3>::Type>
::type 
  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>
 
  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>
 
  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>
 
  184       const typename MotionDerived::ConstLinearType 
v = 
m.linear();
 
  185       const typename MotionDerived::ConstAngularType 
w = 
m.angular();
 
  215     template<
typename Scalar, 
int Options>
 
  223         return constraint.
matrix().transpose() * constraint.
matrix();
 
  229   template<
typename S1, 
int O1, 
typename S2, 
int O2>
 
  230   Eigen::Matrix<S1, 6, 3, O1>
 
  235     Eigen::Matrix<S1, 6, 3, O1> 
M;
 
  236     alphaSkew(-
Y.mass(), 
Y.lever(), 
M.template middleRows<3>(Constraint::LINEAR));
 
  237     M.template middleRows<3>(Constraint::ANGULAR) =
 
  238       (
Y.inertia() - 
typename Symmetric3::AlphaSkewSquare(
Y.mass(), 
Y.lever())).matrix();
 
  240     return (
M * 
S.angularSubspace()).eval();
 
  245   template<
typename Matrix6Like, 
typename S2, 
int O2>
 
  246   const typename MatrixMatrixProduct<
 
  247     typename Eigen::internal::remove_const<
 
  248       typename SizeDepType<3>::ColsReturn<Matrix6Like>::ConstType>
::type,
 
  253     EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix6Like, 6, 6);
 
  254     return Y.derived().template middleCols<3>(Inertia::ANGULAR) * 
S.angularSubspace();
 
  257   template<
typename S1, 
int O1>
 
  267   template<
typename S1, 
int O1, 
typename MotionDerived>
 
  273   template<
typename Scalar, 
int Options>
 
  276   template<
typename _Scalar, 
int _Options>
 
  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;
 
  310   template<
typename _Scalar, 
int _Options>
 
  317   template<
typename _Scalar, 
int _Options>
 
  324   template<
typename _Scalar, 
int _Options>
 
  326   : 
public JointDataBase<JointDataSphericalZYXTpl<_Scalar, _Options>>
 
  328     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
  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())
 
  363       return std::string(
"JointDataSphericalZYX");
 
  373   template<
typename _Scalar, 
int _Options>
 
  374   struct JointModelSphericalZYXTpl
 
  375   : 
public JointModelBase<JointModelSphericalZYXTpl<_Scalar, _Options>>
 
  377     EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
  390       return JointDataDerived();
 
  395       return {
true, 
true, 
true};
 
  400       return {
true, 
true, 
true};
 
  403     template<
typename ConfigVector>
 
  404     void calc(JointDataDerived & 
data, 
const typename Eigen::MatrixBase<ConfigVector> & 
qs)
 const 
  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;
 
  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 
  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;
 
  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 
  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;
 
  494       return std::string(
"JointModelSphericalZYX");
 
  502     template<
typename NewScalar>
 
  515 #include <boost/type_traits.hpp> 
  519   template<
typename Scalar, 
int Options>
 
  521   : 
public integral_constant<bool, true>
 
  525   template<
typename Scalar, 
int Options>
 
  527   : 
public integral_constant<bool, true>
 
  531   template<
typename Scalar, 
int Options>
 
  533   : 
public integral_constant<bool, true>
 
  537   template<
typename Scalar, 
int Options>
 
  539   : 
public integral_constant<bool, true>
 
  544 #endif // ifndef __pinocchio_multibody_joint_spherical_ZYX_hpp__