gtsam  4.0.0
gtsam
Pose2.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 // \callgraph
20 
21 #pragma once
22 
24 #include <gtsam/geometry/Point2.h>
25 #include <gtsam/geometry/Rot2.h>
26 #include <gtsam/base/Lie.h>
27 #include <gtsam/dllexport.h>
28 
29 namespace gtsam {
30 
36 class GTSAM_EXPORT Pose2: public LieGroup<Pose2, 3> {
37 
38 public:
39 
41  typedef Rot2 Rotation;
42  typedef Point2 Translation;
43 
44 private:
45 
46  Rot2 r_;
47  Point2 t_;
48 
49 public:
50 
53 
55  Pose2() :
56  r_(traits<Rot2>::Identity()), t_(traits<Point2>::Identity()) {
57  }
58 
60  Pose2(const Pose2& pose) : r_(pose.r_), t_(pose.t_) {}
61 
68  Pose2(double x, double y, double theta) :
69  r_(Rot2::fromAngle(theta)), t_(x, y) {
70  }
71 
73  Pose2(double theta, const Point2& t) :
74  r_(Rot2::fromAngle(theta)), t_(t) {
75  }
76 
78  Pose2(const Rot2& r, const Point2& t) : r_(r), t_(t) {}
79 
81  Pose2(const Matrix &T) :
82  r_(Rot2::atan2(T(1, 0), T(0, 0))), t_(T(0, 2), T(1, 2)) {
83  assert(T.rows() == 3 && T.cols() == 3);
84  }
85 
89 
91  Pose2(const Vector& v) : Pose2() {
92  *this = Expmap(v);
93  }
94 
98 
100  void print(const std::string& s = "") const;
101 
103  bool equals(const Pose2& pose, double tol = 1e-9) const;
104 
108 
110  inline static Pose2 identity() { return Pose2(); }
111 
113  Pose2 inverse() const;
114 
116  inline Pose2 operator*(const Pose2& p2) const {
117  return Pose2(r_*p2.r(), t_ + r_*p2.t());
118  }
119 
123 
125  static Pose2 Expmap(const Vector3& xi, ChartJacobian H = boost::none);
126 
128  static Vector3 Logmap(const Pose2& p, ChartJacobian H = boost::none);
129 
134  Matrix3 AdjointMap() const;
135 
137  inline Vector3 Adjoint(const Vector3& xi) const {
138  return AdjointMap()*xi;
139  }
140 
144  static Matrix3 adjointMap(const Vector3& v);
145 
149  static Vector3 adjoint(const Vector3& xi, const Vector3& y) {
150  return adjointMap(xi) * y;
151  }
152 
156  static Vector3 adjointTranspose(const Vector3& xi, const Vector3& y) {
157  return adjointMap(xi).transpose() * y;
158  }
159 
160  // temporary fix for wrappers until case issue is resolved
161  static Matrix3 adjointMap_(const Vector3 &xi) { return adjointMap(xi);}
162  static Vector3 adjoint_(const Vector3 &xi, const Vector3 &y) { return adjoint(xi, y);}
163 
171  static inline Matrix3 wedge(double vx, double vy, double w) {
172  Matrix3 m;
173  m << 0.,-w, vx,
174  w, 0., vy,
175  0., 0., 0.;
176  return m;
177  }
178 
180  static Matrix3 ExpmapDerivative(const Vector3& v);
181 
183  static Matrix3 LogmapDerivative(const Pose2& v);
184 
185  // Chart at origin, depends on compile-time flag SLOW_BUT_CORRECT_EXPMAP
186  struct ChartAtOrigin {
187  static Pose2 Retract(const Vector3& v, ChartJacobian H = boost::none);
188  static Vector3 Local(const Pose2& r, ChartJacobian H = boost::none);
189  };
190 
191  using LieGroup<Pose2, 3>::inverse; // version with derivative
192 
196 
198  Point2 transformTo(const Point2& point,
199  OptionalJacobian<2, 3> Dpose = boost::none,
200  OptionalJacobian<2, 2> Dpoint = boost::none) const;
201 
203  Point2 transformFrom(const Point2& point,
204  OptionalJacobian<2, 3> Dpose = boost::none,
205  OptionalJacobian<2, 2> Dpoint = boost::none) const;
206 
208  inline Point2 operator*(const Point2& point) const { return transformFrom(point);}
209 
213 
215  inline double x() const { return t_.x(); }
216 
218  inline double y() const { return t_.y(); }
219 
221  inline double theta() const { return r_.theta(); }
222 
224  inline const Point2& t() const { return t_; }
225 
227  inline const Rot2& r() const { return r_; }
228 
230  inline const Point2& translation() const { return t_; }
231 
233  inline const Rot2& rotation() const { return r_; }
234 
236  Matrix3 matrix() const;
237 
243  Rot2 bearing(const Point2& point,
244  OptionalJacobian<1, 3> H1=boost::none, OptionalJacobian<1, 2> H2=boost::none) const;
245 
251  Rot2 bearing(const Pose2& pose,
252  OptionalJacobian<1, 3> H1=boost::none, OptionalJacobian<1, 3> H2=boost::none) const;
253 
259  double range(const Point2& point,
260  OptionalJacobian<1, 3> H1=boost::none,
261  OptionalJacobian<1, 2> H2=boost::none) const;
262 
268  double range(const Pose2& point,
269  OptionalJacobian<1, 3> H1=boost::none,
270  OptionalJacobian<1, 3> H2=boost::none) const;
271 
275 
281  inline static std::pair<size_t, size_t> translationInterval() { return std::make_pair(0, 1); }
282 
288  static std::pair<size_t, size_t> rotationInterval() { return std::make_pair(2, 2); }
289 
291 
292 #ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V4
293  Point2 transform_from(const Point2& point,
296  OptionalJacobian<2, 3> Dpose = boost::none,
297  OptionalJacobian<2, 2> Dpoint = boost::none) const {
298  return transformFrom(point, Dpose, Dpoint);
299  }
300  Point2 transform_to(const Point2& point,
301  OptionalJacobian<2, 3> Dpose = boost::none,
302  OptionalJacobian<2, 2> Dpoint = boost::none) const {
303  return transformTo(point, Dpose, Dpoint);
304  }
306 #endif
307 
308  private:
309 
310  // Serialization function
311  friend class boost::serialization::access;
312  template<class Archive>
313  void serialize(Archive & ar, const unsigned int /*version*/) {
314  ar & BOOST_SERIALIZATION_NVP(t_);
315  ar & BOOST_SERIALIZATION_NVP(r_);
316  }
317 
318 public:
319  // Align for Point2, which is either derived from, or is typedef, of Vector2
320  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
321 }; // Pose2
322 
324 template <>
325 inline Matrix wedge<Pose2>(const Vector& xi) {
326  // NOTE(chris): Need eval() as workaround for Apple clang + avx2.
327  return Matrix(Pose2::wedge(xi(0),xi(1),xi(2))).eval();
328 }
329 
334 typedef std::pair<Point2,Point2> Point2Pair;
335 GTSAM_EXPORT boost::optional<Pose2> align(const std::vector<Point2Pair>& pairs);
336 
337 template <>
338 struct traits<Pose2> : public internal::LieGroup<Pose2> {};
339 
340 template <>
341 struct traits<const Pose2> : public internal::LieGroup<Pose2> {};
342 
343 // bearing and range traits, used in RangeFactor
344 template <typename T>
345 struct Bearing<Pose2, T> : HasBearing<Pose2, T, Rot2> {};
346 
347 template <typename T>
348 struct Range<Pose2, T> : HasRange<Pose2, T, double> {};
349 
350 } // namespace gtsam
351 
static std::pair< size_t, size_t > translationInterval()
Return the start and end indices (inclusive) of the translation component of the exponential map para...
Definition: Pose2.h:281
const Point2 & t() const
translation
Definition: Pose2.h:224
Pose2(const Rot2 &r, const Point2 &t)
construct from r,t
Definition: Pose2.h:78
double theta() const
return angle (RADIANS)
Definition: Rot2.h:173
void print(const Matrix &A, const string &s, ostream &stream)
print without optional string, must specify cout yourself
Definition: Matrix.cpp:141
Both LieGroupTraits and Testable.
Definition: Lie.h:237
const Rot2 & rotation() const
rotation
Definition: Pose2.h:233
Template to create a binary predicate.
Definition: Testable.h:110
Definition: Pose2.h:186
Bearing-Range product.
Pose2()
default constructor = origin
Definition: Pose2.h:55
static Pose2 identity()
identity for group operation
Definition: Pose2.h:110
Definition: BearingRange.h:33
OptionalJacobian is an Eigen::Ref like class that can take be constructed using either a fixed size o...
Definition: OptionalJacobian.h:39
2D Point
const Point2 & translation() const
translation
Definition: Pose2.h:230
A CRTP helper class that implements Lie group methods Prerequisites: methods operator*,...
Definition: Lie.h:36
Definition: BearingRange.h:193
static Vector3 adjoint(const Vector3 &xi, const Vector3 &y)
Action of the adjointMap on a Lie-algebra vector y, with optional derivatives.
Definition: Pose2.h:149
double x() const
get x
Definition: Pose2.h:215
2D rotation
Pose2(double theta, const Point2 &t)
construct from rotation and translation
Definition: Pose2.h:73
Vector3 Adjoint(const Vector3 &xi) const
Apply AdjointMap to twist xi.
Definition: Pose2.h:137
Definition: Rot2.h:33
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition: concepts.h:30
Definition: Pose2.h:36
double y() const
get y
Definition: Point2.h:106
Definition: BearingRange.h:179
Definition: BearingRange.h:39
Matrix wedge< Pose2 >(const Vector &xi)
specialization for pose2 wedge function (generic template in Lie.h)
Definition: Pose2.h:325
Definition: Point2.h:40
static Vector3 adjointTranspose(const Vector3 &xi, const Vector3 &y)
The dual version of adjoint action, acting on the dual space of the Lie-algebra vector space.
Definition: Pose2.h:156
double y() const
get y
Definition: Pose2.h:218
Global functions in a separate testing namespace.
Definition: chartTesting.h:28
Pose2(const Pose2 &pose)
copy constructor
Definition: Pose2.h:60
const Rot2 & r() const
rotation
Definition: Pose2.h:227
Rot2 Rotation
Pose Concept requirements.
Definition: Pose2.h:41
Base class and basic functions for Lie types.
Pose2(const Vector &v)
Construct from canonical coordinates (Lie algebra)
Definition: Pose2.h:91
std::pair< Point2, Point2 > Point2Pair
Calculate pose between a vector of 2D point correspondences (p,q) where q = Pose2::transformFrom(p) =...
Definition: Point2.h:163
static std::pair< size_t, size_t > rotationInterval()
Return the start and end indices (inclusive) of the rotation component of the exponential map paramet...
Definition: Pose2.h:288
Pose2(const Matrix &T)
Constructor from 3*3 matrix.
Definition: Pose2.h:81
Point2 operator *(double s, const Point2 &p)
multiply with scalar
Definition: Point2.h:170
double x() const
get x
Definition: Point2.h:103
double theta() const
get theta
Definition: Pose2.h:221
Pose2(double x, double y, double theta)
construct from (x,y,theta)
Definition: Pose2.h:68
static Matrix3 wedge(double vx, double vy, double w)
wedge for SE(2):
Definition: Pose2.h:171