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>
29 
30 #include <optional>
31 
32 namespace gtsam {
33 
39 class GTSAM_EXPORT Pose2: public LieGroup<Pose2, 3> {
40 
41 public:
42 
44  typedef Rot2 Rotation;
46 
47 private:
48 
51 
52 public:
53 
56 
58  Pose2() :
59  r_(traits<Rot2>::Identity()), t_(traits<Point2>::Identity()) {
60  }
61 
63  Pose2(const Pose2& pose) = default;
64  // : r_(pose.r_), t_(pose.t_) {}
65 
66  Pose2& operator=(const Pose2& other) = default;
67 
74  Pose2(double x, double y, double theta) :
75  r_(Rot2::fromAngle(theta)), t_(x, y) {
76  }
77 
79  Pose2(double theta, const Point2& t) :
80  r_(Rot2::fromAngle(theta)), t_(t) {
81  }
82 
84  Pose2(const Rot2& r, const Point2& t) : r_(r), t_(t) {}
85 
87  Pose2(const Matrix &T)
88  : r_(Rot2::atan2(T(1, 0), T(0, 0))), t_(T(0, 2), T(1, 2)) {
89 #ifndef NDEBUG
90  if (T.rows() != 3 || T.cols() != 3) {
91  throw;
92  }
93 #endif
94  }
95 
99 
101  Pose2(const Vector& v) : Pose2() {
102  *this = Expmap(v);
103  }
104 
112  static std::optional<Pose2> Align(const Point2Pairs& abPointPairs);
113 
114  // Version of Pose2::Align that takes 2 matrices.
115  static std::optional<Pose2> Align(const Matrix& a, const Matrix& b);
116 
120 
122  void print(const std::string& s = "") const;
123 
125  bool equals(const Pose2& pose, double tol = 1e-9) const;
126 
130 
132  inline static Pose2 Identity() { return Pose2(); }
133 
135  Pose2 inverse() const;
136 
138  inline Pose2 operator*(const Pose2& p2) const {
139  return Pose2(r_*p2.r(), t_ + r_*p2.t());
140  }
141 
145 
147  static Pose2 Expmap(const Vector3& xi, ChartJacobian H = {});
148 
150  static Vector3 Logmap(const Pose2& p, ChartJacobian H = {});
151 
156  Matrix3 AdjointMap() const;
157 
159  inline Vector3 Adjoint(const Vector3& xi) const {
160  return AdjointMap()*xi;
161  }
162 
166  static Matrix3 adjointMap(const Vector3& v);
167 
171  static Vector3 adjoint(const Vector3& xi, const Vector3& y) {
172  return adjointMap(xi) * y;
173  }
174 
178  static Vector3 adjointTranspose(const Vector3& xi, const Vector3& y) {
179  return adjointMap(xi).transpose() * y;
180  }
181 
182  // temporary fix for wrappers until case issue is resolved
183  static Matrix3 adjointMap_(const Vector3 &xi) { return adjointMap(xi);}
184  static Vector3 adjoint_(const Vector3 &xi, const Vector3 &y) { return adjoint(xi, y);}
185 
193  static inline Matrix3 wedge(double vx, double vy, double w) {
194  Matrix3 m;
195  m << 0.,-w, vx,
196  w, 0., vy,
197  0., 0., 0.;
198  return m;
199  }
200 
202  static Matrix3 ExpmapDerivative(const Vector3& v);
203 
205  static Matrix3 LogmapDerivative(const Pose2& v);
206 
207  // Chart at origin, depends on compile-time flag SLOW_BUT_CORRECT_EXPMAP
208  struct GTSAM_EXPORT ChartAtOrigin {
209  static Pose2 Retract(const Vector3& v, ChartJacobian H = {});
210  static Vector3 Local(const Pose2& r, ChartJacobian H = {});
211  };
212 
213  using LieGroup<Pose2, 3>::inverse; // version with derivative
214 
218 
221  OptionalJacobian<2, 3> Dpose = {},
222  OptionalJacobian<2, 2> Dpoint = {}) const;
223 
229  Matrix transformTo(const Matrix& points) const;
230 
233  OptionalJacobian<2, 3> Dpose = {},
234  OptionalJacobian<2, 2> Dpoint = {}) const;
235 
241  Matrix transformFrom(const Matrix& points) const;
242 
244  inline Point2 operator*(const Point2& point) const {
245  return transformFrom(point);
246  }
247 
251 
253  inline double x() const { return t_.x(); }
254 
256  inline double y() const { return t_.y(); }
257 
259  inline double theta() const { return r_.theta(); }
260 
262  inline const Point2& t() const { return t_; }
263 
265  inline const Rot2& r() const { return r_; }
266 
268  inline const Point2& translation(OptionalJacobian<2, 3> Hself={}) const {
269  if (Hself) {
270  *Hself = Matrix::Zero(2, 3);
271  (*Hself).block<2, 2>(0, 0) = rotation().matrix();
272  }
273  return t_;
274  }
275 
277  inline const Rot2& rotation(OptionalJacobian<1, 3> Hself={}) const {
278  if (Hself) *Hself << 0, 0, 1;
279  return r_;
280  }
281 
283  Matrix3 matrix() const;
284 
290  Rot2 bearing(const Point2& point,
291  OptionalJacobian<1, 3> H1={}, OptionalJacobian<1, 2> H2={}) const;
292 
298  Rot2 bearing(const Pose2& pose,
299  OptionalJacobian<1, 3> H1={}, OptionalJacobian<1, 3> H2={}) const;
300 
306  double range(const Point2& point,
307  OptionalJacobian<1, 3> H1={},
308  OptionalJacobian<1, 2> H2={}) const;
309 
315  double range(const Pose2& point,
316  OptionalJacobian<1, 3> H1={},
317  OptionalJacobian<1, 3> H2={}) const;
318 
322 
328  inline static std::pair<size_t, size_t> translationInterval() { return {0, 1}; }
329 
335  static std::pair<size_t, size_t> rotationInterval() { return {2, 2}; }
336 
338  GTSAM_EXPORT
339  friend std::ostream &operator<<(std::ostream &os, const Pose2& p);
340 
342 
343  private:
344 
345 #if GTSAM_ENABLE_BOOST_SERIALIZATION //
346  // Serialization function
347  friend class boost::serialization::access;
348  template<class Archive>
349  void serialize(Archive & ar, const unsigned int /*version*/) {
350  ar & BOOST_SERIALIZATION_NVP(t_);
351  ar & BOOST_SERIALIZATION_NVP(r_);
352  }
353 #endif
354 
355 public:
356  // Align for Point2, which is either derived from, or is typedef, of Vector2
358 }; // Pose2
359 
361 template <>
362 inline Matrix wedge<Pose2>(const Vector& xi) {
363  // NOTE(chris): Need eval() as workaround for Apple clang + avx2.
364  return Matrix(Pose2::wedge(xi(0),xi(1),xi(2))).eval();
365 }
366 
367 // Convenience typedef
368 using Pose2Pair = std::pair<Pose2, Pose2>;
369 using Pose2Pairs = std::vector<Pose2Pair>;
370 
371 template <>
372 struct traits<Pose2> : public internal::LieGroup<Pose2> {};
373 
374 template <>
375 struct traits<const Pose2> : public internal::LieGroup<Pose2> {};
376 
377 // bearing and range traits, used in RangeFactor
378 template <typename T>
379 struct Bearing<Pose2, T> : HasBearing<Pose2, T, Rot2> {};
380 
381 template <typename T>
382 struct Range<Pose2, T> : HasRange<Pose2, T, double> {};
383 
384 } // namespace gtsam
385 
w
RowVector3d w
Definition: Matrix_resize_int.cpp:3
H
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy y set format x g set format y g set format x2 g set format y2 g set format z g set angles radians set nogrid set key title set key left top Right noreverse box linetype linewidth samplen spacing width set nolabel set noarrow set nologscale set logscale x set set pointsize set encoding default set nopolar set noparametric set set set set surface set nocontour set clabel set mapping cartesian set nohidden3d set cntrparam order set cntrparam linear set cntrparam levels auto set cntrparam points set size set set xzeroaxis lt lw set x2zeroaxis lt lw set yzeroaxis lt lw set y2zeroaxis lt lw set tics in set ticslevel set tics set mxtics default set mytics default set mx2tics default set my2tics default set xtics border mirror norotate autofreq set ytics border mirror norotate autofreq set ztics border nomirror norotate autofreq set nox2tics set noy2tics set timestamp bottom norotate set rrange[*:*] noreverse nowriteback set trange[*:*] noreverse nowriteback set urange[*:*] noreverse nowriteback set vrange[*:*] noreverse nowriteback set xlabel matrix size set x2label set timefmt d m y n H
Definition: gnuplot_common_settings.hh:74
gtsam::Pose2::Rotation
Rot2 Rotation
Definition: Pose2.h:44
gtsam::Pose2::Pose2
Pose2(const Matrix &T)
Definition: Pose2.h:87
pose
static const Pose3 pose(Rot3(Vector3(1, -1, -1).asDiagonal()), Point3(0, 0, 0.5))
inverse
const EIGEN_DEVICE_FUNC InverseReturnType inverse() const
Definition: ArrayCwiseUnaryOps.h:411
gtsam::Pose2::adjoint_
static Vector3 adjoint_(const Vector3 &xi, const Vector3 &y)
Definition: Pose2.h:184
s
RealScalar s
Definition: level1_cplx_impl.h:126
e
Array< double, 1, 3 > e(1./3., 0.5, 2.)
gtsam::Pose2::Adjoint
Vector3 Adjoint(const Vector3 &xi) const
Apply AdjointMap to twist xi.
Definition: Pose2.h:159
gtsam::operator<<
std::ostream & operator<<(std::ostream &os, const Dih6 &m)
Definition: testGroup.cpp:109
screwPose2::xi
Vector xi
Definition: testPose2.cpp:148
gtsam::Pose2::adjointMap_
static Matrix3 adjointMap_(const Vector3 &xi)
Definition: Pose2.h:183
gtsam::Pose2::rotation
const Rot2 & rotation(OptionalJacobian< 1, 3 > Hself={}) const
rotation
Definition: Pose2.h:277
gtsam::Pose2::t
const Point2 & t() const
translation
Definition: Pose2.h:262
x
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
Definition: gnuplot_common_settings.hh:12
gtsam::Rot2::theta
double theta() const
Definition: Rot2.h:189
gtsam::Matrix
Eigen::MatrixXd Matrix
Definition: base/Matrix.h:39
gtsam::Vector3
Eigen::Vector3d Vector3
Definition: Vector.h:44
os
ofstream os("timeSchurFactors.csv")
gtsam::Vector
Eigen::VectorXd Vector
Definition: Vector.h:39
gtsam::Pose2::Translation
Point2 Translation
Definition: Pose2.h:45
Rot2.h
2D rotation
Point2.h
2D Point
gtsam::Pose2::translationInterval
static std::pair< size_t, size_t > translationInterval()
Definition: Pose2.h:328
gtsam::range
Double_ range(const Point2_ &p, const Point2_ &q)
Definition: slam/expressions.h:30
simple::p2
static Point3 p2
Definition: testInitializePose3.cpp:51
gtsam_unstable.tests.test_ProjectionFactorRollingShutter.point
point
Definition: test_ProjectionFactorRollingShutter.py:25
Expmap
Pose2_ Expmap(const Vector3_ &xi)
Definition: InverseKinematicsExampleExpressions.cpp:47
gtsam::HasBearing
Definition: BearingRange.h:181
gtsam::print
void print(const Matrix &A, const string &s, ostream &stream)
Definition: Matrix.cpp:156
gtsam::Pose2::operator*
Pose2 operator*(const Pose2 &p2) const
compose syntactic sugar
Definition: Pose2.h:138
gtsam::transformFrom
Point3_ transformFrom(const Pose3_ &x, const Point3_ &p)
Definition: slam/expressions.h:47
gtsam::Pose2::ChartAtOrigin
Definition: Pose2.h:208
vy
StridedVectorType vy(make_vector(y, *n, std::abs(*incy)))
gtsam::transformTo
Line3 transformTo(const Pose3 &wTc, const Line3 &wL, OptionalJacobian< 4, 6 > Dpose, OptionalJacobian< 4, 4 > Dline)
Definition: Line3.cpp:94
gtsam::internal::LieGroup
Both LieGroupTraits and Testable.
Definition: Lie.h:229
gtsam::Pose2::r
const Rot2 & r() const
rotation
Definition: Pose2.h:265
gtsam::Pose2::Identity
static Pose2 Identity()
identity for group operation
Definition: Pose2.h:132
m
Matrix3f m
Definition: AngleAxis_mimic_euler.cpp:1
gtsam::Point2
Vector2 Point2
Definition: Point2.h:32
Eigen::Triplet< double >
gtsam::Range
Definition: BearingRange.h:41
gtsam::Pose2::Pose2
Pose2(const Vector &v)
Definition: Pose2.h:101
gtsam::equals
Definition: Testable.h:112
gtsam::Pose2::Pose2
Pose2(const Rot2 &r, const Point2 &t)
Definition: Pose2.h:84
y
Scalar * y
Definition: level1_cplx_impl.h:124
matrix
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
Definition: gtsam/3rdparty/Eigen/blas/common.h:110
gtsam::Pose2::theta
double theta() const
get theta
Definition: Pose2.h:259
std_optional_serialization.h
atan2
AnnoyingScalar atan2(const AnnoyingScalar &y, const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:110
gtsam::b
const G & b
Definition: Group.h:79
gtsam::Rot2
Definition: Rot2.h:35
a
ArrayXXi a
Definition: Array_initializer_list_23_cxx11.cpp:1
gtsam::Pose2::adjointTranspose
static Vector3 adjointTranspose(const Vector3 &xi, const Vector3 &y)
Definition: Pose2.h:178
gtsam::Pose2::Pose2
Pose2()
Definition: Pose2.h:58
gtsam::Pose2::translation
const Point2 & translation(OptionalJacobian< 2, 3 > Hself={}) const
translation
Definition: Pose2.h:268
Lie.h
Base class and basic functions for Lie types.
gtsam::Pose2::Pose2
Pose2(double theta, const Point2 &t)
Definition: Pose2.h:79
gtsam
traits
Definition: SFMdata.h:40
gtsam::rotation
Rot3_ rotation(const Pose3_ &pose)
Definition: slam/expressions.h:89
gtsam::traits
Definition: Group.h:36
gtsam::OptionalJacobian
Definition: OptionalJacobian.h:38
gtsam::Pose2::x
double x() const
get x
Definition: Pose2.h:253
gtsam::Pose2::r_
Rot2 r_
Definition: Pose2.h:49
gtsam::HasRange
Definition: BearingRange.h:195
p
float * p
Definition: Tutorial_Map_using.cpp:9
gtsam::Pose2::rotationInterval
static std::pair< size_t, size_t > rotationInterval()
Definition: Pose2.h:335
v
Array< int, Dynamic, 1 > v
Definition: Array_initializer_list_vector_cxx11.cpp:1
gtsam::Pose2::Pose2
Pose2(double x, double y, double theta)
Definition: Pose2.h:74
gtsam::Pose2::adjoint
static Vector3 adjoint(const Vector3 &xi, const Vector3 &y)
Definition: Pose2.h:171
gtsam::LieGroup
Definition: Lie.h:37
gtsam::tol
const G double tol
Definition: Group.h:79
gtsam::Point2Pairs
std::vector< Point2Pair > Point2Pairs
Definition: Point2.h:38
gtsam::Pose2Pairs
std::vector< Pose2Pair > Pose2Pairs
Definition: Pose2.h:369
gtsam::Pose2::operator*
Point2 operator*(const Point2 &point) const
Definition: Pose2.h:244
gtsam::Pose2::wedge
static Matrix3 wedge(double vx, double vy, double w)
Definition: Pose2.h:193
BearingRange.h
Bearing-Range product.
gtsam::internal::Align
static Similarity2 Align(const Point2Pairs &d_abPointPairs, const Rot2 &aRb, const Point2Pair &centroids)
This method estimates the similarity transform from differences point pairs, given a known or estimat...
Definition: Similarity2.cpp:74
gtsam::Bearing
Definition: BearingRange.h:35
align_3::t
Point2 t(10, 10)
GTSAM_MAKE_ALIGNED_OPERATOR_NEW
#define GTSAM_MAKE_ALIGNED_OPERATOR_NEW
Definition: types.h:279
adjoint
void adjoint(const MatrixType &m)
Definition: adjoint.cpp:67
gtsam::wedge< Pose2 >
Matrix wedge< Pose2 >(const Vector &xi)
Definition: Pose2.h:362
pybind_wrapper_test_script.other
other
Definition: pybind_wrapper_test_script.py:42
gtsam::Pose2::y
double y() const
get y
Definition: Pose2.h:256
gtsam::Pose2::t_
Point2 t_
Definition: Pose2.h:50
gtsam::Pose2Pair
std::pair< Pose2, Pose2 > Pose2Pair
Definition: Pose2.h:368
vx
StridedVectorType vx(make_vector(x, *n, std::abs(*incx)))
gtsam::Pose2
Definition: Pose2.h:39


gtsam
Author(s):
autogenerated on Tue Jan 7 2025 04:03:31