18 #ifndef __se3_joint_revolute_unbounded_hpp__ 19 #define __se3_joint_revolute_unbounded_hpp__ 21 #include "pinocchio/math/fwd.hpp" 22 #include "pinocchio/math/sincos.hpp" 23 #include "pinocchio/spatial/inertia.hpp" 24 #include "pinocchio/multibody/joint/joint-base.hpp" 25 #include "pinocchio/multibody/joint/joint-revolute.hpp" 32 template<
typename _Scalar,
int _Options,
int axis>
39 typedef _Scalar Scalar;
40 enum { Options = _Options };
47 typedef Eigen::Matrix<Scalar,6,NV,Options> F_t;
50 typedef Eigen::Matrix<Scalar,6,NV,Options> U_t;
51 typedef Eigen::Matrix<Scalar,NV,NV,Options> D_t;
52 typedef Eigen::Matrix<Scalar,6,NV,Options> UD_t;
54 typedef Eigen::Matrix<Scalar,NQ,1,Options> ConfigVector_t;
55 typedef Eigen::Matrix<Scalar,NV,1,Options> TangentVector_t;
58 template<
typename Scalar,
int Options,
int axis>
62 template<
typename Scalar,
int Options,
int axis>
66 template<
typename _Scalar,
int _Options,
int axis>
70 SE3_JOINT_TYPEDEF_TEMPLATE;
88 template<
typename _Scalar,
int _Options,
int axis>
92 SE3_JOINT_TYPEDEF_TEMPLATE;
101 JointDataDerived
createData()
const {
return JointDataDerived(); }
103 template<
typename ConfigVector>
104 void calc(JointDataDerived & data,
105 const typename Eigen::MatrixBase<ConfigVector> & qs)
const 107 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigVector_t,ConfigVector);
108 typedef typename ConfigVector::Scalar OtherScalar;
109 typename ConfigVector::template ConstFixedSegmentReturnType<NQ>::Type
110 & q = qs.template segment<NQ> (
idx_q());
112 const OtherScalar & ca = q(0);
113 const OtherScalar & sa = q(1);
115 JointDerivedBase::cartesianRotation(ca,sa,data.M.rotation());
118 template<
typename ConfigVector,
typename TangentVector>
119 void calc(JointDataDerived & data,
120 const typename Eigen::MatrixBase<ConfigVector> & qs,
121 const typename Eigen::MatrixBase<TangentVector> & vs)
const 123 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(TangentVector_t,TangentVector);
124 calc(data,qs.derived());
126 data.v.w = (Scalar)vs[
idx_v()];;
129 template<
typename S2,
int O2>
130 void calc_aba(JointDataDerived & data, Eigen::Matrix<S2,6,6,O2> & I,
const bool update_I)
const 132 data.U = I.col(Inertia::ANGULAR + axis);
133 data.Dinv[0] = (Scalar)(1)/I(Inertia::ANGULAR + axis,Inertia::ANGULAR + axis);
134 data.UDinv.noalias() = data.U * data.Dinv[0];
137 I -= data.UDinv * data.U.transpose();
143 return 2.*sqrt(sqrt(Eigen::NumTraits<Scalar>::epsilon()));
146 static std::string classname()
148 return std::string(
"JointModelRUB") + axisLabel<axis>();
150 std::string
shortname()
const {
return classname(); }
168 #endif // ifndef __se3_joint_revolute_unbounded_hpp__
JointDataVariant createData(const JointModelVariant &jmodel)
Visit a JointModelVariant through CreateData visitor to create a JointDataVariant.
void calc_aba(const JointModelVariant &jmodel, JointDataVariant &jdata, Inertia::Matrix6 &I, const bool update_I)
Visit a JointDataVariant and the corresponding JointModelVariant through JointCalcAbaVisitor to...
std::string shortname(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointShortnameVisitor to get the shortname of the derived joint mod...
int idx_q(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdxQVisitor to get the index in the full model configuration s...
Eigen::VectorXd finiteDifferenceIncrement(const Model &model)
Computes the finite difference increments for each degree of freedom according to the current joint c...
int idx_v(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointIdxVVisitor to get the index in the full model tangent space c...