farm-ng-core
lie_group.h
Go to the documentation of this file.
1 // Copyright (c) 2011, Hauke Strasdat
2 // Copyright (c) 2012, Steven Lovegrove
3 // Copyright (c) 2021, farm-ng, inc.
4 //
5 // Use of this source code is governed by an MIT-style
6 // license that can be found in the LICENSE file or at
7 // https://opensource.org/licenses/MIT.
8 
9 #pragma once
10 
11 #include "sophus/common/enum.h"
14 
15 namespace sophus {
16 namespace lie {
17 
18 template <
19  template <class>
20  class TGenericDerived,
21  class TScalar,
22  template <class>
23  class TGenericImpl>
24 class Group {
25  public:
26  using Scalar = TScalar;
27  using Impl = TGenericImpl<TScalar>;
28 
29  template <
30  template <class>
31  class TOtherGenericDerived,
32  class TOtherScalar,
33  template <class>
34  class TOtherGenericImpl>
35  friend class Group;
36 
37  static bool constexpr kIsOriginPreserving = Impl::kIsOriginPreserving;
38  static bool constexpr kIsAxisDirectionPreserving =
39  Impl::kIsAxisDirectionPreserving;
40  static bool constexpr kIsDirectionVectorPreserving =
41  Impl::kIsDirectionVectorPreserving;
42  static bool constexpr kIsShapePreserving = Impl::kIsShapePreserving;
43  static bool constexpr kIisSizePreserving = Impl::kIisSizePreserving;
44  static bool constexpr kIisParallelLinePreserving =
45  Impl::kIisParallelLinePreserving;
46 
47  static int constexpr kDof = Impl::kDof;
48  static int constexpr kNumParams = Impl::kNumParams;
49  static int constexpr kPointDim = Impl::kPointDim;
50  static int constexpr kAmbientDim = Impl::kAmbientDim;
51 
52  template <class TCompatibleScalar>
53  using ScalarReturn = typename Eigen::
54  ScalarBinaryOpTraits<Scalar, TCompatibleScalar>::ReturnType;
55 
56  using Derived = TGenericDerived<Scalar>;
57 
58  template <class TCompatibleScalar>
59  using DerivedReturn = TGenericDerived<ScalarReturn<TCompatibleScalar>>;
60 
61  template <class TCompatibleScalar>
62  using PointReturn = Eigen::Vector<ScalarReturn<TCompatibleScalar>, kPointDim>;
63 
64  template <class TCompatibleScalar>
65  using UnitVectorReturn =
67 
68  using Tangent = Eigen::Vector<Scalar, kDof>;
69  using Params = Eigen::Vector<Scalar, kNumParams>;
70  using Point = Eigen::Vector<Scalar, kPointDim>;
71 
72  // constructors and factories
73 
74  Group() : params_(Impl::identityParams()) {}
75 
76  Group(Group const&) = default;
77  auto operator=(Group const&) -> Group& = default;
78 
79  static auto fromParams(Params const& params) -> Derived {
80  Derived g(UninitTag{});
81  g.setParams(params);
82  return g;
83  }
84 
85  static auto identity() -> Derived {
86  Derived g(UninitTag{});
87  g.setParams(Impl::identityParams);
88  return g;
89  }
90 
91  // Manifold / Lie Group concepts
92 
93  static auto exp(Tangent const& tangent) -> Derived {
94  return Derived::fromParamsUnchecked(Impl::exp(tangent));
95  }
96 
97  [[nodiscard]] auto log() const -> Tangent { return Impl::log(this->params_); }
98 
99  static auto hat(Tangent const& tangent)
100  -> Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> {
101  return Impl::hat(tangent);
102  }
103 
104  static auto vee(Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> const& mat)
105  -> Tangent {
106  return Impl::vee(mat);
107  }
108 
109  auto hasShortestPathAmbiguity() -> bool {
110  return Impl::hasShortestPathAmbiguity(this->params_);
111  }
112 
113  // group operations
114 
115  template <class TCompatibleScalar>
116  auto operator*(TGenericDerived<TCompatibleScalar> const& rhs) const
118  auto params = Impl::multiplication(this->params_, rhs.params());
120  }
121 
122  auto operator*=(Derived const& rhs) -> Derived& {
123  *this = *this * rhs;
124  return self();
125  }
126 
127  [[nodiscard]] auto inverse() const -> Derived {
128  return Derived::fromParams(Impl::inverse(this->params_));
129  }
130 
131  // Group actions
132  template <class TMatrixDerived>
133  auto operator*(Eigen::MatrixBase<TMatrixDerived> const& point) const
135  return Impl::action(this->params_, point.eval());
136  }
137 
138  template <class TCompatibleScalar>
139  auto operator*(
140  UnitVector<TCompatibleScalar, kPointDim> const& direction_vector) const
142  return Impl::action(params_, direction_vector);
143  }
144 
145  static auto toAmbient(Point const& point) { return Impl::toAmbient(point); }
146 
147  [[nodiscard]] auto adj() const -> Eigen::Matrix<Scalar, kDof, kDof> {
148  return Impl::adj(this->params_);
149  }
150 
151  // left addition also called "left translation" in the literature
152  [[nodiscard]] auto leftPlus(Tangent const& tangent) const -> Derived {
153  return this->exp(tangent) * self();
154  }
155 
156  // right addition also called "right translation" in the literature
157  [[nodiscard]] auto rightPlus(Tangent const& tangent) const -> Derived {
158  return self() * exp(tangent);
159  }
160 
161  [[nodiscard]] auto leftMinus(Derived const& other) const -> Tangent {
162  return (self() * other.inverse()).log();
163  }
164 
165  [[nodiscard]] auto rightMinus(Derived const& other) const -> Tangent {
166  return (other.inverse() * self()).log();
167  }
168 
169  // Matrices
170 
171  [[nodiscard]] auto compactMatrix() const
172  -> Eigen::Matrix<Scalar, kPointDim, kAmbientDim> {
173  return Impl::compactMatrix(this->params_);
174  }
175 
176  [[nodiscard]] auto matrix() const
177  -> Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> {
178  return Impl::matrix(this->params_);
179  }
180 
181  // derivatives
182 
183  static auto ad(Tangent const& tangent) -> Eigen::Matrix<Scalar, kDof, kDof> {
184  return Impl::ad(tangent);
185  }
186 
187  // static auto dxExpX(Tangent const& tangent)
188  // -> Eigen::Matrix<Scalar, kNumParams, kDof> {
189  // return Impl::dxExpX(tangent);
190  // }
191 
192  static auto dxExpXAt0() -> Eigen::Matrix<Scalar, kNumParams, kDof> {
193  return Impl::dxExpXAt0();
194  }
195 
196  static auto dxExpXTimesPointAt0(Point const& point)
197  -> Eigen::Matrix<Scalar, kPointDim, kDof> {
198  return Impl::dxExpXTimesPointAt0(point);
199  }
200 
201  [[nodiscard]] auto dxThisMulExpXAt0() const
202  -> Eigen::Matrix<Scalar, kNumParams, kDof> {
203  return Impl::dxThisMulExpXAt0(this->params_);
204  }
205 
206  [[nodiscard]] auto dxLogThisInvTimesXAtThis() const
207  -> Eigen::Matrix<Scalar, kDof, kNumParams> {
208  return Impl::dxLogThisInvTimesXAtThis(this->params_);
209  }
210 
211  // for tests
212 
213  static auto tangentExamples() -> std::vector<Tangent> {
214  return Impl::tangentExamples();
215  }
216 
217  static auto paramsExamples() -> std::vector<Params> {
218  return Impl::paramsExamples();
219  }
220 
221  static auto elementExamples() -> std::vector<Derived> {
222  std::vector<Derived> out;
223  for (auto const& params : Derived::paramsExamples()) {
224  out.push_back(Derived::fromParams(params));
225  }
226  return out;
227  }
228 
229  static auto invalidParamsExamples() -> std::vector<Params> {
230  return Impl::invalidParamsExamples();
231  }
232 
233  // getters and setters
234 
235  [[nodiscard]] auto params() const -> Params const& { return this->params_; }
236 
237  [[nodiscard]] auto ptr() const { return this->params_.data(); }
238 
239  [[nodiscard]] auto unsafeMutPtr() { return this->params_.data(); }
240 
241  void setParams(Params const& params) {
242  // Hack to get unexpected error message on failure.
243  auto maybe_valid = Impl::areParamsValid(params);
244  SOPHUS_UNWRAP(maybe_valid);
245  this->params_ = params;
246  }
247 
248  protected:
249  explicit Group(UninitTag /*unused*/) {}
250 
251  auto self() -> Derived& { return static_cast<Derived&>(*this); }
252 
253  auto self() const -> Derived const& {
254  return static_cast<Derived const&>(*this);
255  }
256 
257  static auto fromParamsUnchecked(Params const& params) -> Derived {
258  Derived g(UninitTag{});
260  return g;
261  }
262 
263  void setParamsUnchecked(Params const& params) { this->params_ = params; }
264 
266 };
267 } // namespace lie
268 
269 } // namespace sophus
sophus::lie::Group::Group
Group(UninitTag)
Definition: lie_group.h:249
sophus::lie::Group::toAmbient
static auto toAmbient(Point const &point)
Definition: lie_group.h:145
sophus::lie::Group::kIisParallelLinePreserving
static constexpr bool kIisParallelLinePreserving
Definition: lie_group.h:44
lie_group.h
sophus::lie::Group< Rotation2, TScalar, lie::Rotation2Impl >::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: lie_group.h:69
sophus::lie::Group< Rotation2, TScalar, lie::Rotation2Impl >::ScalarReturn
typename Eigen::ScalarBinaryOpTraits< Scalar, TCompatibleScalar >::ReturnType ScalarReturn
Definition: lie_group.h:54
Eigen
Definition: params.h:72
sophus::lie::Group::dxLogThisInvTimesXAtThis
auto dxLogThisInvTimesXAtThis() const -> Eigen::Matrix< Scalar, kDof, kNumParams >
Definition: lie_group.h:206
sophus::lie::Group::hat
static auto hat(Tangent const &tangent) -> Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim >
Definition: lie_group.h:99
sophus::lie::Group::invalidParamsExamples
static auto invalidParamsExamples() -> std::vector< Params >
Definition: lie_group.h:229
sophus::lie::Group< Rotation2, TScalar, lie::Rotation2Impl >::Tangent
Eigen::Vector< Scalar, kDof > Tangent
Definition: lie_group.h:68
sophus::lie::Group
Definition: lie_group.h:24
sophus::UnitVector
Definition: lie_group.h:14
sophus::lie::Group::kIsOriginPreserving
static constexpr bool kIsOriginPreserving
Definition: lie_group.h:37
SOPHUS_UNWRAP
#define SOPHUS_UNWRAP(...)
Definition: common.h:52
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::lie::Group::adj
auto adj() const -> Eigen::Matrix< Scalar, kDof, kDof >
Definition: lie_group.h:147
sophus::lie::Group::vee
static auto vee(Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim > const &mat) -> Tangent
Definition: lie_group.h:104
sophus::lie::Group::operator*
auto operator*(TGenericDerived< TCompatibleScalar > const &rhs) const -> DerivedReturn< TCompatibleScalar >
Definition: lie_group.h:116
sophus::lie::Group::dxThisMulExpXAt0
auto dxThisMulExpXAt0() const -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: lie_group.h:201
sophus::lie::Group::operator*
auto operator*(UnitVector< TCompatibleScalar, kPointDim > const &direction_vector) const -> UnitVectorReturn< TCompatibleScalar >
Definition: lie_group.h:139
sophus::lie::Group< Rotation2, TScalar, lie::Rotation2Impl >::Point
Eigen::Vector< Scalar, kPointDim > Point
Definition: lie_group.h:70
sophus::lie::Group::elementExamples
static auto elementExamples() -> std::vector< Derived >
Definition: lie_group.h:221
sophus::lie::Group::unsafeMutPtr
auto unsafeMutPtr()
Definition: lie_group.h:239
sophus::lie::Group::dxExpXTimesPointAt0
static auto dxExpXTimesPointAt0(Point const &point) -> Eigen::Matrix< Scalar, kPointDim, kDof >
Definition: lie_group.h:196
sophus::lie::Group::params
auto params() const -> Params const &
Definition: lie_group.h:235
sophus::lie::Group::fromParams
static auto fromParams(Params const &params) -> Derived
Definition: lie_group.h:79
sophus::lie::Group::kPointDim
static constexpr int kPointDim
Definition: lie_group.h:49
sophus::lie::Group::leftPlus
auto leftPlus(Tangent const &tangent) const -> Derived
Definition: lie_group.h:152
sophus::lie::Group::kIisSizePreserving
static constexpr bool kIisSizePreserving
Definition: lie_group.h:43
sophus::lie::Group::params_
Params params_
Definition: lie_group.h:265
sophus::lie::Group::kDof
static constexpr int kDof
Definition: lie_group.h:47
sophus::lie::Group::kAmbientDim
static constexpr int kAmbientDim
Definition: lie_group.h:50
sophus::lie::Group::setParamsUnchecked
void setParamsUnchecked(Params const &params)
Definition: lie_group.h:263
sophus::lie::Group::inverse
auto inverse() const -> Derived
Definition: lie_group.h:127
sophus::lie::Group::rightMinus
auto rightMinus(Derived const &other) const -> Tangent
Definition: lie_group.h:165
sophus::lie::Group::setParams
void setParams(Params const &params)
Definition: lie_group.h:241
sophus::lie::Group::kIsDirectionVectorPreserving
static constexpr bool kIsDirectionVectorPreserving
Definition: lie_group.h:40
sophus::lie::Group::kIsAxisDirectionPreserving
static constexpr bool kIsAxisDirectionPreserving
Definition: lie_group.h:38
sophus::lie::Group::hasShortestPathAmbiguity
auto hasShortestPathAmbiguity() -> bool
Definition: lie_group.h:109
sophus::lie::Group::tangentExamples
static auto tangentExamples() -> std::vector< Tangent >
Definition: lie_group.h:213
sophus::lie::Group::identity
static auto identity() -> Derived
Definition: lie_group.h:85
sophus::lie::Group::compactMatrix
auto compactMatrix() const -> Eigen::Matrix< Scalar, kPointDim, kAmbientDim >
Definition: lie_group.h:171
sophus::lie::Group::paramsExamples
static auto paramsExamples() -> std::vector< Params >
Definition: lie_group.h:217
sophus::lie::Group< Rotation2, TScalar, lie::Rotation2Impl >::PointReturn
Eigen::Vector< ScalarReturn< TCompatibleScalar >, kPointDim > PointReturn
Definition: lie_group.h:62
sophus::lie::Group::log
auto log() const -> Tangent
Definition: lie_group.h:97
sophus::lie::Group::matrix
auto matrix() const -> Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim >
Definition: lie_group.h:176
sophus::lie::Group< Rotation2, TScalar, lie::Rotation2Impl >::Scalar
TScalar Scalar
Definition: lie_group.h:26
sophus::lie::Group::operator=
auto operator=(Group const &) -> Group &=default
translation_factor_group_product.h
sophus::lie::Group::operator*
auto operator*(Eigen::MatrixBase< TMatrixDerived > const &point) const -> PointReturn< typename TMatrixDerived::Scalar >
Definition: lie_group.h:133
sophus::lie::Group::operator*=
auto operator*=(Derived const &rhs) -> Derived &
Definition: lie_group.h:122
sophus::Rotation2
Definition: rotation2.h:20
sophus::lie::Group::ad
static auto ad(Tangent const &tangent) -> Eigen::Matrix< Scalar, kDof, kDof >
Definition: lie_group.h:183
sophus::lie::Group::Group
friend class Group
Definition: lie_group.h:35
sophus::lie::Group::fromParamsUnchecked
static auto fromParamsUnchecked(Params const &params) -> Derived
Definition: lie_group.h:257
sophus::lie::Group::exp
static auto exp(Tangent const &tangent) -> Derived
Definition: lie_group.h:93
sophus::lie::Group::kIsShapePreserving
static constexpr bool kIsShapePreserving
Definition: lie_group.h:42
enum.h
sophus::lie::Group::dxExpXAt0
static auto dxExpXAt0() -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: lie_group.h:192
sophus::lie::Group::kNumParams
static constexpr int kNumParams
Definition: lie_group.h:48
sophus::lie::Rotation2Impl
Definition: rotation2.h:19
sophus::lie::Group::rightPlus
auto rightPlus(Tangent const &tangent) const -> Derived
Definition: lie_group.h:157
sophus::lie::Group::ptr
auto ptr() const
Definition: lie_group.h:237
sophus::lie::Group::leftMinus
auto leftMinus(Derived const &other) const -> Tangent
Definition: lie_group.h:161
sophus::UninitTag
Definition: common.h:70
sophus::lie::Group::Group
Group()
Definition: lie_group.h:74