6 #ifndef __pinocchio_spatial_inertia_hpp__
7 #define __pinocchio_spatial_inertia_hpp__
9 #include "pinocchio/math/fwd.hpp"
10 #include "pinocchio/spatial/symmetric3.hpp"
11 #include "pinocchio/spatial/force.hpp"
12 #include "pinocchio/spatial/motion.hpp"
13 #include "pinocchio/spatial/skew.hpp"
17 template<
class Derived>
20 SPATIAL_TYPEDEF_TEMPLATE(Derived);
24 return *
static_cast<Derived *
>(
this);
26 const Derived & derived()
const
28 return *
static_cast<const Derived *
>(
this);
31 Derived & const_cast_derived()
const
33 return *
const_cast<Derived *
>(&derived());
38 return static_cast<const Derived *
>(
this)->mass();
42 return static_cast<const Derived *
>(
this)->mass();
44 const Vector3 & lever()
const
46 return static_cast<const Derived *
>(
this)->lever();
50 return static_cast<const Derived *
>(
this)->lever();
54 return static_cast<const Derived *
>(
this)->inertia();
58 return static_cast<const Derived *
>(
this)->inertia();
61 template<
typename Matrix6Like>
62 void matrix(
const Eigen::MatrixBase<Matrix6Like> & mat)
const
64 derived().matrix_impl(mat);
66 Matrix6 matrix()
const
68 return derived().matrix_impl();
70 operator Matrix6()
const
75 template<
typename Matrix6Like>
76 void inverse(
const Eigen::MatrixBase<Matrix6Like> & mat)
const
78 derived().inverse_impl(mat);
80 Matrix6 inverse()
const
82 return derived().inverse_impl();
85 Derived & operator=(
const Derived & clone)
87 return derived().__equl__(clone);
89 bool operator==(
const Derived & other)
const
91 return derived().isEqual(other);
93 bool operator!=(
const Derived & other)
const
95 return !(*
this == other);
98 Derived & operator+=(
const Derived & Yb)
100 return derived().__pequ__(Yb);
102 Derived operator+(
const Derived & Yb)
const
104 return derived().__plus__(Yb);
106 Derived & operator-=(
const Derived & Yb)
108 return derived().__mequ__(Yb);
110 Derived operator-(
const Derived & Yb)
const
112 return derived().__minus__(Yb);
115 template<
typename MotionDerived>
119 return derived().__mult__(v);
122 template<
typename MotionDerived>
125 return derived().vtiv_impl(v);
128 template<
typename MotionDerived>
131 return derived().variation_impl(v);
142 template<
typename MotionDerived,
typename M6>
146 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(M6, Matrix6);
147 Derived::vxi_impl(v, I, Iout);
150 template<
typename MotionDerived>
154 vxi(v, derived(), Iout);
166 template<
typename MotionDerived,
typename M6>
170 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(M6, Matrix6);
171 Derived::ivx_impl(v, I, Iout);
174 template<
typename MotionDerived>
178 ivx(v, derived(), Iout);
188 derived().setIdentity();
192 derived().setRandom();
196 const Derived & other,
197 const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const
199 return derived().isApprox_impl(other, prec);
202 bool isZero(
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const
204 return derived().isZero_impl(prec);
208 template<
typename S2,
int O2>
211 return derived().se3Action_impl(M);
215 template<
typename S2,
int O2>
218 return derived().se3ActionInverse_impl(M);
221 void disp(std::ostream & os)
const
223 static_cast<const Derived *
>(
this)->disp_impl(os);
225 friend std::ostream & operator<<(std::ostream & os,
const InertiaBase<Derived> & X)
233 template<
typename T,
int U>
237 typedef Eigen::Matrix<T, 3, 1, U> Vector3;
238 typedef Eigen::Matrix<T, 4, 1, U> Vector4;
239 typedef Eigen::Matrix<T, 6, 1, U> Vector6;
240 typedef Eigen::Matrix<T, 3, 3, U> Matrix3;
241 typedef Eigen::Matrix<T, 4, 4, U> Matrix4;
242 typedef Eigen::Matrix<T, 6, 6, U> Matrix6;
243 typedef Eigen::Matrix<T, 10, 10, U> Matrix10;
244 typedef Matrix6 ActionMatrix_t;
245 typedef Vector3 Angular_t;
246 typedef Vector3 Linear_t;
247 typedef const Vector3 ConstAngular_t;
248 typedef const Vector3 ConstLinear_t;
249 typedef Eigen::Quaternion<T, U> Quaternion_t;
263 template<
typename _Scalar,
int _Options>
266 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
274 typedef typename Symmetric3::AlphaSkewSquare AlphaSkewSquare;
275 typedef Eigen::Matrix<Scalar, 10, 1, Options> Vector10;
276 typedef Eigen::Matrix<Scalar, 10, 10, Options> Matrix10;
285 InertiaTpl(
const Scalar & mass,
const Vector3 & com,
const Matrix3 & rotational_inertia)
288 , m_inertia(rotational_inertia)
294 assert(check_expression_if_real<Scalar>(pinocchio::isZero(I6 - I6.transpose())));
295 mass() = I6(LINEAR, LINEAR);
296 const typename Matrix6::template ConstFixedBlockXpr<3, 3>::Type mc_cross =
297 I6.template block<3, 3>(ANGULAR, LINEAR);
298 lever() =
unSkew(mc_cross);
301 Matrix3 I3(mc_cross * mc_cross);
303 I3 += I6.template block<3, 3>(ANGULAR, ANGULAR);
311 , m_inertia(rotational_inertia)
316 : m_mass(clone.mass())
317 , m_com(clone.lever())
318 , m_inertia(clone.inertia())
324 m_mass = clone.mass();
325 m_com = clone.lever();
326 m_inertia = clone.inertia();
330 template<
typename S2,
int O2>
333 *
this = clone.template cast<Scalar>();
339 return InertiaTpl(Scalar(0), Vector3::Zero(), Symmetric3::Zero());
351 return InertiaTpl(Scalar(1), Vector3::Zero(), Symmetric3::Identity());
358 inertia().setIdentity();
365 Eigen::internal::random<Scalar>() + 1, Vector3::Random(), Symmetric3::RandomPositive());
389 FromEllipsoid(
const Scalar mass,
const Scalar x,
const Scalar y,
const Scalar z)
391 const Scalar a = mass * (y * y + z * z) / Scalar(5);
392 const Scalar b = mass * (x * x + z * z) / Scalar(5);
393 const Scalar c = mass * (y * y + x * x) / Scalar(5);
395 mass, Vector3::Zero(),
Symmetric3(a, Scalar(0), b, Scalar(0), Scalar(0), c));
408 const Scalar radius_square = radius * radius;
409 const Scalar a = mass * (radius_square / Scalar(4) + length * length / Scalar(12));
410 const Scalar c = mass * (radius_square / Scalar(2));
412 mass, Vector3::Zero(),
Symmetric3(a, Scalar(0), a, Scalar(0), Scalar(0), c));
425 const Scalar a = mass * (y * y + z * z) / Scalar(12);
426 const Scalar b = mass * (x * x + z * z) / Scalar(12);
427 const Scalar c = mass * (y * y + x * x) / Scalar(12);
429 mass, Vector3::Zero(),
Symmetric3(a, Scalar(0), b, Scalar(0), Scalar(0), c));
441 const Scalar pi = boost::math::constants::pi<Scalar>();
444 const Scalar v_cyl = pi * math::pow(radius, 2) * height;
445 const Scalar v_hs = Scalar(2) / Scalar(3) * math::pow(radius, 3) * pi;
446 const Scalar total_v = v_cyl + Scalar(2) * v_hs;
448 const Scalar m_cyl = mass * (v_cyl / total_v);
449 const Scalar m_hs = mass * (v_hs / total_v);
452 const Scalar dist_hc_cyl = height / Scalar(2) + Scalar(0.375) * radius;
456 m_cyl * (math::pow(height, 2) / Scalar(12) + math::pow(radius, 2) / Scalar(4));
457 const Scalar iz_c = m_cyl * math::pow(radius, 2) / Scalar(2);
461 const Scalar ix_hs = m_hs * math::pow(radius, 2) * Scalar(0.259375);
462 const Scalar iz_hs = m_hs * math::pow(radius, 2) * Scalar(0.4);
465 const Scalar ix = ix_c + Scalar(2) * (ix_hs + m_hs * math::pow(dist_hc_cyl, 2));
466 const Scalar iz = iz_c + Scalar(2) * iz_hs;
469 mass, Vector3::Zero(),
Symmetric3(ix, Scalar(0), ix, Scalar(0), Scalar(0), iz));
474 mass() =
static_cast<Scalar
>(std::rand()) /
static_cast<Scalar
>(RAND_MAX);
476 inertia().setRandom();
479 template<
typename Matrix6Like>
480 void matrix_impl(
const Eigen::MatrixBase<Matrix6Like> & M_)
const
482 Matrix6Like & M = M_.const_cast_derived();
484 M.template block<3, 3>(LINEAR, LINEAR).setZero();
485 M.template block<3, 3>(LINEAR, LINEAR).diagonal().fill(mass());
486 M.template block<3, 3>(ANGULAR, LINEAR) =
alphaSkew(mass(), lever());
487 M.template block<3, 3>(LINEAR, ANGULAR) = -M.template block<3, 3>(ANGULAR, LINEAR);
488 M.template block<3, 3>(ANGULAR, ANGULAR) =
489 (inertia() - AlphaSkewSquare(mass(), lever())).matrix();
492 Matrix6 matrix_impl()
const
499 template<
typename Matrix6Like>
500 void inverse_impl(
const Eigen::MatrixBase<Matrix6Like> & M_)
const
502 Matrix6Like & M = M_.const_cast_derived();
503 inertia().inverse(M.template block<3, 3>(ANGULAR, ANGULAR));
505 M.template block<3, 3>(LINEAR, ANGULAR).noalias() =
506 -M.template block<3, 3>(ANGULAR, ANGULAR).colwise().cross(lever());
507 M.template block<3, 3>(ANGULAR, LINEAR) = M.template block<3, 3>(LINEAR, ANGULAR).transpose();
509 const Scalar &cx = lever()[0], cy = lever()[1], cz = lever()[2];
511 M.template block<3, 3>(LINEAR, LINEAR).col(0).noalias() =
512 cy * M.template block<3, 3>(LINEAR, ANGULAR).col(2)
513 - cz * M.template block<3, 3>(LINEAR, ANGULAR).col(1);
515 M.template block<3, 3>(LINEAR, LINEAR).col(1).noalias() =
516 cz * M.template block<3, 3>(LINEAR, ANGULAR).col(0)
517 - cx * M.template block<3, 3>(LINEAR, ANGULAR).col(2);
519 M.template block<3, 3>(LINEAR, LINEAR).col(2).noalias() =
520 cx * M.template block<3, 3>(LINEAR, ANGULAR).col(1)
521 - cy * M.template block<3, 3>(LINEAR, ANGULAR).col(0);
523 const Scalar m_inv = Scalar(1) / mass();
524 M.template block<3, 3>(LINEAR, LINEAR).diagonal().array() += m_inv;
527 Matrix6 inverse_impl()
const
546 v.template segment<3>(1).noalias() = mass() * lever();
547 v.template segment<6>(4) = (inertia() - AlphaSkewSquare(mass(), lever())).data();
560 template<
typename Vector10Like>
563 PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Vector10Like, params, 10, 1);
565 const Scalar & mass = params[0];
566 Vector3 lever = params.template segment<3>(1);
570 mass, lever,
Symmetric3(params.template segment<6>(4)) + AlphaSkewSquare(mass, lever));
594 return pseudo_inertia;
613 mass() = clone.mass();
614 lever() = clone.lever();
615 inertia() = clone.inertia();
620 bool isEqual(
const InertiaTpl & Y2)
const
622 return (mass() == Y2.mass()) && (lever() == Y2.lever()) && (inertia() == Y2.inertia());
626 const InertiaTpl & other,
627 const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const
630 return fabs(
static_cast<Scalar
>(mass() - other.mass())) <= prec
631 && lever().isApprox(other.lever(), prec) && inertia().isApprox(other.inertia(), prec);
634 bool isZero_impl(
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const
637 return fabs(mass()) <= prec && lever().isZero(prec) && inertia().isZero(prec);
640 InertiaTpl __plus__(
const InertiaTpl & Yb)
const
647 const Scalar eps = ::Eigen::NumTraits<Scalar>::epsilon();
649 const Scalar & mab = mass() + Yb.mass();
650 const Scalar mab_inv = Scalar(1) / math::max(mab, eps);
651 const Vector3 & AB = (lever() - Yb.lever()).eval();
653 mab, (mass() * lever() + Yb.mass() * Yb.lever()) * mab_inv,
654 inertia() + Yb.inertia()
655 - (mass() * Yb.mass() * mab_inv) *
typename Symmetric3::SkewSquare(AB));
658 InertiaTpl & __pequ__(
const InertiaTpl & Yb)
660 static const Scalar eps = ::Eigen::NumTraits<Scalar>::epsilon();
662 const InertiaTpl & Ya = *
this;
663 const Scalar & mab = mass() + Yb.mass();
664 const Scalar mab_inv = Scalar(1) / math::max(mab, eps);
665 const Vector3 & AB = (Ya.lever() - Yb.lever()).eval();
666 lever() *= (mass() * mab_inv);
667 lever() += (Yb.mass() * mab_inv) * Yb.lever();
668 inertia() += Yb.inertia();
669 inertia() -= (Ya.mass() * Yb.mass() * mab_inv) *
typename Symmetric3::SkewSquare(AB);
674 InertiaTpl __minus__(
const InertiaTpl & Yb)
const
681 const Scalar eps = ::Eigen::NumTraits<Scalar>::epsilon();
683 const Scalar ma = mass() - Yb.mass();
684 assert(check_expression_if_real<Scalar>(ma >= Scalar(0)));
686 const Scalar ma_inv = Scalar(1) / math::max(ma, eps);
687 const Vector3 c_a((mass() * lever() - Yb.mass() * Yb.lever()) * ma_inv);
689 const Vector3 AB = c_a - Yb.lever();
693 inertia() - Yb.inertia() + (ma * Yb.mass() / mass()) *
typename Symmetric3::SkewSquare(AB));
696 InertiaTpl & __mequ__(
const InertiaTpl & Yb)
698 static const Scalar eps = ::Eigen::NumTraits<Scalar>::epsilon();
700 const Scalar ma = mass() - Yb.mass();
701 assert(check_expression_if_real<Scalar>(ma >= Scalar(0)));
703 const Scalar ma_inv = Scalar(1) / math::max(ma, eps);
705 lever() *= (mass() * ma_inv);
706 lever().noalias() -= (Yb.mass() * ma_inv) * Yb.lever();
708 const Vector3 AB = lever() - Yb.lever();
709 inertia() -= Yb.inertia();
710 inertia() += (ma * Yb.mass() / mass()) *
typename Symmetric3::SkewSquare(AB);
716 template<
typename MotionDerived>
717 ForceTpl<typename traits<MotionDerived>::Scalar, traits<MotionDerived>::Options>
718 __mult__(
const MotionDense<MotionDerived> & v)
const
720 typedef ForceTpl<typename traits<MotionDerived>::Scalar, traits<MotionDerived>::Options>
727 template<
typename MotionDerived,
typename ForceDerived>
728 void __mult__(
const MotionDense<MotionDerived> & v, ForceDense<ForceDerived> & f)
const
730 f.linear().noalias() = mass() * (v.linear() - lever().cross(v.angular()));
731 Symmetric3::rhsMult(inertia(), v.angular(), f.angular());
732 f.angular() += lever().cross(f.linear());
736 template<
typename MotionDerived>
737 Scalar vtiv_impl(
const MotionDense<MotionDerived> & v)
const
739 const Vector3 cxw(lever().
cross(v.angular()));
740 Scalar res = mass() * (v.linear().squaredNorm() - Scalar(2) * v.linear().dot(cxw));
741 const Vector3 mcxcxw(-mass() * lever().
cross(cxw));
742 res += v.angular().dot(mcxcxw);
743 res += inertia().vtiv(v.angular());
748 template<
typename MotionDerived>
749 Matrix6 variation(
const MotionDense<MotionDerived> & v)
const
752 const Motion mv(v * mass());
754 res.template block<3, 3>(LINEAR, ANGULAR) =
756 res.template block<3, 3>(ANGULAR, LINEAR) =
757 res.template block<3, 3>(LINEAR, ANGULAR).transpose();
762 res.template block<3, 3>(ANGULAR, ANGULAR) =
765 res.template block<3, 3>(LINEAR, LINEAR) =
766 (inertia() - AlphaSkewSquare(mass(), lever())).matrix();
768 res.template block<3, 3>(ANGULAR, ANGULAR) -=
769 res.template block<3, 3>(LINEAR, LINEAR) *
skew(v.angular());
770 res.template block<3, 3>(ANGULAR, ANGULAR) +=
771 cross(v.angular(), res.template block<3, 3>(LINEAR, LINEAR));
773 res.template block<3, 3>(LINEAR, LINEAR).setZero();
777 template<
typename MotionDerived,
typename M6>
778 static void vxi_impl(
779 const MotionDense<MotionDerived> & v,
780 const InertiaTpl & I,
781 const Eigen::MatrixBase<M6> & Iout)
783 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(M6, 6, 6);
784 M6 & Iout_ = PINOCCHIO_EIGEN_CONST_CAST(M6, Iout);
787 alphaSkew(I.mass(), v.angular(), Iout_.template block<3, 3>(LINEAR, LINEAR));
789 const Vector3 mc(I.mass() * I.lever());
792 skewSquare(-v.angular(), mc, Iout_.template block<3, 3>(LINEAR, ANGULAR));
795 alphaSkew(I.mass(), v.linear(), Iout_.template block<3, 3>(ANGULAR, LINEAR));
796 Iout_.template block<3, 3>(ANGULAR, LINEAR) -= Iout_.template block<3, 3>(LINEAR, ANGULAR);
799 skewSquare(-v.linear(), mc, Iout_.template block<3, 3>(ANGULAR, ANGULAR));
806 Symmetric3 mcxcx(
typename Symmetric3::AlphaSkewSquare(I.mass(), I.lever()));
807 Iout_.template block<3, 3>(ANGULAR, ANGULAR) += I.inertia().vxs(v.angular());
808 Iout_.template block<3, 3>(ANGULAR, ANGULAR) -= mcxcx.vxs(v.angular());
811 template<
typename MotionDerived,
typename M6>
812 static void ivx_impl(
813 const MotionDense<MotionDerived> & v,
814 const InertiaTpl & I,
815 const Eigen::MatrixBase<M6> & Iout)
817 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(M6, 6, 6);
818 M6 & Iout_ = PINOCCHIO_EIGEN_CONST_CAST(M6, Iout);
821 alphaSkew(I.mass(), v.angular(), Iout_.template block<3, 3>(LINEAR, LINEAR));
824 const Vector3 mc(I.mass() * I.lever());
825 skewSquare(mc, v.angular(), Iout_.template block<3, 3>(ANGULAR, LINEAR));
828 alphaSkew(I.mass(), v.linear(), Iout_.template block<3, 3>(LINEAR, ANGULAR));
832 -I.lever(), Iout_.template block<3, 3>(ANGULAR, LINEAR),
833 Iout_.template block<3, 3>(ANGULAR, ANGULAR));
834 Iout_.template block<3, 3>(ANGULAR, ANGULAR) += I.inertia().svx(v.angular());
835 for (
int k = 0; k < 3; ++k)
836 Iout_.template block<3, 3>(ANGULAR, ANGULAR).col(k) +=
837 I.lever().cross(Iout_.template block<3, 3>(LINEAR, ANGULAR).col(k));
840 Iout_.template block<3, 3>(LINEAR, ANGULAR) -= Iout_.template block<3, 3>(ANGULAR, LINEAR);
848 const Vector3 & lever()
const
852 const Symmetric3 & inertia()
const
865 Symmetric3 & inertia()
871 template<
typename S2,
int O2>
878 mass(), M.translation() + M.rotation() * lever(), inertia().rotate(M.rotation()));
882 template<
typename S2,
int O2>
886 mass(), M.rotation().transpose() * (lever() - M.translation()),
887 inertia().rotate(M.rotation().transpose()));
890 template<
typename MotionDerived>
893 const Vector3 & mcxw = mass() * lever().cross(v.angular());
894 const Vector3 & mv_mcxw = mass() * v.linear() - mcxw;
896 v.angular().cross(mv_mcxw),
897 v.angular().cross(lever().
cross(mv_mcxw) + inertia() * v.angular())
898 - v.linear().cross(mcxw));
901 void disp_impl(std::ostream & os)
const
903 os <<
" m = " << mass() <<
"\n"
904 <<
" c = " << lever().transpose() <<
"\n"
906 << inertia().matrix() <<
"";
910 template<
typename NewScalar>
914 pinocchio::cast<NewScalar>(mass()), lever().
template cast<NewScalar>(),
915 inertia().
template cast<NewScalar>());
942 template<
typename _Scalar,
int _Options>
945 typedef _Scalar Scalar;
950 typedef Eigen::Matrix<Scalar, 4, 4, Options> Matrix4;
951 typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
952 typedef Eigen::Matrix<Scalar, 3, 3, Options> Matrix3;
953 typedef Eigen::Matrix<Scalar, 10, 1, Options> Vector10;
973 Matrix4 pseudo_inertia = Matrix4::Zero();
974 pseudo_inertia.template block<3, 3>(0, 0) =
sigma;
975 pseudo_inertia.template block<3, 1>(0, 3) =
h;
976 pseudo_inertia.template block<1, 3>(3, 0) =
h.transpose();
977 pseudo_inertia(3, 3) =
mass;
978 return pseudo_inertia;
988 Scalar
mass = pseudo_inertia(3, 3);
989 Vector3
h = pseudo_inertia.template block<3, 1>(0, 3);
990 Matrix3
sigma = pseudo_inertia.template block<3, 3>(0, 0);
999 template<
typename Vector10Like>
1003 PINOCCHIO_ASSERT_MATRIX_SPECIFIC_SIZE(Vector10Like, dynamic_params, 10, 1);
1004 Scalar
mass = dynamic_params[0];
1005 Vector3
h = dynamic_params.template segment<3>(1);
1008 I_bar << dynamic_params[4], dynamic_params[5], dynamic_params[7],
1009 dynamic_params[5], dynamic_params[6], dynamic_params[8],
1010 dynamic_params[7], dynamic_params[8], dynamic_params[9];
1013 Matrix3
sigma = 0.5 * I_bar.trace() * Matrix3::Identity() - I_bar;
1023 Matrix3 I_bar =
sigma.trace() * Matrix3::Identity() -
sigma;
1025 Vector10 dynamic_params;
1026 dynamic_params[0] =
mass;
1027 dynamic_params.template segment<3>(1) =
h;
1028 dynamic_params[4] = I_bar(0, 0);
1029 dynamic_params[5] = I_bar(0, 1);
1030 dynamic_params[6] = I_bar(1, 1);
1031 dynamic_params[7] = I_bar(0, 2);
1032 dynamic_params[8] = I_bar(1, 2);
1033 dynamic_params[9] = I_bar(2, 2);
1035 return dynamic_params;
1071 template<
typename NewScalar>
1075 pinocchio::cast<NewScalar>(
mass),
h.template cast<NewScalar>(),
1076 sigma.template cast<NewScalar>());
1079 void disp_impl(std::ostream & os)
const
1081 os <<
" m = " <<
mass <<
"\n"
1082 <<
" h = " <<
h.transpose() <<
"\n"
1087 friend std::ostream & operator<<(std::ostream & os,
const PseudoInertiaTpl & pi)
1101 template<
typename _Scalar,
int _Options>
1104 typedef _Scalar Scalar;
1109 typedef Eigen::Matrix<Scalar, 10, 1, Options> Vector10;
1110 typedef Eigen::Matrix<Scalar, 10, 10, Options> Matrix10;
1132 Vector10 dynamic_params;
1145 const Scalar exp_d1 = exp(d1);
1146 const Scalar exp_d2 = exp(d2);
1147 const Scalar exp_d3 = exp(d3);
1149 dynamic_params[0] = 1;
1150 dynamic_params[1] = t1;
1151 dynamic_params[2] = t2;
1152 dynamic_params[3] = t3;
1153 dynamic_params[4] = pow(s23, 2) + pow(t2, 2) + pow(t3, 2) + pow(exp_d2, 2) + pow(exp_d3, 2);
1154 dynamic_params[5] = -s12 * exp_d2 - s13 * s23 - t1 * t2;
1155 dynamic_params[6] = pow(s12, 2) + pow(s13, 2) + pow(t1, 2) + pow(t3, 2) + pow(exp_d1, 2) + pow(exp_d3, 2);
1156 dynamic_params[7] = -s13 * exp_d3 - t1 * t3;
1157 dynamic_params[8] = -s23 * exp_d3 - t2 * t3;
1158 dynamic_params[9] = pow(s12, 2) + pow(s13, 2) + pow(s23, 2) + pow(t1, 2) + pow(t2, 2) + pow(exp_d1, 2) + pow(exp_d2, 2);
1160 const Scalar exp_2_alpha = exp(2 * alpha);
1161 dynamic_params *= exp_2_alpha;
1164 return dynamic_params;
1196 Matrix10 jacobian = Matrix10::Zero();
1209 const Scalar exp_2alpha = exp(2 * alpha);
1210 const Scalar exp_2d1 = exp(2 * d1);
1211 const Scalar exp_2d2 = exp(2 * d2);
1212 const Scalar exp_2d3 = exp(2 * d3);
1213 const Scalar exp_d1 = exp(d1);
1214 const Scalar exp_d2 = exp(d2);
1215 const Scalar exp_d3 = exp(d3);
1218 jacobian(0, 0) = 2 * exp_2alpha;
1220 jacobian(1, 0) = 2 * t1 * exp_2alpha;
1221 jacobian(1, 7) = exp_2alpha;
1223 jacobian(2, 0) = 2 * t2 * exp_2alpha;
1224 jacobian(2, 8) = exp_2alpha;
1226 jacobian(3, 0) = 2 * t3 * exp_2alpha;
1227 jacobian(3, 9) = exp_2alpha;
1229 jacobian(4, 0) = 2 * (pow(s23, 2) + pow(t2, 2) + pow(t3, 2) + exp_2d2 + exp_2d3) * exp_2alpha;
1230 jacobian(4, 2) = 2 * exp_2alpha * exp_2d2;
1231 jacobian(4, 3) = 2 * exp_2alpha * exp_2d3;
1232 jacobian(4, 5) = 2 * s23 * exp_2alpha;
1233 jacobian(4, 8) = 2 * t2 * exp_2alpha;
1234 jacobian(4, 9) = 2 * t3 * exp_2alpha;
1236 jacobian(5, 0) = -2 * (s12 * exp_d2 + s13 * s23 + t1 * t2) * exp_2alpha;
1237 jacobian(5, 2) = -s12 * exp_2alpha * exp_d2;
1238 jacobian(5, 4) = -exp_2alpha * exp_d2;
1239 jacobian(5, 5) = -s13 * exp_2alpha;
1240 jacobian(5, 6) = -s23 * exp_2alpha;
1241 jacobian(5, 7) = -t2 * exp_2alpha;
1242 jacobian(5, 8) = -t1 * exp_2alpha;
1244 jacobian(6, 0) = 2 * (pow(s12, 2) + pow(s13, 2) + pow(t1, 2) + pow(t3, 2) + exp_2d1 + exp_2d3) * exp_2alpha;
1245 jacobian(6, 1) = 2 * exp_2alpha * exp_2d1;
1246 jacobian(6, 3) = 2 * exp_2alpha * exp_2d3;
1247 jacobian(6, 4) = 2 * s12 * exp_2alpha;
1248 jacobian(6, 6) = 2 * s13 * exp_2alpha;
1249 jacobian(6, 7) = 2 * t1 * exp_2alpha;
1250 jacobian(6, 9) = 2 * t3 * exp_2alpha;
1252 jacobian(7, 0) = -2 * (s13 * exp_d3 + t1 * t3) * exp_2alpha;
1253 jacobian(7, 3) = -s13 * exp_2alpha * exp_d3;
1254 jacobian(7, 6) = -exp_2alpha * exp_d3;
1255 jacobian(7, 7) = -t3 * exp_2alpha;
1256 jacobian(7, 9) = -t1 * exp_2alpha;
1258 jacobian(8, 0) = -2 * (s23 * exp_d3 + t2 * t3) * exp_2alpha;
1259 jacobian(8, 3) = -s23 * exp_2alpha * exp_d3;
1260 jacobian(8, 5) = -exp_2alpha * exp_d3;
1261 jacobian(8, 8) = -t3 * exp_2alpha;
1262 jacobian(8, 9) = -t2 * exp_2alpha;
1264 jacobian(9, 0) = 2 * (pow(s12, 2) + pow(s13, 2) + pow(s23, 2) + pow(t1, 2) + pow(t2, 2) + exp_2d1 + exp_2d2) * exp_2alpha;
1265 jacobian(9, 1) = 2 * exp_2alpha * exp_2d1;
1266 jacobian(9, 2) = 2 * exp_2alpha * exp_2d2;
1267 jacobian(9, 4) = 2 * s12 * exp_2alpha;
1268 jacobian(9, 5) = 2 * s23 * exp_2alpha;
1269 jacobian(9, 6) = 2 * s13 * exp_2alpha;
1270 jacobian(9, 7) = 2 * t1 * exp_2alpha;
1271 jacobian(9, 8) = 2 * t2 * exp_2alpha;
1278 template<
typename NewScalar>
1284 void disp_impl(std::ostream & os)
const
Main pinocchio namespace.
void skewSquare(const Eigen::MatrixBase< V1 > &u, const Eigen::MatrixBase< V2 > &v, const Eigen::MatrixBase< Matrix3 > &C)
Computes the square cross product linear operator C(u,v) such that for any vector w,...
void alphaSkew(const Scalar alpha, const Eigen::MatrixBase< Vector3 > &v, const Eigen::MatrixBase< Matrix3 > &M)
Computes the skew representation of a given 3d vector multiplied by a given scalar....
void cross(const Eigen::MatrixBase< Vector3 > &v, const Eigen::MatrixBase< Matrix3xIn > &Min, const Eigen::MatrixBase< Matrix3xOut > &Mout)
Applies the cross product onto the columns of M.
void unSkew(const Eigen::MatrixBase< Matrix3 > &M, const Eigen::MatrixBase< Vector3 > &v)
Inverse of skew operator. From a given skew-symmetric matrix M of dimension 3x3, it extracts the supp...
void skew(const Eigen::MatrixBase< Vector3 > &v, const Eigen::MatrixBase< Matrix3 > &M)
Computes the skew representation of a given 3d vector, i.e. the antisymmetric matrix representation o...
static void vxi(const MotionDense< MotionDerived > &v, const Derived &I, const Eigen::MatrixBase< M6 > &Iout)
Time variation operator. It computes the time derivative of an inertia I corresponding to the formula...
Derived se3Action(const SE3Tpl< S2, O2 > &M) const
aI = aXb.act(bI)
Derived se3ActionInverse(const SE3Tpl< S2, O2 > &M) const
bI = aXb.actInv(aI)
static void ivx(const MotionDense< MotionDerived > &v, const Derived &I, const Eigen::MatrixBase< M6 > &Iout)
Time variation operator. It computes the time derivative of an inertia I corresponding to the formula...
static InertiaTpl FromSphere(const Scalar mass, const Scalar radius)
Computes the Inertia of a sphere defined by its mass and its radius.
static InertiaTpl FromBox(const Scalar mass, const Scalar x, const Scalar y, const Scalar z)
Computes the Inertia of a box defined by its mass and main dimensions (x,y,z).
PseudoInertia toPseudoInertia() const
Convert the InertiaTpl object to a 4x4 pseudo inertia matrix.
static InertiaTpl FromEllipsoid(const Scalar mass, const Scalar x, const Scalar y, const Scalar z)
Computes the Inertia of an ellipsoid defined by its mass and main semi-axis dimensions (x,...
static InertiaTpl FromDynamicParameters(const Eigen::MatrixBase< Vector10Like > ¶ms)
InertiaTpl< NewScalar, Options > cast() const
Vector10 toDynamicParameters() const
InertiaTpl se3Action_impl(const SE3Tpl< S2, O2 > &M) const
aI = aXb.act(bI)
static InertiaTpl FromPseudoInertia(const PseudoInertia &pseudo_inertia)
Create an InertiaTpl object from a PseudoInertia object.
static InertiaTpl FromCapsule(const Scalar mass, const Scalar radius, const Scalar height)
Computes the Inertia of a capsule defined by its mass, radius and length along the Z axis....
static InertiaTpl FromCylinder(const Scalar mass, const Scalar radius, const Scalar length)
Computes the Inertia of a cylinder defined by its mass, radius and length along the Z axis.
static InertiaTpl FromLogCholeskyParameters(const LogCholeskyParameters &log_cholesky)
Create an InertiaTpl object from log Cholesky parameters.
InertiaTpl se3ActionInverse_impl(const SE3Tpl< S2, O2 > &M) const
bI = aXb.actInv(aI)
A structure representing log Cholesky parameters.
InertiaTpl< Scalar, Options > toInertia() const
Converts the LogCholeskyParametersTpl object to an InertiaTpl object.
Matrix10 calculateJacobian() const
Calculates the Jacobian of the log Cholesky parameters.
Vector10 parameters
10-dimensional vector of log Cholesky parameters
PseudoInertia toPseudoInertia() const
Converts the LogCholeskyParametersTpl object to a PseudoInertiaTpl object.
Vector10 toDynamicParameters() const
Converts the LogCholeskyParametersTpl object to dynamic parameters.
LogCholeskyParametersTpl(const Vector10 &log_cholesky)
Constructor for LogCholeskyParametersTpl.
LogCholeskyParametersTpl< NewScalar, Options > cast() const
A structure representing a pseudo inertia matrix.
InertiaTpl< Scalar, Options > toInertia() const
Converts the PseudoInertiaTpl object to an InertiaTpl object.
static PseudoInertiaTpl FromMatrix(const Matrix4 &pseudo_inertia)
Constructs a PseudoInertiaTpl object from a 4x4 pseudo inertia matrix.
static PseudoInertiaTpl FromInertia(const InertiaTpl< Scalar, Options > &inertia)
Constructs a PseudoInertiaTpl object from an InertiaTpl object.
static PseudoInertiaTpl FromLogCholeskyParameters(const LogCholeskyParameters &log_cholesky)
Constructs a PseudoInertiaTpl object from log Cholesky parameters.
Matrix3 sigma
3x3 matrix part of the pseudo inertia
Matrix4 toMatrix() const
Converts the PseudoInertiaTpl object to a 4x4 matrix.
Vector10 toDynamicParameters() const
Converts the PseudoInertiaTpl object to dynamic parameters.
Vector3 h
Vector part of the pseudo inertia.
static PseudoInertiaTpl FromDynamicParameters(const Eigen::MatrixBase< Vector10Like > &dynamic_params)
Constructs a PseudoInertiaTpl object from dynamic parameters.
PseudoInertiaTpl< NewScalar, Options > cast() const
Scalar mass
Mass of the pseudo inertia.
Common traits structure to fully define base classes for CRTP.