GTSAM  4.0.2
C++ library for smoothing and mapping (SAM)
Rot2.h
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
20 #pragma once
21 
22 #include <gtsam/geometry/Point2.h>
23 #include <gtsam/base/Lie.h>
24 
25 #include <random>
26 
27 namespace gtsam {
28 
35  class GTSAM_EXPORT Rot2 : public LieGroup<Rot2, 1> {
36 
38  double c_, s_;
39 
41  Rot2& normalize();
42 
44  inline Rot2(double c, double s) : c_(c), s_(s) {}
45 
46  public:
47 
50 
52  Rot2() : c_(1.0), s_(0.0) {}
53 
55  Rot2(const Rot2& r) : Rot2(r.c_, r.s_) {}
56 
58  Rot2(double theta) : c_(cos(theta)), s_(sin(theta)) {}
59 
61  static Rot2 fromAngle(double theta) {
62  return Rot2(theta);
63  }
64 
66  static Rot2 fromDegrees(double theta) {
67  static const double degree = M_PI / 180;
68  return fromAngle(theta * degree);
69  }
70 
72  static Rot2 fromCosSin(double c, double s);
73 
81  static Rot2 relativeBearing(const Point2& d, OptionalJacobian<1,2> H =
82  {});
83 
85  static Rot2 atan2(double y, double x);
86 
93  static Rot2 Random(std::mt19937 & rng);
94 
98 
100  void print(const std::string& s = "theta") const;
101 
103  bool equals(const Rot2& R, double tol = 1e-9) const;
104 
108 
110  inline static Rot2 Identity() { return Rot2(); }
111 
113  Rot2 inverse() const { return Rot2(c_, -s_);}
114 
116  Rot2 operator*(const Rot2& R) const {
117  return fromCosSin(c_ * R.c_ - s_ * R.s_, s_ * R.c_ + c_ * R.s_);
118  }
119 
123 
125  static Rot2 Expmap(const Vector1& v, ChartJacobian H = {});
126 
128  static Vector1 Logmap(const Rot2& r, ChartJacobian H = {});
129 
131  Matrix1 AdjointMap() const { return I_1x1; }
132 
134  static Matrix ExpmapDerivative(const Vector& /*v*/) {
135  return I_1x1;
136  }
137 
139  static Matrix LogmapDerivative(const Vector& /*v*/) {
140  return I_1x1;
141  }
142 
143  // Chart at origin simply uses exponential map and its inverse
144  struct ChartAtOrigin {
145  static Rot2 Retract(const Vector1& v, ChartJacobian H = {}) {
146  return Expmap(v, H);
147  }
148  static Vector1 Local(const Rot2& r, ChartJacobian H = {}) {
149  return Logmap(r, H);
150  }
151  };
152 
153  using LieGroup<Rot2, 1>::inverse; // version with derivative
154 
158 
162  Point2 rotate(const Point2& p, OptionalJacobian<2, 1> H1 = {},
163  OptionalJacobian<2, 2> H2 = {}) const;
164 
166  inline Point2 operator*(const Point2& p) const {
167  return rotate(p);
168  }
169 
173  Point2 unrotate(const Point2& p, OptionalJacobian<2, 1> H1 = {},
174  OptionalJacobian<2, 2> H2 = {}) const;
175 
179 
181  inline Point2 unit() const {
182  return Point2(c_, s_);
183  }
184 
186  double theta() const {
187  return ::atan2(s_, c_);
188  }
189 
191  double degrees() const {
192  const double degree = M_PI / 180;
193  return theta() / degree;
194  }
195 
197  inline double c() const {
198  return c_;
199  }
200 
202  inline double s() const {
203  return s_;
204  }
205 
207  Matrix2 matrix() const;
208 
210  Matrix2 transpose() const;
211 
213  static Rot2 ClosestTo(const Matrix2& M);
214 
215  private:
216 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION
217 
218  friend class boost::serialization::access;
219  template<class ARCHIVE>
220  void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
221  ar & BOOST_SERIALIZATION_NVP(c_);
222  ar & BOOST_SERIALIZATION_NVP(s_);
223  }
224 #endif
225 
226  };
227 
228  template<>
229  struct traits<Rot2> : public internal::LieGroup<Rot2> {};
230 
231  template<>
232  struct traits<const Rot2> : public internal::LieGroup<Rot2> {};
233 
234 } // gtsam
double degrees() const
Definition: Rot2.h:191
double c() const
Definition: Rot2.h:197
static Matrix ExpmapDerivative(const Vector &)
Left-trivialized derivative of the exponential map.
Definition: Rot2.h:134
GTSAM_EXPORT Point3 normalize(const Point3 &p, OptionalJacobian< 3, 3 > H={})
normalize, with optional Jacobian
Definition: Rot2.h:35
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:113
Vector2 Point2
Definition: Point2.h:32
Point2 unit() const
Creates a unit vector as a Point2.
Definition: Rot2.h:181
Rot2 operator*(const Rot2 &R) const
Definition: Rot2.h:116
Definition: Group.h:43
Rot2(const Rot2 &r)
Definition: Rot2.h:55
static Matrix LogmapDerivative(const Vector &)
Left-trivialized derivative inverse of the exponential map.
Definition: Rot2.h:139
Definition: Lie.h:37
static Rot2 fromDegrees(double theta)
Named constructor from angle in degrees.
Definition: Rot2.h:66
double s() const
Definition: Rot2.h:202
Definition: Rot2.h:144
Definition: Testable.h:112
Point2 operator*(const Point2 &p) const
Definition: Rot2.h:166
GTSAM_EXPORT void print(const Matrix &A, const std::string &s, std::ostream &stream)
static Rot2 Identity()
Definition: Rot2.h:110
Base class and basic functions for Lie types.
Definition: chartTesting.h:28
Definition: OptionalJacobian.h:38
Rot2()
Definition: Rot2.h:52
Both LieGroupTraits and Testable.
Definition: Lie.h:229
Rot2 inverse() const
Definition: Rot2.h:113
Matrix1 AdjointMap() const
Definition: Rot2.h:131
static Rot2 fromAngle(double theta)
Named constructor from angle in radians.
Definition: Rot2.h:61
Rot2(double theta)
Constructor from angle in radians == exponential map at identity.
Definition: Rot2.h:58
2D Point
double theta() const
Definition: Rot2.h:186