gtsam 4.1.1
gtsam
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
19#pragma once
20
22#include <gtsam/base/Lie.h>
23#include <boost/optional.hpp>
24
25#include <random>
26
27namespace 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 boost::none);
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 = boost::none);
126
128 static Vector1 Logmap(const Rot2& r, ChartJacobian H = boost::none);
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
145 static Rot2 Retract(const Vector1& v, ChartJacobian H = boost::none) {
146 return Expmap(v, H);
147 }
148 static Vector1 Local(const Rot2& r, ChartJacobian H = boost::none) {
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 = boost::none,
163 OptionalJacobian<2, 2> H2 = boost::none) 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 = boost::none,
174 OptionalJacobian<2, 2> H2 = boost::none) 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
212 private:
214 friend class boost::serialization::access;
215 template<class ARCHIVE>
216 void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
217 ar & BOOST_SERIALIZATION_NVP(c_);
218 ar & BOOST_SERIALIZATION_NVP(s_);
219 }
220
221 };
222
223 template<>
224 struct traits<Rot2> : public internal::LieGroup<Rot2> {};
225
226 template<>
227 struct traits<const Rot2> : public internal::LieGroup<Rot2> {};
228
229} // gtsam
Base class and basic functions for Lie types.
2D Point
Global functions in a separate testing namespace.
Definition: chartTesting.h:28
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:112
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition: Matrix.cpp:155
Vector2 Point2
As of GTSAM 4, in order to make GTSAM more lean, it is now possible to just typedef Point2 to Vector2...
Definition: Point2.h:27
Point3 normalize(const Point3 &p, OptionalJacobian< 3, 3 > H)
normalize, with optional Jacobian
Definition: Point3.cpp:51
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition: concepts.h:30
A CRTP helper class that implements Lie group methods Prerequisites: methods operator*,...
Definition: Lie.h:37
Both LieGroupTraits and Testable.
Definition: Lie.h:229
OptionalJacobian is an Eigen::Ref like class that can take be constructed using either a fixed size o...
Definition: OptionalJacobian.h:39
Template to create a binary predicate.
Definition: Testable.h:111
Definition: Rot2.h:35
Rot2 operator*(const Rot2 &R) const
Compose - make a new rotation by adding angles.
Definition: Rot2.h:116
static Rot2 identity()
identity
Definition: Rot2.h:110
double c() const
return cos
Definition: Rot2.h:197
static Matrix ExpmapDerivative(const Vector &)
Left-trivialized derivative of the exponential map.
Definition: Rot2.h:134
Point2 unit() const
Creates a unit vector as a Point2.
Definition: Rot2.h:181
double theta() const
return angle (RADIANS)
Definition: Rot2.h:186
Rot2 inverse() const
The inverse rotation - negative angle.
Definition: Rot2.h:113
Point2 operator*(const Point2 &p) const
syntactic sugar for rotate
Definition: Rot2.h:166
double s() const
return sin
Definition: Rot2.h:202
double degrees() const
return angle (DEGREES)
Definition: Rot2.h:191
static Matrix LogmapDerivative(const Vector &)
Left-trivialized derivative inverse of the exponential map.
Definition: Rot2.h:139
Matrix1 AdjointMap() const
Calculate Adjoint map.
Definition: Rot2.h:131
Rot2(double theta)
Constructor from angle in radians == exponential map at identity.
Definition: Rot2.h:58
static Rot2 fromDegrees(double theta)
Named constructor from angle in degrees.
Definition: Rot2.h:66
Rot2()
default constructor, zero rotation
Definition: Rot2.h:52
Rot2(const Rot2 &r)
copy constructor
Definition: Rot2.h:55
static Rot2 fromAngle(double theta)
Named constructor from angle in radians.
Definition: Rot2.h:61
Definition: Rot2.h:144