@@ -129,6 +129,9 @@ namespace pinocchio
129129 using Base::idx_v;
130130 using Base::idx_vExtended;
131131 using Base::setIndexes;
132+
133+ typedef typename Transformation_t::Vector3 Vector3;
134+
132135 Scalar radius_a;
133136 Scalar radius_b;
134137 Scalar radius_c;
@@ -321,6 +324,94 @@ namespace pinocchio
321324 return res;
322325 }
323326
327+ template <typename ConfigVector>
328+ Vector3 computeTranslations (
329+ const typename Eigen::MatrixBase<ConfigVector> & qs) const
330+ {
331+ Scalar c0, s0;
332+ SINCOS (qs (0 ), &s0, &c0);
333+ Scalar c1, s1;
334+ SINCOS (qs (1 ), &s1, &c1);
335+
336+ return computeTranslations (s0, c0, s1, c1);
337+ }
338+
339+ Vector3 computeTranslations (
340+ const Scalar & s0,
341+ const Scalar & c0,
342+ const Scalar & s1,
343+ const Scalar & c1) const
344+ {
345+ Scalar nx, ny, nz;
346+ nx = s1;
347+ ny = -s0 * c1;
348+ nz = c0 * c1;
349+
350+ return Vector3 (radius_a * nx, radius_b * ny, radius_c * nz);
351+ }
352+
353+ template <typename ConfigVector, typename TangentVector>
354+ Vector3 computeTranslationVelocities (
355+ const typename Eigen::MatrixBase<ConfigVector> & qs,
356+ const typename Eigen::MatrixBase<TangentVector> & vs) const
357+ {
358+ Scalar c0, s0;
359+ SINCOS (qs (0 ), &s0, &c0);
360+ Scalar c1, s1;
361+ SINCOS (qs (1 ), &s1, &c1);
362+
363+ return computeTranslationVelocities (s0, c0, s1, c1, vs (0 ), vs (1 ));
364+ }
365+
366+ Vector3 computeTranslationVelocities (
367+ const Scalar & s0,
368+ const Scalar & c0,
369+ const Scalar & s1,
370+ const Scalar & c1,
371+ const Scalar & q0dot,
372+ const Scalar & q1dot) const
373+ {
374+ Vector3 v;
375+ v (0 ) = radius_a * c1 * q1dot;
376+ v (1 ) = radius_b * (- c0 * c1 * q0dot + s0 * s1 * q1dot);
377+ v (2 ) = radius_c * (-s0 * c1 * q0dot - c0 * s1 * q1dot);
378+ return v;
379+ }
380+
381+ template <typename ConfigVector, typename TangentVector, typename TangentVector2>
382+ Vector3 computeTranslationAccelerations (
383+ const typename Eigen::MatrixBase<ConfigVector> & qs,
384+ const typename Eigen::MatrixBase<TangentVector> & vs,
385+ const typename Eigen::MatrixBase<TangentVector2> & as) const
386+ {
387+ Vector3 a;
388+ Scalar c0, s0;
389+ SINCOS (qs (0 ), &s0, &c0);
390+ Scalar c1, s1;
391+ SINCOS (qs (1 ), &s1, &c1);
392+ return computeTranslationAccelerations (
393+ s0, c0, s1, c1, vs (0 ), vs (1 ), as (0 ), as (1 ));
394+ }
395+
396+ Vector3 computeTranslationAccelerations (
397+ const Scalar & s0,
398+ const Scalar & c0,
399+ const Scalar & s1,
400+ const Scalar & c1,
401+ const Scalar & q0dot,
402+ const Scalar & q1dot,
403+ const Scalar & q0ddot,
404+ const Scalar & q1ddot) const
405+ {
406+ Vector3 a;
407+ a (0 ) = radius_a * (-s1 * q1dot * q1dot + c1 * q1ddot);
408+ a (1 ) = radius_b * (s0 * c1 * q0dot * q0dot + c0 * s1 * q0dot * q1dot - c0 * c1 * q0ddot
409+ + c0 * s1 * q1dot * q0dot + s0 * c1 * q1dot * q1dot + s0 * s1 * q1ddot);
410+ a (2 ) = radius_c * (-c0 * c1 * q0dot * q0dot + s0 * s1 * q0dot * q1dot - s0 * c1 * q0ddot
411+ + s0 * s1 * q1dot * q0dot - c0 * c1 * q1dot * q1dot - c0 * s1 * q1ddot);
412+ return a;
413+ }
414+
324415 void computeMotionSubspace (
325416 const Scalar & s0,
326417 const Scalar & c0,
0 commit comments