ABInertia.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 "EigenTypedef.h"
8 #include "fwd.h"
9 
10 namespace sva
11 {
12 
17 template<typename T>
18 class ABInertia
19 {
20 public:
24 
25 public:
26  ABInertia() : M_(), H_(), I_() {}
27 
33  ABInertia(const matrix3_t & M, const matrix3_t & H, const matrix3_t & I)
34  : M_(matrix3_t::Zero()), H_(H), I_(matrix3_t::Zero())
35  {
36  M_.template triangularView<Eigen::Lower>() = M;
37  I_.template triangularView<Eigen::Lower>() = I;
38  }
39 
45  ABInertia(const Eigen::TriangularView<matrix3_t, Eigen::Lower> & ltM,
46  const matrix3_t & H,
47  const Eigen::TriangularView<matrix3_t, Eigen::Lower> & ltI)
48  : M_(ltM), H_(H), I_(ltI)
49  {
50  }
51 
52  // Accessor
55  {
56  return M_;
57  }
58 
61  {
62  matrix3_t M;
63  M.template triangularView<Eigen::Upper>() = M_.transpose();
64  M.template triangularView<Eigen::StrictlyLower>() = M_;
65  return M;
66  }
67 
69  const matrix3_t & gInertia() const
70  {
71  return H_;
72  }
73 
76  {
77  return I_;
78  }
79 
82  {
83  matrix3_t I;
84  I.template triangularView<Eigen::Upper>() = I_.transpose();
85  I.template triangularView<Eigen::StrictlyLower>() = I_;
86  return I;
87  }
88 
90  matrix6_t matrix() const
91  {
92  matrix6_t m;
93  m << inertia(), H_, H_.transpose(), massMatrix();
94  return m;
95  }
96 
97  template<typename T2>
99  {
100  return ABInertia<T2>(M_.template cast<T2>(), H_.template cast<T2>(), I_.template cast<T2>());
101  }
102 
103  // Operators
105  {
106  matrix3_t M, I;
107  M.template triangularView<Eigen::Lower>() = M_ + rbI.M_;
108  I.template triangularView<Eigen::Lower>() = I_ + rbI.I_;
109  return ABInertia<T>(M, H_ + rbI.H_, I);
110  }
111 
113  {
114  matrix3_t M, I;
115  M.template triangularView<Eigen::Lower>() = M_ - rbI.M_;
116  I.template triangularView<Eigen::Lower>() = I_ - rbI.I_;
117  return ABInertia<T>(M, H_ - rbI.H_, I);
118  }
119 
121  {
122  return ABInertia<T>(-M_, -H_, -I_);
123  }
124 
126  {
127  M_.template triangularView<Eigen::Lower>() += rbI.M_;
128  H_ += rbI.H_;
129  I_.template triangularView<Eigen::Lower>() += rbI.I_;
130  return *this;
131  }
132 
134  {
135  M_.template triangularView<Eigen::Lower>() -= rbI.M_;
136  H_ -= rbI.H_;
137  I_.template triangularView<Eigen::Lower>() -= rbI.I_;
138  return *this;
139  }
140 
141  template<typename T2>
142  ABInertia<T> operator*(T2 scalar) const
143  {
144  matrix3_t M, I;
145  M.template triangularView<Eigen::Lower>() = scalar * M_;
146  I.template triangularView<Eigen::Lower>() = scalar * I_;
147  return ABInertia<T>(M, scalar * H_, I);
148  }
149 
151  ABInertia<T> operator+(const RBInertia<T> & rbI) const;
152 
154  ForceVec<T> operator*(const MotionVec<T> & mv) const;
155 
157  template<typename Derived>
158  void mul(const Eigen::MatrixBase<Derived> & mv, Eigen::MatrixBase<Derived> & result) const;
159 
160  bool operator==(const ABInertia<T> & abI) const
161  {
162  return M_ == abI.M_ && H_ == abI.H_ && I_ == abI.I_;
163  }
164 
165  bool operator!=(const ABInertia<T> & abI) const
166  {
167  return M_ != abI.M_ || H_ != abI.H_ || I_ != abI.I_;
168  }
169 
170 private:
171  matrix3_t M_;
172  matrix3_t H_;
173  matrix3_t I_;
174 };
175 
176 template<typename T, typename T2>
177 inline ABInertia<T> operator*(T2 scalar, const ABInertia<T> & abI)
178 {
179  return abI * scalar;
180 }
181 
182 template<typename T>
183 inline std::ostream & operator<<(std::ostream & out, const ABInertia<T> & abI)
184 {
185  out << abI.matrix();
186  return out;
187 }
188 
189 } // namespace sva
sva::MotionVec
Definition: fwd.h:11
sva::ABInertia::ABInertia
ABInertia(const matrix3_t &M, const matrix3_t &H, const matrix3_t &I)
Definition: ABInertia.h:33
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::ABInertia::operator-
ABInertia< T > operator-(const ABInertia< T > &rbI) const
Definition: ABInertia.h:112
sva::ABInertia::operator==
bool operator==(const ABInertia< T > &abI) const
Definition: ABInertia.h:160
sva::ForceVec
Definition: ForceVec.h:19
sva::ABInertia::operator+
ABInertia< T > operator+(const ABInertia< T > &rbI) const
Definition: ABInertia.h:104
sva::ABInertia::ABInertia
ABInertia(const Eigen::TriangularView< matrix3_t, Eigen::Lower > &ltM, const matrix3_t &H, const Eigen::TriangularView< matrix3_t, Eigen::Lower > &ltI)
Definition: ABInertia.h:45
sva
Definition: ABInertia.h:10
fwd.h
sva::ABInertia::matrix3_t
Eigen::Matrix3< T > matrix3_t
Definition: ABInertia.h:22
sva::ABInertia::operator-
ABInertia< T > operator-() const
Definition: ABInertia.h:120
Eigen::Vector3
Matrix< T, 3, 1 > Vector3
Definition: EigenTypedef.h:18
sva::ABInertia::lowerTriangularMassMatrix
const matrix3_t & lowerTriangularMassMatrix() const
Definition: ABInertia.h:54
sva::ABInertia::gInertia
const matrix3_t & gInertia() const
Definition: ABInertia.h:69
sva::ABInertia::lowerTriangularInertia
const matrix3_t & lowerTriangularInertia() const
Definition: ABInertia.h:75
sva::ABInertia::ABInertia
ABInertia()
Definition: ABInertia.h:26
sva::ABInertia::operator*
ABInertia< T > operator*(T2 scalar) const
Definition: ABInertia.h:142
sva::ABInertia::massMatrix
matrix3_t massMatrix() const
Definition: ABInertia.h:60
sva::ABInertia::vector3_t
Eigen::Vector3< T > vector3_t
Definition: ABInertia.h:21
sva::RBInertia
Definition: fwd.h:17
sva::operator*
ABInertia< T > operator*(T2 scalar, const ABInertia< T > &abI)
Definition: ABInertia.h:177
sva::ABInertia
Definition: ABInertia.h:18
sva::ABInertia::operator+=
ABInertia< T > & operator+=(const ABInertia< T > &rbI)
Definition: ABInertia.h:125
sva::ABInertia::operator-=
ABInertia< T > & operator-=(const ABInertia< T > &rbI)
Definition: ABInertia.h:133
EigenTypedef.h
sva::ABInertia::matrix
matrix6_t matrix() const
@retrun Non compact spatial articulated body inertia matrix.
Definition: ABInertia.h:90
sva::ABInertia::mul
void mul(const Eigen::MatrixBase< Derived > &mv, Eigen::MatrixBase< Derived > &result) const
Definition: Operators.h:195
sva::ABInertia::operator!=
bool operator!=(const ABInertia< T > &abI) const
Definition: ABInertia.h:165
Eigen::Matrix6
Matrix< T, 6, 6 > Matrix6
Definition: EigenTypedef.h:15
sva::ABInertia::cast
ABInertia< T2 > cast() const
Definition: ABInertia.h:98
sva::ABInertia::matrix6_t
Eigen::Matrix6< T > matrix6_t
Definition: ABInertia.h:23
sva::ABInertia::inertia
matrix3_t inertia() const
Definition: ABInertia.h:81