36 typedef _Scalar Scalar;
41 typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
42 typedef Eigen::Matrix<Scalar, 6, 1, Options> Vector6;
43 typedef Eigen::Matrix<Scalar, 4, 4, Options> Matrix4;
44 typedef Eigen::Matrix<Scalar, 6, 6, Options> Matrix6;
45 typedef typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6) ToVectorConstReturnType;
46 typedef typename PINOCCHIO_EIGEN_REF_TYPE(Vector6) ToVectorReturnType;
47 typedef Vector3 AngularType;
48 typedef Vector3 LinearType;
49 typedef const Vector3 ConstAngularType;
50 typedef const Vector3 ConstLinearType;
51 typedef Matrix6 ActionMatrixType;
53 typedef MotionPlain PlainReturnType;
54 typedef Matrix4 HomogeneousMatrixType;
96 struct TransformHelicalTpl :
SE3Base<TransformHelicalTpl<_Scalar, _Options, axis>>
98 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
99 PINOCCHIO_SE3_TYPEDEF_TPL(TransformHelicalTpl);
102 typedef typename AxisLinear::CartesianAxis3 CartesianAxis3Linear;
104 TransformHelicalTpl()
107 TransformHelicalTpl(
const Scalar & sin,
const Scalar & cos,
const Scalar & displacement)
110 , m_displacement(displacement)
117 _setRotation(res.rotation());
118 res.translation()[axis] = m_displacement;
127 template<
typename S2,
int O2>
128 typename SE3GroupAction<TransformHelicalTpl>::ReturnType
131 typedef typename SE3GroupAction<TransformHelicalTpl>::ReturnType
ReturnType;
136 res.rotation().col(0) = m.rotation().col(0);
137 res.rotation().col(1).noalias() = m_cos * m.rotation().col(1) + m_sin * m.rotation().col(2);
138 res.rotation().col(2).noalias() = res.rotation().col(0).cross(res.rotation().col(1));
142 res.rotation().col(2).noalias() = m_cos * m.rotation().col(2) + m_sin * m.rotation().col(0);
143 res.rotation().col(1) = m.rotation().col(1);
144 res.rotation().col(0).noalias() = res.rotation().col(1).cross(res.rotation().col(2));
148 res.rotation().col(0).noalias() = m_cos * m.rotation().col(0) + m_sin * m.rotation().col(1);
149 res.rotation().col(1).noalias() = res.rotation().col(2).cross(res.rotation().col(0));
150 res.rotation().col(2) = m.rotation().col(2);
154 assert(
false &&
"must never happen");
158 res.translation() = m.translation();
159 res.translation()[axis] += m_displacement;
163 const Scalar & sin()
const 172 const Scalar & cos()
const 181 const Scalar & displacement()
const 183 return m_displacement;
187 return m_displacement;
190 template<
typename Scalar1,
typename Scalar2,
typename Scalar3>
191 void setValues(
const Scalar1 & sin,
const Scalar2 & cos,
const Scalar3 & displacement)
195 m_displacement = displacement;
198 LinearType translation()
const 200 return CartesianAxis3Linear() * displacement();
202 AngularType rotation()
const 204 AngularType m(AngularType::Identity());
209 bool isEqual(
const TransformHelicalTpl & other)
const 211 return internal::comparison_eq(m_cos, other.m_cos)
212 && internal::comparison_eq(m_sin, other.m_sin)
213 && internal::comparison_eq(m_displacement, other.m_displacement);
217 Scalar m_sin, m_cos, m_displacement;
218 inline void _setRotation(
typename PlainType::AngularRef & rot)
const 223 rot.coeffRef(1, 1) = m_cos;
224 rot.coeffRef(1, 2) = -m_sin;
225 rot.coeffRef(2, 1) = m_sin;
226 rot.coeffRef(2, 2) = m_cos;
230 rot.coeffRef(0, 0) = m_cos;
231 rot.coeffRef(0, 2) = m_sin;
232 rot.coeffRef(2, 0) = -m_sin;
233 rot.coeffRef(2, 2) = m_cos;
237 rot.coeffRef(0, 0) = m_cos;
238 rot.coeffRef(0, 1) = -m_sin;
239 rot.coeffRef(1, 0) = m_sin;
240 rot.coeffRef(1, 1) = m_cos;
244 assert(
false &&
"must never happen");
252 struct MotionHelicalTpl :
MotionBase<MotionHelicalTpl<_Scalar, _Options, axis>>
254 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
256 MOTION_TYPEDEF_TPL(MotionHelicalTpl);
258 typedef typename AxisAngular::CartesianAxis3 CartesianAxis3Angular;
260 typedef typename AxisLinear::CartesianAxis3 CartesianAxis3Linear;
274 return PlainReturnType(CartesianAxis3Linear() * m_v, CartesianAxis3Angular() * m_w);
277 template<
typename OtherScalar>
278 MotionHelicalTpl __mult__(
const OtherScalar & alpha)
const 280 return MotionHelicalTpl(alpha * m_w, alpha * m_v);
283 template<
typename MotionDerived>
286 for (Eigen::DenseIndex k = 0; k < 3; ++k)
288 m.angular()[k] = k == axis ? m_w : (
Scalar)0;
289 m.linear()[k] = k == axis ? m_v : (
Scalar)0;
293 template<
typename MotionDerived>
296 typedef typename MotionDense<MotionDerived>::Scalar OtherScalar;
297 v.angular()[axis] += (OtherScalar)m_w;
298 v.linear()[axis] += (OtherScalar)m_v;
301 template<
typename S2,
int O2,
typename D2>
304 v.angular().noalias() = m.rotation().col(axis) * m_w;
305 v.linear().noalias() = m.translation().cross(v.angular()) + m_v * (m.rotation().col(axis));
308 template<
typename S2,
int O2>
313 se3Action_impl(m, res);
317 template<
typename S2,
int O2,
typename D2>
321 CartesianAxis3Linear::alphaCross(m_w, m.translation(), v.angular());
322 v.linear().noalias() =
323 m.rotation().transpose() * v.angular() + m_v * (m.rotation().transpose().col(axis));
326 v.angular().noalias() = m.rotation().transpose().col(axis) * m_w;
329 template<
typename S2,
int O2>
333 se3ActionInverse_impl(m, res);
337 template<
typename M1,
typename M2>
341 CartesianAxis3Linear::alphaCross(-m_w, v.linear(), mout.linear());
342 CartesianAxis3Linear::alphaCross(-m_v, v.angular(), mout.angular());
343 mout.linear() += mout.angular();
345 CartesianAxis3Angular::alphaCross(-m_w, v.angular(), mout.angular());
348 template<
typename M1>
352 motionAction(v, res);
360 const Scalar & angularRate()
const 369 const Scalar & linearRate()
const 374 bool isEqual_impl(
const MotionHelicalTpl & other)
const 376 return internal::comparison_eq(m_w, other.m_w) && internal::comparison_eq(m_v, other.m_v);
393 operator^(
const MotionDense<MotionDerived> & m1,
const MotionHelicalTpl<S2, O2, axis> & m2)
428 typedef _Scalar Scalar;
440 typedef Eigen::Matrix<Scalar, 1, 1, Options> JointForce;
441 typedef Eigen::Matrix<Scalar, 6, 1, Options> DenseBase;
442 typedef Eigen::Matrix<Scalar, 1, 1, Options> ReducedSquaredMatrix;
444 typedef DenseBase MatrixReturnType;
445 typedef const DenseBase ConstMatrixReturnType;
447 typedef typename ReducedSquaredMatrix::IdentityReturnType StDiagonalMatrixSOperationReturnType;
459 struct JointMotionSubspaceHelicalTpl
462 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
464 PINOCCHIO_CONSTRAINT_TYPEDEF_TPL(JointMotionSubspaceHelicalTpl)
473 typedef typename AxisAngular::CartesianAxis3 CartesianAxis3Angular;
474 typedef typename AxisLinear::CartesianAxis3 CartesianAxis3Linear;
476 JointMotionSubspaceHelicalTpl()
480 JointMotionSubspaceHelicalTpl(
const Scalar & h)
485 template<
typename Vector1Like>
486 JointMotion __mult__(
const Eigen::MatrixBase<Vector1Like> & v)
const 488 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector1Like, 1);
489 assert(v.size() == 1);
493 template<
typename S1,
int O1>
494 typename SE3GroupAction<JointMotionSubspaceHelicalTpl>::ReturnType
497 typedef typename SE3GroupAction<JointMotionSubspaceHelicalTpl>::ReturnType
ReturnType;
499 res.template segment<3>(LINEAR) =
500 m.translation().cross(m.rotation().col(axis)) + m_pitch * (m.rotation().col(axis));
501 res.template segment<3>(ANGULAR) = m.rotation().col(axis);
505 template<
typename S1,
int O1>
506 typename SE3GroupAction<JointMotionSubspaceHelicalTpl>::ReturnType
509 typedef typename SE3GroupAction<JointMotionSubspaceHelicalTpl>::ReturnType
ReturnType;
510 typedef typename AxisAngular::CartesianAxis3 CartesianAxis3;
512 res.template segment<3>(LINEAR).noalias() =
513 m.rotation().transpose() * CartesianAxis3::cross(m.translation())
514 + m.rotation().transpose().col(axis) * m_pitch;
515 res.template segment<3>(ANGULAR) = m.rotation().transpose().col(axis);
527 const JointMotionSubspaceHelicalTpl & ref;
528 TransposeConst(
const JointMotionSubspaceHelicalTpl & ref)
533 template<
typename ForceDerived>
534 typename ConstraintForceOp<JointMotionSubspaceHelicalTpl, ForceDerived>::ReturnType
537 return Eigen::Matrix<Scalar, 1, 1>(f.
angular()(axis) + f.
linear()(axis) * ref.m_pitch);
541 template<
typename Derived>
542 typename ConstraintForceSetOp<JointMotionSubspaceHelicalTpl, Derived>::ReturnType
545 assert(F.rows() == 6);
546 return F.row(ANGULAR + axis) + F.row(LINEAR + axis) * ref.m_pitch;
550 TransposeConst transpose()
const 552 return TransposeConst(*
this);
561 DenseBase matrix_impl()
const 564 MotionRef<DenseBase> v(S);
566 S(LINEAR + axis) = m_pitch;
570 template<
typename MotionDerived>
571 typename MotionAlgebraAction<JointMotionSubspaceHelicalTpl, MotionDerived>::ReturnType
572 motionAction(
const MotionDense<MotionDerived> & m)
const 574 typedef typename MotionAlgebraAction<JointMotionSubspaceHelicalTpl, MotionDerived>::ReturnType
578 CartesianAxis3Linear::cross(-m.linear(), res.template segment<3>(LINEAR));
579 CartesianAxis3Linear::alphaCross(-m_pitch, m.angular(), res.template segment<3>(ANGULAR));
580 res.template segment<3>(LINEAR) += res.template segment<3>(ANGULAR);
583 CartesianAxis3Angular::cross(-m.angular(), res.template segment<3>(ANGULAR));
587 bool isEqual(
const JointMotionSubspaceHelicalTpl &)
const 596 const Scalar & h()
const 643 static inline ReturnType run(
const Inertia & Y,
const Constraint & constraint)
646 const S2 & m_pitch = constraint.h();
650 const S1 &m = Y.mass(), &x = Y.lever()[0], &y = Y.lever()[1], &z = Y.lever()[2];
651 const typename Inertia::Symmetric3 & I = Y.inertia();
653 res << m * m_pitch, -m * z, m * y, I(0, 0) + m * (y * y + z * z),
654 I(0, 1) - m * x * y + m * z * m_pitch, I(0, 2) - m * x * z - m * y * m_pitch;
666 static inline ReturnType run(
const Inertia & Y,
const Constraint & constraint)
669 const S2 & m_pitch = constraint.h();
673 const S1 &m = Y.mass(), &x = Y.lever()[0], &y = Y.lever()[1], &z = Y.lever()[2];
674 const typename Inertia::Symmetric3 & I = Y.inertia();
676 res << m * z, m * m_pitch, -m * x, I(1, 0) - m * x * y - m * z * m_pitch,
677 I(1, 1) + m * (x * x + z * z), I(1, 2) - m * y * z + m * x * m_pitch;
689 static inline ReturnType run(
const Inertia & Y,
const Constraint & constraint)
692 const S2 & m_pitch = constraint.h();
696 const S1 &m = Y.mass(), &x = Y.lever()[0], &y = Y.lever()[1], &z = Y.lever()[2];
697 const typename Inertia::Symmetric3 & I = Y.inertia();
699 res << -m * y, m * x, m * m_pitch, I(2, 0) - m * x * z + m * y * m_pitch,
700 I(2, 1) - m * y * z - m * x * m_pitch, I(2, 2) + m * (x * x + y * y);
741 typedef _Scalar Scalar;
754 typedef Eigen::Matrix<Scalar, 6, NV, Options> U_t;
755 typedef Eigen::Matrix<Scalar, NV, NV, Options> D_t;
756 typedef Eigen::Matrix<Scalar, 6, NV, Options> UD_t;
758 typedef Eigen::Matrix<Scalar, NQ, 1, Options> ConfigVector_t;
759 typedef Eigen::Matrix<Scalar, NV, 1, Options> TangentVector_t;
761 typedef boost::mpl::true_ is_mimicable_t;
763 PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
833 struct JointModelHelicalTpl :
public JointModelBase<JointModelHelicalTpl<_Scalar, _Options, axis>>
835 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
837 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
843 using Base::idx_vExtended;
844 using Base::setIndexes;
846 typedef Eigen::Matrix<Scalar, 3, 1, _Options> Vector3;
848 JointDataDerived createData()
const 850 return JointDataDerived();
853 JointModelHelicalTpl()
857 explicit JointModelHelicalTpl(
const Scalar & h)
862 const std::vector<bool> hasConfigurationLimit()
const 867 const std::vector<bool> hasConfigurationLimitInTangent()
const 872 template<
typename ConfigVector>
873 PINOCCHIO_DONT_INLINE
void 874 calc(JointDataDerived & data,
const typename Eigen::MatrixBase<ConfigVector> & qs)
const 876 data.joint_q[0] = qs[idx_q()];
878 SINCOS(data.joint_q[0], &sa, &ca);
879 data.M.setValues(sa, ca, data.joint_q[0] * m_pitch);
880 data.S.h() = m_pitch;
883 template<
typename TangentVector>
884 PINOCCHIO_DONT_INLINE
void 885 calc(JointDataDerived & data,
const Blank,
const typename Eigen::MatrixBase<TangentVector> & vs)
888 data.joint_v[0] = vs[idx_v()];
889 data.v.angularRate() = data.joint_v[0];
890 data.v.linearRate() = data.joint_v[0] * m_pitch;
893 template<
typename ConfigVector,
typename TangentVector>
894 PINOCCHIO_DONT_INLINE
void calc(
895 JointDataDerived & data,
896 const typename Eigen::MatrixBase<ConfigVector> & qs,
897 const typename Eigen::MatrixBase<TangentVector> & vs)
const 899 calc(data, qs.derived());
901 data.joint_v[0] = vs[idx_v()];
902 data.v.angularRate() = data.joint_v[0];
903 data.v.linearRate() = data.joint_v[0] * m_pitch;
906 template<
typename VectorLike,
typename Matrix6Like>
908 JointDataDerived & data,
909 const Eigen::MatrixBase<VectorLike> & armature,
910 const Eigen::MatrixBase<Matrix6Like> & I,
911 const bool update_I)
const 913 data.U = I.col(Inertia::ANGULAR + axis) + m_pitch * I.col(Inertia::LINEAR + axis);
915 data.U(Inertia::ANGULAR + axis) + m_pitch * data.U(Inertia::LINEAR + axis) + armature[0];
916 data.Dinv[0] =
Scalar(1) / data.StU[0];
917 data.UDinv.noalias() = data.U * data.Dinv;
920 PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like, I).noalias() -= data.UDinv * data.U.transpose();
923 static std::string classname()
927 std::string shortname()
const 932 Vector3 getMotionAxis()
const 937 return Vector3::UnitX();
939 return Vector3::UnitY();
941 return Vector3::UnitZ();
943 assert(
false &&
"must never happen");
949 template<
typename NewScalar>
950 JointModelHelicalTpl<NewScalar, Options, axis>
cast()
const 952 typedef JointModelHelicalTpl<NewScalar, Options, axis>
ReturnType;
953 ReturnType res(ScalarCast<NewScalar, Scalar>::cast(m_pitch));
954 res.setIndexes(
id(), idx_q(), idx_v(), idx_vExtended());