ImpedanceVec.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 
24 template<typename T>
26 {
27 public:
30 
31 public:
34  {
35  return ImpedanceVec<T>(vector3_t::Zero(), vector3_t::Zero());
36  }
37 
38 public:
40  ImpedanceVec() : angular_(), linear_() {}
41 
46  ImpedanceVec(const vector6_t & vec) : angular_(vec.template head<3>()), linear_(vec.template tail<3>()) {}
47 
52  ImpedanceVec(const vector3_t & angular, const vector3_t & linear) : angular_(angular), linear_(linear) {}
53 
58  ImpedanceVec(T angular, T linear) : angular_(angular, angular, angular), linear_(linear, linear, linear) {}
59 
60  // Accessor
62  const vector3_t & angular() const
63  {
64  return angular_;
65  }
66 
69  {
70  return angular_;
71  }
72 
74  const vector3_t & linear() const
75  {
76  return linear_;
77  }
78 
81  {
82  return linear_;
83  }
84 
86  vector6_t vector() const
87  {
88  return ((vector6_t() << angular_, linear_).finished());
89  }
90 
91  template<typename T2>
93  {
94  return ImpedanceVec<T2>(angular_.template cast<T2>(), linear_.template cast<T2>());
95  }
96 
97  // Operators
99  {
100  return ImpedanceVec<T>(angular_ + iv.angular_, linear_ + iv.linear_);
101  }
102 
104  {
105  angular_ += iv.angular_;
106  linear_ += iv.linear_;
107  return *this;
108  }
109 
110  template<typename T2, typename std::enable_if<std::is_arithmetic<T2>::value, int>::type = 0>
111  ImpedanceVec<T> operator*(T2 scalar) const
112  {
113  return ImpedanceVec<T>(scalar * angular_, scalar * linear_);
114  }
115 
116  template<typename T2>
118  {
119  angular_ *= scalar;
120  linear_ *= scalar;
121  return *this;
122  }
123 
124  template<typename T2>
125  ImpedanceVec<T> operator/(T2 scalar) const
126  {
127  return ImpedanceVec<T>(angular_ / scalar, linear_ / scalar);
128  }
129 
130  template<typename T2>
132  {
133  angular_ /= scalar;
134  linear_ /= scalar;
135  return *this;
136  }
137 
138  bool operator==(const ImpedanceVec<T> & iv) const
139  {
140  return (angular_ == iv.angular_) && (linear_ == iv.linear_);
141  }
142 
143  bool operator!=(const ImpedanceVec<T> & iv) const
144  {
145  return !(*this == iv);
146  }
147 
148 private:
149  vector3_t angular_;
150  vector3_t linear_;
151 };
152 
153 template<typename T, typename T2>
154 inline ImpedanceVec<T> operator*(T2 scalar, const ImpedanceVec<T> & iv)
155 {
156  return iv * scalar;
157 }
158 
159 template<typename T>
160 inline ForceVec<T> operator*(const ImpedanceVec<T> & iv, const MotionVec<T> & mv)
161 {
162  return ForceVec<T>(iv.angular().cwiseProduct(mv.angular()), iv.linear().cwiseProduct(mv.linear()));
163 }
164 
165 template<typename T>
166 inline ForceVec<T> operator*(const MotionVec<T> & mv, const ImpedanceVec<T> & iv)
167 {
168  return iv * mv;
169 }
170 
171 template<typename T>
172 inline std::ostream & operator<<(std::ostream & out, const ImpedanceVec<T> & iv)
173 {
174  out << iv.vector().transpose();
175  return out;
176 }
177 
178 } // namespace sva
sva::MotionVec
Definition: fwd.h:11
sva::operator<<
std::ostream & operator<<(std::ostream &out, const ABInertia< T > &abI)
Definition: ABInertia.h:183
sva::ImpedanceVec::operator/=
ImpedanceVec< T > & operator/=(T2 scalar)
Definition: ImpedanceVec.h:131
sva::ForceVec
Definition: ForceVec.h:19
sva::ImpedanceVec::vector
vector6_t vector() const
Definition: ImpedanceVec.h:86
sva
Definition: ABInertia.h:10
fwd.h
sva::ImpedanceVec::angular
vector3_t & angular()
Definition: ImpedanceVec.h:68
sva::ImpedanceVec::operator*=
ImpedanceVec< T > & operator*=(T2 scalar)
Definition: ImpedanceVec.h:117
sva::ImpedanceVec::Zero
static ImpedanceVec< T > Zero()
Zero impedance vector.
Definition: ImpedanceVec.h:33
sva::MotionVec::angular
const vector3_t & angular() const
Definition: MotionVec.h:51
Eigen::Vector3
Matrix< T, 3, 1 > Vector3
Definition: EigenTypedef.h:18
sva::ImpedanceVec::ImpedanceVec
ImpedanceVec(const vector3_t &angular, const vector3_t &linear)
Definition: ImpedanceVec.h:52
sva::ImpedanceVec::cast
ImpedanceVec< T2 > cast() const
Definition: ImpedanceVec.h:92
sva::ImpedanceVec::angular
const vector3_t & angular() const
Definition: ImpedanceVec.h:62
sva::ImpedanceVec::ImpedanceVec
ImpedanceVec()
Definition: ImpedanceVec.h:40
sva::MotionVec::linear
const vector3_t & linear() const
Definition: MotionVec.h:63
sva::ImpedanceVec::operator+=
ImpedanceVec< T > & operator+=(const ImpedanceVec< T > &iv)
Definition: ImpedanceVec.h:103
sva::ImpedanceVec::operator!=
bool operator!=(const ImpedanceVec< T > &iv) const
Definition: ImpedanceVec.h:143
sva::ImpedanceVec::linear
const vector3_t & linear() const
Definition: ImpedanceVec.h:74
sva::operator*
ABInertia< T > operator*(T2 scalar, const ABInertia< T > &abI)
Definition: ABInertia.h:177
sva::ImpedanceVec::ImpedanceVec
ImpedanceVec(const vector6_t &vec)
Definition: ImpedanceVec.h:46
sva::ImpedanceVec::ImpedanceVec
ImpedanceVec(T angular, T linear)
Definition: ImpedanceVec.h:58
Eigen::Vector6
Matrix< T, 6, 1 > Vector6
Definition: EigenTypedef.h:13
sva::ImpedanceVec::linear
vector3_t & linear()
Definition: ImpedanceVec.h:80
sva::ImpedanceVec::operator/
ImpedanceVec< T > operator/(T2 scalar) const
Definition: ImpedanceVec.h:125
EigenTypedef.h
sva::ImpedanceVec::operator==
bool operator==(const ImpedanceVec< T > &iv) const
Definition: ImpedanceVec.h:138
sva::ImpedanceVec::vector6_t
Eigen::Vector6< T > vector6_t
Definition: ImpedanceVec.h:29
sva::ImpedanceVec::vector3_t
Eigen::Vector3< T > vector3_t
Definition: ImpedanceVec.h:28
sva::ImpedanceVec::operator+
ImpedanceVec< T > operator+(const ImpedanceVec< T > &iv) const
Definition: ImpedanceVec.h:98
sva::ImpedanceVec::operator*
ImpedanceVec< T > operator*(T2 scalar) const
Definition: ImpedanceVec.h:111
sva::ImpedanceVec
Definition: ImpedanceVec.h:25