ForceVec.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 #include <type_traits>
10 
11 namespace sva
12 {
13 
18 template<typename T>
19 class ForceVec
20 {
21 public:
24 
25  friend class PTransform<T>;
26 
27 public:
29  static ForceVec<T> Zero()
30  {
31  return ForceVec<T>(vector3_t::Zero(), vector3_t::Zero());
32  }
33 
34 public:
35  ForceVec() : couple_(), force_() {}
36 
38  ForceVec(const vector6_t & vec) : couple_(vec.template head<3>()), force_(vec.template tail<3>()) {}
39 
44  ForceVec(const vector3_t & couple, const vector3_t & force) : couple_(couple), force_(force) {}
45 
46  // Accessor
56  {
57  return couple_;
58  }
59 
60  const vector3_t & couple() const
61  {
62  return couple_;
63  }
64 
67  {
68  return couple_;
69  }
70 
71  const vector3_t & moment() const
72  {
73  return couple_;
74  }
75 
78  {
79  return force_;
80  }
81 
82  const vector3_t & force() const
83  {
84  return force_;
85  }
86 
88  vector6_t vector() const
89  {
90  return ((vector6_t() << couple_, force_).finished());
91  }
92 
93  template<typename T2>
95  {
96  return ForceVec<T2>(couple_.template cast<T2>(), force_.template cast<T2>());
97  }
98 
99  // Operators
101  {
102  return ForceVec<T>(couple_ + fv.couple_, force_ + fv.force_);
103  }
104 
106  {
107  return ForceVec<T>(couple_ - fv.couple_, force_ - fv.force_);
108  }
109 
111  {
112  return ForceVec<T>(-couple_, -force_);
113  }
114 
116  {
117  couple_ += fv.couple_;
118  force_ += fv.force_;
119  return *this;
120  }
121 
123  {
124  couple_ -= fv.couple_;
125  force_ -= fv.force_;
126  return *this;
127  }
128 
129  template<typename T2, typename std::enable_if<std::is_arithmetic<T2>::value, int>::type = 0>
130  ForceVec<T> operator*(T2 scalar) const
131  {
132  return ForceVec<T>(scalar * couple_, scalar * force_);
133  }
134 
135  template<typename T2>
136  ForceVec<T> operator/(T2 scalar) const
137  {
138  return ForceVec<T>(couple_ / scalar, force_ / scalar);
139  }
140 
141  template<typename T2, typename std::enable_if<std::is_arithmetic<T2>::value, int>::type = 0>
142  ForceVec<T> & operator*=(T2 scalar)
143  {
144  couple_ *= scalar;
145  force_ *= scalar;
146  return *this;
147  }
148 
149  template<typename T2>
150  ForceVec<T> & operator/=(T2 scalar)
151  {
152  couple_ /= scalar;
153  force_ /= scalar;
154  return *this;
155  }
156 
157  bool operator==(const ForceVec<T> & fv) const
158  {
159  return (couple_ == fv.couple_) && (force_ == fv.force_);
160  }
161 
162  bool operator!=(const ForceVec<T> & fv) const
163  {
164  return (couple_ != fv.couple_) || (force_ != fv.force_);
165  }
166 
167 private:
168  vector3_t couple_;
169  vector3_t force_;
170 };
171 
172 template<typename T, typename T2>
173 inline ForceVec<T> operator*(T2 scalar, const ForceVec<T> & fv)
174 {
175  return fv * scalar;
176 }
177 
178 template<typename T>
179 inline std::ostream & operator<<(std::ostream & out, const ForceVec<T> & fv)
180 {
181  out << fv.vector().transpose();
182  return out;
183 }
184 
185 } // namespace sva
sva::operator<<
std::ostream & operator<<(std::ostream &out, const ABInertia< T > &abI)
Definition: ABInertia.h:183
sva::ForceVec::vector6_t
Eigen::Vector6< T > vector6_t
Definition: ForceVec.h:23
sva::ForceVec::moment
vector3_t & moment()
Definition: ForceVec.h:66
sva::ForceVec
Definition: ForceVec.h:19
sva::ForceVec::operator-
ForceVec< T > operator-(const ForceVec< T > &fv) const
Definition: ForceVec.h:105
sva::ForceVec::operator-=
ForceVec< T > & operator-=(const ForceVec< T > &fv)
Definition: ForceVec.h:122
sva::ForceVec::couple
const vector3_t & couple() const
Definition: ForceVec.h:60
sva
Definition: ABInertia.h:10
fwd.h
sva::ForceVec::couple
vector3_t & couple()
Definition: ForceVec.h:55
sva::ForceVec::operator*=
ForceVec< T > & operator*=(T2 scalar)
Definition: ForceVec.h:142
Eigen::Vector3
Matrix< T, 3, 1 > Vector3
Definition: EigenTypedef.h:18
sva::ForceVec::operator-
ForceVec< T > operator-() const
Definition: ForceVec.h:110
sva::ForceVec::operator/
ForceVec< T > operator/(T2 scalar) const
Definition: ForceVec.h:136
sva::ForceVec::force
const vector3_t & force() const
Definition: ForceVec.h:82
sva::ForceVec::ForceVec
ForceVec(const vector3_t &couple, const vector3_t &force)
Definition: ForceVec.h:44
sva::operator*
ABInertia< T > operator*(T2 scalar, const ABInertia< T > &abI)
Definition: ABInertia.h:177
sva::ForceVec::force
vector3_t & force()
Definition: ForceVec.h:77
sva::ForceVec::operator/=
ForceVec< T > & operator/=(T2 scalar)
Definition: ForceVec.h:150
Eigen::Vector6
Matrix< T, 6, 1 > Vector6
Definition: EigenTypedef.h:13
sva::ForceVec::operator+
ForceVec< T > operator+(const ForceVec< T > &fv) const
Definition: ForceVec.h:100
sva::ForceVec::operator*
ForceVec< T > operator*(T2 scalar) const
Definition: ForceVec.h:130
sva::ForceVec::ForceVec
ForceVec(const vector6_t &vec)
Definition: ForceVec.h:38
EigenTypedef.h
sva::ForceVec::cast
ForceVec< T2 > cast() const
Definition: ForceVec.h:94
sva::ForceVec::ForceVec
ForceVec()
Definition: ForceVec.h:35
sva::PTransform
Definition: fwd.h:23
sva::ForceVec::Zero
static ForceVec< T > Zero()
Zero force vector.
Definition: ForceVec.h:29
sva::ForceVec::operator!=
bool operator!=(const ForceVec< T > &fv) const
Definition: ForceVec.h:162
sva::ForceVec::vector3_t
Eigen::Vector3< T > vector3_t
Definition: ForceVec.h:22
sva::ForceVec::operator==
bool operator==(const ForceVec< T > &fv) const
Definition: ForceVec.h:157
sva::ForceVec::moment
const vector3_t & moment() const
Definition: ForceVec.h:71
sva::ForceVec::vector
vector6_t vector() const
Definition: ForceVec.h:88
sva::ForceVec::operator+=
ForceVec< T > & operator+=(const ForceVec< T > &fv)
Definition: ForceVec.h:115