Geomi
SO3_Group.hpp
1 #ifndef DEF_COMMON_SO3_GROUP
2 #define DEF_COMMON_SO3_GROUP
3 
4 #include <string>
5 
6 #include <Eigen/Dense>
7 #include <Eigen/Geometry>
8 
9 namespace SO3
10 {
11 
16 template <typename T_SCALAR_TYPE>
17 class Group : public LieGroupBase<Group<T_SCALAR_TYPE>,3>
18 {
19 protected:
20  Eigen::Quaternion<T_SCALAR_TYPE> m_q;
21 
22 //public:
23  //static const unsigned int DOF = 3;
24 
25 public:
27  : m_q(Eigen::Quaternion<T_SCALAR_TYPE>::Identity())
28  { }
29 
31  : m_q(g.m_q)
32  { }
33 
34  Group<T_SCALAR_TYPE> (const Eigen::Quaternion<T_SCALAR_TYPE>& q_)
35  { q(q_); }
36 
37  Group<T_SCALAR_TYPE> ( const T_SCALAR_TYPE& w,
38  const T_SCALAR_TYPE& x,
39  const T_SCALAR_TYPE& y,
40  const T_SCALAR_TYPE& z)
41  { q(w,x,y,z); }
42 
43  Group<T_SCALAR_TYPE> (const T_SCALAR_TYPE* data)
44  { q(data); }
45 
46  template<class Derived>
47  Group<T_SCALAR_TYPE> (const Eigen::QuaternionBase<Derived>& other)
48  { q(other); }
49 
50  Group<T_SCALAR_TYPE> (const Eigen::AngleAxis<T_SCALAR_TYPE>& aa)
51  { q(aa); }
52 
53  template<typename Derived>
54  Group<T_SCALAR_TYPE> (const Eigen::MatrixBase<Derived>& other)
55  { q(other); }
56 
57  template<class OtherScalar, int OtherOptions>
58  Group<T_SCALAR_TYPE> (const Eigen::Quaternion<OtherScalar,OtherOptions>& other)
59  { q(other); }
60 
61  /* Accessors and setters */
62 
66  Eigen::Quaternion<T_SCALAR_TYPE>
67  q ( ) const
68  { return m_q; }
69 
70  void
71  q (const Eigen::Quaternion<T_SCALAR_TYPE>& q_)
72  { m_q = q_; m_q.normalize(); }
73 
74  // see Eigen::Quaternion constructors
75  void
76  q ( const T_SCALAR_TYPE& w,
77  const T_SCALAR_TYPE& x,
78  const T_SCALAR_TYPE& y,
79  const T_SCALAR_TYPE& z)
80  { m_q = Eigen::Quaternion<T_SCALAR_TYPE>(w,x,y,z); m_q.normalize(); }
81 
82  // see Eigen::Quaternion constructors
83  void
84  q (const T_SCALAR_TYPE* data)
85  { m_q = Eigen::Quaternion<T_SCALAR_TYPE>(data); m_q.normalize(); }
86 
87  // see Eigen::Quaternion constructors
88  template<class Derived>
89  void
90  q (const Eigen::QuaternionBase<Derived>& other)
91  { m_q = Eigen::Quaternion<T_SCALAR_TYPE>(other); m_q.normalize(); }
92 
93  // see Eigen::Quaternion constructors
94  void
95  q (const Eigen::AngleAxis<T_SCALAR_TYPE>& aa)
96  { m_q = Eigen::Quaternion<T_SCALAR_TYPE>(aa); m_q.normalize(); }
97 
98  // see Eigen::Quaternion constructors
99  template<typename Derived>
100  void
101  q (const Eigen::MatrixBase<Derived>& other)
102  { m_q = Eigen::Quaternion<T_SCALAR_TYPE>(other); m_q.normalize(); }
103 
104  // see Eigen::Quaternion constructors
105  template<class OtherScalar, int OtherOptions>
106  void
107  q (const Eigen::Quaternion<OtherScalar,OtherOptions>& other)
108  { m_q = Eigen::Quaternion<T_SCALAR_TYPE>(other); m_q.normalize(); }
109 
110  /* Group operations */
111 
116  inverse( ) const
117  { return Group<T_SCALAR_TYPE>(m_q.inverse()); }
118 
122  static Group<T_SCALAR_TYPE>
124  { return Group<T_SCALAR_TYPE>(Eigen::Quaternion<T_SCALAR_TYPE>::Identity()); }
125 
126  /* Group operation is '*' and not '+' since we are used to the matrix representation,
127  * in which case the mutliplication is the group operation */
128  void
129  operator*= (Group<T_SCALAR_TYPE> const& g)
130  { m_q *= g.q(); m_q.normalize(); }
131 
141  {
142  Group<T_SCALAR_TYPE> res(*this);
143  res *= g;
144  return res;
145  }
146 
151  Eigen::Matrix<T_SCALAR_TYPE,3,1>
152  transformVector (const Eigen::Matrix<T_SCALAR_TYPE,3,1>& v) const
153  { return this->toRotationMatrix()*v; }
154 
161  Eigen::Matrix<T_SCALAR_TYPE,3,1>
162  operator* (Eigen::Matrix<T_SCALAR_TYPE,3,1> const& v) const
163  { return m_q._transformVector(v); }
164 
168  Eigen::Matrix<T_SCALAR_TYPE,3,3>
170  { return m_q.toRotationMatrix(); }
171 
175  Eigen::Matrix<T_SCALAR_TYPE,3,3>
176  toAxisAngle ( ) const
177  { return Eigen::AngleAxis<T_SCALAR_TYPE>(m_q); }
178 
183  Eigen::Matrix<T_SCALAR_TYPE,3,1>
184  toVector ( ) const
185  {
186  Eigen::AngleAxis<T_SCALAR_TYPE> aa(m_q);
187  return aa.angle()*aa.axis();
188  }
189 
190  bool
191  isApprox (Group<T_SCALAR_TYPE> const& g) const
192  { return m_q.isApprox(g.q()); }
193 
194 };
195 
196 } // namespace SO3
197 
198 template <typename T_SCALAR_TYPE>
199 std::ostream
200 operator<< (std::ostream& stream, SO3::Group<T_SCALAR_TYPE> const& G)
201 {
202  stream << G.toRotationMatrix();
203  return stream;
204 }
205 
206 #endif
Eigen::Matrix< T_SCALAR_TYPE, 3, 3 > toRotationMatrix() const
Definition: SO3_Group.hpp:169
Definition: SO3_Group.hpp:17
Eigen::Matrix< T_SCALAR_TYPE, 3, 1 > toVector() const
Definition: SO3_Group.hpp:184
Definition: SO3_Algebra.hpp:13
Eigen::Matrix< T_SCALAR_TYPE, 3, 3 > toAxisAngle() const
Definition: SO3_Group.hpp:176
Eigen::Matrix< T_SCALAR_TYPE, 3, 1 > transformVector(const Eigen::Matrix< T_SCALAR_TYPE, 3, 1 > &v) const
Definition: SO3_Group.hpp:152
Definition: LieGroupBase.hpp:10
Eigen::Quaternion< T_SCALAR_TYPE > q() const
Definition: SO3_Group.hpp:67
Group< T_SCALAR_TYPE > inverse() const
Definition: SO3_Group.hpp:116
Group< T_SCALAR_TYPE > operator*(Group< T_SCALAR_TYPE > const &g) const
Definition: SO3_Group.hpp:140
static Group< T_SCALAR_TYPE > Identity()
Definition: SO3_Group.hpp:123