RBInertia.h
Go to the documentation of this file.
1 /*
2  * Copyright 2012-2020 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 #include "EigenUtility.h"
8 #include "fwd.h"
9 
10 namespace sva
11 {
12 
13 template<typename T>
15  T mass,
16  const Eigen::Vector3<T> & com,
17  const Eigen::Matrix3<T> & rotation);
18 
23 template<typename T>
24 class RBInertia
25 {
26 public:
30 
31 public:
32  RBInertia() : m_(), h_(), I_() {}
33 
39  RBInertia(T m, const vector3_t & h, const matrix3_t & I) : m_(m), h_(h), I_(matrix3_t::Zero())
40  {
41  I_.template triangularView<Eigen::Lower>() = I;
42  }
43 
49  RBInertia(T m, const vector3_t & h, const Eigen::TriangularView<matrix3_t, Eigen::Lower> & ltI)
50  : m_(m), h_(h), I_(ltI)
51  {
52  }
53 
54  // Accessor
56  T mass() const
57  {
58  return m_;
59  }
60 
62  const vector3_t & momentum() const
63  {
64  return h_;
65  }
66 
69  {
70  return I_;
71  }
72 
75  {
76  matrix3_t I;
77  I.template triangularView<Eigen::Upper>() = I_.transpose();
78  I.template triangularView<Eigen::StrictlyLower>() = I_;
79  return I;
80  }
81 
83  matrix6_t matrix() const
84  {
85  matrix6_t m;
86  matrix3_t hCross = vector3ToCrossMatrix(h_);
87  m << inertia(), hCross, hCross.transpose(), matrix3_t::Identity() * m_;
88  return m;
89  }
90 
91  template<typename T2>
93  {
94  return RBInertia<T2>(T2(m_), h_.template cast<T2>(), I_.template cast<T2>());
95  }
96 
97  // Operators
98  RBInertia<T> operator+(const RBInertia<T> & rbI) const
99  {
100  matrix3_t I;
101  I.template triangularView<Eigen::Lower>() = I_ + rbI.I_;
102  return RBInertia<T>(m_ + rbI.m_, h_ + rbI.h_, I);
103  }
104 
106  {
107  matrix3_t I;
108  I.template triangularView<Eigen::Lower>() = I_ - rbI.I_;
109  return RBInertia<T>(m_ - rbI.m_, h_ - rbI.h_, I);
110  }
111 
113  {
114  return RBInertia<T>(-m_, -h_, -I_);
115  }
116 
118  {
119  I_.template triangularView<Eigen::Lower>() += rbI.I_;
120  m_ += rbI.m_;
121  h_ += rbI.h_;
122  return *this;
123  }
124 
126  {
127  I_.template triangularView<Eigen::Lower>() -= rbI.I_;
128  m_ -= rbI.m_;
129  h_ -= rbI.h_;
130  return *this;
131  }
132 
133  template<typename T2>
134  RBInertia<T> operator*(T2 scalar) const
135  {
136  matrix3_t I;
137  I.template triangularView<Eigen::Lower>() = scalar * I_;
138  return RBInertia<T>(scalar * m_, scalar * h_, I);
139  }
140 
142  ForceVec<T> operator*(const MotionVec<T> & mv) const;
143 
145  template<typename Derived>
146  void mul(const Eigen::MatrixBase<Derived> & mv, Eigen::MatrixBase<Derived> & result) const;
147 
148  bool operator==(const RBInertia<T> & rbI) const
149  {
150  return m_ == rbI.m_ && h_ == rbI.h_ && I_ == rbI.I_;
151  }
152 
153  bool operator!=(const RBInertia<T> & rbI) const
154  {
155  return m_ != rbI.m_ || h_ != rbI.h_ || I_ != rbI.I_;
156  }
157 
158 private:
159  T m_;
160  vector3_t h_;
161  matrix3_t I_;
162 };
163 
164 template<typename T, typename T2>
165 inline RBInertia<T> operator*(T2 scalar, const RBInertia<T> & rbI)
166 {
167  return rbI * scalar;
168 }
169 
170 template<typename T>
171 inline std::ostream & operator<<(std::ostream & out, const RBInertia<T> & rbI)
172 {
173  out << rbI.matrix();
174  return out;
175 }
176 
177 template<typename T>
179  T mass,
180  const Eigen::Vector3<T> & com,
181  const Eigen::Matrix3<T> & rotation)
182 {
183  Eigen::Matrix3<T> trans =
184  Eigen::vector3ToCrossMatrix<T>(mass * com) * Eigen::vector3ToCrossMatrix<T>(com).transpose();
185  return rotation * (inertia + trans) * rotation.transpose();
186 }
187 
188 } // namespace sva
sva::MotionVec
Definition: fwd.h:11
sva::operator<<
std::ostream & operator<<(std::ostream &out, const ABInertia< T > &abI)
Definition: ABInertia.h:183
Eigen::Matrix3
Matrix< T, 3, 3 > Matrix3
Definition: EigenTypedef.h:20
sva::RBInertia::matrix
matrix6_t matrix() const
@retrun Non compact spatial rigid body inertia matrix.
Definition: RBInertia.h:83
sva::RBInertia::lowerTriangularInertia
const matrix3_t & lowerTriangularInertia() const
Definition: RBInertia.h:68
sva::RBInertia::RBInertia
RBInertia()
Definition: RBInertia.h:32
sva::ForceVec
Definition: ForceVec.h:19
sva::RBInertia::mass
T mass() const
Definition: RBInertia.h:56
sva
Definition: ABInertia.h:10
fwd.h
Eigen::vector3ToCrossMatrix
Matrix3< T > vector3ToCrossMatrix(const Vector3< T > &vec)
Definition: EigenUtility.h:16
Eigen::Vector3
Matrix< T, 3, 1 > Vector3
Definition: EigenTypedef.h:18
sva::RBInertia::RBInertia
RBInertia(T m, const vector3_t &h, const matrix3_t &I)
Definition: RBInertia.h:39
sva::RBInertia::RBInertia
RBInertia(T m, const vector3_t &h, const Eigen::TriangularView< matrix3_t, Eigen::Lower > &ltI)
Definition: RBInertia.h:49
sva::RBInertia::inertia
matrix3_t inertia() const
Definition: RBInertia.h:74
sva::RBInertia::operator!=
bool operator!=(const RBInertia< T > &rbI) const
Definition: RBInertia.h:153
sva::RBInertia::operator+
RBInertia< T > operator+(const RBInertia< T > &rbI) const
Definition: RBInertia.h:98
sva::RBInertia::cast
RBInertia< T2 > cast() const
Definition: RBInertia.h:92
sva::RBInertia
Definition: fwd.h:17
sva::operator*
ABInertia< T > operator*(T2 scalar, const ABInertia< T > &abI)
Definition: ABInertia.h:177
sva::RBInertia::matrix3_t
Eigen::Matrix3< T > matrix3_t
Definition: RBInertia.h:28
sva::RBInertia::operator-
RBInertia< T > operator-(const RBInertia< T > &rbI) const
Definition: RBInertia.h:105
sva::RBInertia::momentum
const vector3_t & momentum() const
Definition: RBInertia.h:62
sva::RBInertia::operator-
RBInertia< T > operator-() const
Definition: RBInertia.h:112
sva::RBInertia::operator==
bool operator==(const RBInertia< T > &rbI) const
Definition: RBInertia.h:148
sva::RBInertia::matrix6_t
Eigen::Matrix6< T > matrix6_t
Definition: RBInertia.h:29
sva::RBInertia::vector3_t
Eigen::Vector3< T > vector3_t
Definition: RBInertia.h:27
sva::RBInertia::operator-=
RBInertia< T > & operator-=(const RBInertia< T > &rbI)
Definition: RBInertia.h:125
Eigen::Matrix6
Matrix< T, 6, 6 > Matrix6
Definition: EigenTypedef.h:15
sva::RBInertia::operator*
RBInertia< T > operator*(T2 scalar) const
Definition: RBInertia.h:134
sva::RBInertia::mul
void mul(const Eigen::MatrixBase< Derived > &mv, Eigen::MatrixBase< Derived > &result) const
Definition: Operators.h:165
sva::inertiaToOrigin
Eigen::Matrix3< T > inertiaToOrigin(const Eigen::Matrix3< T > &inertia, T mass, const Eigen::Vector3< T > &com, const Eigen::Matrix3< T > &rotation)
Definition: RBInertia.h:178
EigenUtility.h
sva::RBInertia::operator+=
RBInertia< T > & operator+=(const RBInertia< T > &rbI)
Definition: RBInertia.h:117