farm-ng-core
identity.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 
13 
14 namespace sophus {
15 namespace lie {
16 
17 template <class TScalar, int kDim>
18 class IdentityImpl {
19  public:
20  using Scalar = TScalar;
21 
22  static bool constexpr kIsOriginPreserving = true;
23  static bool constexpr kIsAxisDirectionPreserving = true;
24  static bool constexpr kIsDirectionVectorPreserving = true;
25  static bool constexpr kIsShapePreserving = true;
26  static bool constexpr kIisSizePreserving = true;
27  static bool constexpr kIisParallelLinePreserving = true;
28 
29  static int const kDof = 0;
30  static int const kNumParams = 0;
31  static int const kPointDim = kDim;
32  static int const kAmbientDim = kDim;
33 
34  using Tangent = Eigen::Vector<Scalar, kDof>;
35  using Params = Eigen::Vector<Scalar, kNumParams>;
36  using Point = Eigen::Vector<Scalar, kPointDim>;
37 
38  template <class TCompatibleScalar>
39  using ScalarReturn = typename Eigen::
40  ScalarBinaryOpTraits<Scalar, TCompatibleScalar>::ReturnType;
41 
42  template <class TCompatibleScalar>
43  using ParamsReturn =
44  Eigen::Vector<ScalarReturn<TCompatibleScalar>, kNumParams>;
45 
46  template <class TCompatibleScalar>
47  using PointReturn = Eigen::Vector<ScalarReturn<TCompatibleScalar>, kPointDim>;
48 
49  template <class TCompatibleScalar>
50  using UnitVectorReturn =
52 
53  // constructors and factories
54 
55  static auto identityParams() -> Params { return Params::Zero(); }
56 
57  static auto areParamsValid(Params const& scale_factors)
58  -> sophus::Expected<Success> {
59  return sophus::Expected<Success>{};
60  }
61 
62  static auto adj(Params const& /*unused*/)
63  -> Eigen::Matrix<Scalar, kDof, kDof> {
64  return Eigen::Matrix<Scalar, kDof, kDof>::Identity();
65  }
66 
67  static auto hasShortestPathAmbiguity(Params const&) -> bool { return false; }
68 
69  // Manifold / Lie Group concepts
70 
71  static auto exp(Tangent const& tangent) -> Params { return tangent; }
72 
73  static auto log(Params const& params) -> Tangent { return params; }
74 
75  static auto hat(Tangent const& tangent)
76  -> Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> {
77  Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> mat;
78  mat.setZero();
79  return mat;
80  }
81 
82  static auto vee(Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> const& mat)
83  -> Eigen::Matrix<Scalar, kDof, 1> {
84  return Eigen::Matrix<Scalar, kDof, 1>();
85  }
86 
87  // group operations
88 
89  static auto inverse(Params const& params) -> Params { return params; }
90 
91  template <class TCompatibleScalar>
92  static auto multiplication(
93  Params const& lhs_params,
94  Eigen::Vector<TCompatibleScalar, kNumParams> const& rhs_params)
97  }
98 
99  // Point actions
100  template <class TCompatibleScalar>
101  static auto action(
102  Params const& params,
103  Eigen::Vector<TCompatibleScalar, kPointDim> const& point)
105  return Scalar(1.0) * point;
106  }
107 
108  static auto toAmbient(Point const& point)
109  -> Eigen::Vector<Scalar, kAmbientDim> {
110  return point;
111  }
112 
113  template <class TCompatibleScalar>
114  static auto action(
115  Params const& params, UnitVector<TCompatibleScalar, kPointDim> const& dir)
118  Scalar(1.0) * dir.params());
119  }
120 
121  // Matrices
122 
123  static auto compactMatrix(Params const& params)
124  -> Eigen::Matrix<Scalar, kPointDim, kAmbientDim> {
125  return Eigen::Matrix<Scalar, kPointDim, kAmbientDim>::Identity();
126  }
127 
128  static auto matrix(Params const& params)
129  -> Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> {
130  return compactMatrix(params);
131  }
132 
133  // factor group concepts
134 
135  static auto matV(Params const& /*unused*/, Tangent const& /*unused*/)
136  -> Eigen::Matrix<Scalar, kPointDim, kPointDim> {
137  return Eigen::Matrix<Scalar, kPointDim, kPointDim>::Identity();
138  }
139 
140  static auto matVInverse(Params const& /*unused*/, Tangent const& /*unused*/)
141  -> Eigen::Matrix<Scalar, kPointDim, kPointDim> {
142  return Eigen::Matrix<Scalar, kPointDim, kPointDim>::Identity();
143  }
144 
145  static auto adjOfTranslation(Params const& params, Point const& point)
146  -> Eigen::Matrix<Scalar, kPointDim, kDof> {
147  return Eigen::Matrix<Scalar, kPointDim, kDof>::Zero();
148  }
149 
150  static auto adOfTranslation(Point const& point)
151  -> Eigen::Matrix<Scalar, kPointDim, kDof> {
152  return Eigen::Matrix<Scalar, kPointDim, kDof>::Zero();
153  }
154 
155  // derivatives
156  static auto ad(Tangent const& /*unused*/)
157  -> Eigen::Matrix<Scalar, kDof, kDof> {
158  return Eigen::Matrix<Scalar, kDof, kDof>::Zero();
159  }
160 
161  static auto dxExpX(Tangent const& /*unused*/)
162  -> Eigen::Matrix<Scalar, kNumParams, kDof> {
163  return Eigen::Matrix<Scalar, kNumParams, 0>::Identity();
164  }
165 
166  static auto dxExpXAt0() -> Eigen::Matrix<Scalar, kNumParams, kDof> {
167  return Eigen::Matrix<Scalar, kNumParams, 0>::Identity();
168  }
169 
170  static auto dxExpXTimesPointAt0(Point const& point)
171  -> Eigen::Matrix<Scalar, kPointDim, kDof> {
172  return Eigen::Matrix<Scalar, kPointDim, 0>::Identity();
173  }
174 
175  static auto dxThisMulExpXAt0(Params const& unit_complex)
176  -> Eigen::Matrix<Scalar, kNumParams, kDof> {
177  return Eigen::Matrix<Scalar, kNumParams, 0>::Zero();
178  }
179 
180  static auto dxLogThisInvTimesXAtThis(Params const& unit_quat)
181  -> Eigen::Matrix<Scalar, kDof, kNumParams> {
182  return Eigen::Matrix<Scalar, kDof, kNumParams>::Identity();
183  }
184 
185  // for tests
186 
187  static auto tangentExamples() -> std::vector<Tangent> {
188  return std::vector<Tangent>();
189  }
190 
191  static auto paramsExamples() -> std::vector<Params> {
192  return std::vector<Params>();
193  }
194 
195  static auto invalidParamsExamples() -> std::vector<Params> {
196  return std::vector<Params>();
197  }
198 };
199 
200 } // namespace lie
201 
202 template <class TScalar, int kDim>
203 class Identity;
204 
205 namespace lie {
206 template <int kDim>
208  template <class TScalar>
210 
211  template <class TScalar>
213 };
214 
215 } // namespace lie
216 
217 } // namespace sophus
sophus::lie::IdentityImpl::vee
static auto vee(Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim > const &mat) -> Eigen::Matrix< Scalar, kDof, 1 >
Definition: identity.h:82
sophus::lie::IdentityImpl::dxExpXTimesPointAt0
static auto dxExpXTimesPointAt0(Point const &point) -> Eigen::Matrix< Scalar, kPointDim, kDof >
Definition: identity.h:170
lie_group.h
sophus::lie::IdentityImpl::kPointDim
static const int kPointDim
Definition: identity.h:31
sophus::lie::IdentityImpl::hat
static auto hat(Tangent const &tangent) -> Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim >
Definition: identity.h:75
sophus::lie::IdentityImpl::kIisParallelLinePreserving
static constexpr bool kIisParallelLinePreserving
Definition: identity.h:27
sophus::lie::IdentityImpl::multiplication
static auto multiplication(Params const &lhs_params, Eigen::Vector< TCompatibleScalar, kNumParams > const &rhs_params) -> ParamsReturn< TCompatibleScalar >
Definition: identity.h:92
sophus::lie::IdentityImpl::toAmbient
static auto toAmbient(Point const &point) -> Eigen::Vector< Scalar, kAmbientDim >
Definition: identity.h:108
sophus::UnitVector
Definition: lie_group.h:14
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::lie::IdentityImpl::kIsOriginPreserving
static constexpr bool kIsOriginPreserving
Definition: identity.h:22
sophus::lie::IdentityImpl::adj
static auto adj(Params const &) -> Eigen::Matrix< Scalar, kDof, kDof >
Definition: identity.h:62
sophus::lie::IdentityImpl::PointReturn
Eigen::Vector< ScalarReturn< TCompatibleScalar >, kPointDim > PointReturn
Definition: identity.h:47
sophus::lie::IdentityImpl::kIsAxisDirectionPreserving
static constexpr bool kIsAxisDirectionPreserving
Definition: identity.h:23
sophus::lie::IdentityImpl::action
static auto action(Params const &params, UnitVector< TCompatibleScalar, kPointDim > const &dir) -> UnitVectorReturn< TCompatibleScalar >
Definition: identity.h:114
sophus::lie::IdentityImpl::kAmbientDim
static const int kAmbientDim
Definition: identity.h:32
sophus::lie::IdentityImpl::action
static auto action(Params const &params, Eigen::Vector< TCompatibleScalar, kPointDim > const &point) -> PointReturn< TCompatibleScalar >
Definition: identity.h:101
sophus::lie::IdentityImpl::kIsDirectionVectorPreserving
static constexpr bool kIsDirectionVectorPreserving
Definition: identity.h:24
sophus::lie::IdentityImpl::kDof
static const int kDof
Definition: identity.h:29
sophus::lie::IdentityImpl::adjOfTranslation
static auto adjOfTranslation(Params const &params, Point const &point) -> Eigen::Matrix< Scalar, kPointDim, kDof >
Definition: identity.h:145
sophus::lie::IdentityImpl::ParamsReturn
Eigen::Vector< ScalarReturn< TCompatibleScalar >, kNumParams > ParamsReturn
Definition: identity.h:44
sophus::lie::IdentityImpl::compactMatrix
static auto compactMatrix(Params const &params) -> Eigen::Matrix< Scalar, kPointDim, kAmbientDim >
Definition: identity.h:123
sophus::lie::IdentityImpl::dxThisMulExpXAt0
static auto dxThisMulExpXAt0(Params const &unit_complex) -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: identity.h:175
sophus::lie::IdentityImpl::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: identity.h:35
sophus::lie::IdentityImpl::Scalar
TScalar Scalar
Definition: identity.h:20
sophus::lie::IdentityImpl::kIisSizePreserving
static constexpr bool kIisSizePreserving
Definition: identity.h:26
sophus::lie::IdentityImpl::kNumParams
static const int kNumParams
Definition: identity.h:30
sophus::lie::IdentityImpl::kIsShapePreserving
static constexpr bool kIsShapePreserving
Definition: identity.h:25
sophus::lie::IdentityImpl::ScalarReturn
typename Eigen::ScalarBinaryOpTraits< Scalar, TCompatibleScalar >::ReturnType ScalarReturn
Definition: identity.h:40
sophus::lie::IdentityImpl::matVInverse
static auto matVInverse(Params const &, Tangent const &) -> Eigen::Matrix< Scalar, kPointDim, kPointDim >
Definition: identity.h:140
sophus::lie::IdentityImpl::Point
Eigen::Vector< Scalar, kPointDim > Point
Definition: identity.h:36
unit_vector.h
sophus::Identity
Definition: identity.h:21
sophus::lie::IdentityImpl::adOfTranslation
static auto adOfTranslation(Point const &point) -> Eigen::Matrix< Scalar, kPointDim, kDof >
Definition: identity.h:150
sophus::lie::IdentityImpl::invalidParamsExamples
static auto invalidParamsExamples() -> std::vector< Params >
Definition: identity.h:195
sophus::lie::IdentityImpl::dxLogThisInvTimesXAtThis
static auto dxLogThisInvTimesXAtThis(Params const &unit_quat) -> Eigen::Matrix< Scalar, kDof, kNumParams >
Definition: identity.h:180
sophus::lie::IdentityImpl::hasShortestPathAmbiguity
static auto hasShortestPathAmbiguity(Params const &) -> bool
Definition: identity.h:67
sophus::lie::IdentityImpl::matV
static auto matV(Params const &, Tangent const &) -> Eigen::Matrix< Scalar, kPointDim, kPointDim >
Definition: identity.h:135
sophus::UnitVector::fromParams
static auto fromParams(Eigen::Matrix< TScalar, kN, 1 > const &v) -> UnitVector
Definition: unit_vector.h:166
sophus::lie::IdentityImpl::dxExpX
static auto dxExpX(Tangent const &) -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: identity.h:161
sophus::lie::IdentityImpl::dxExpXAt0
static auto dxExpXAt0() -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: identity.h:166
sophus::lie::IdentityImpl::inverse
static auto inverse(Params const &params) -> Params
Definition: identity.h:89
sophus::lie::IdentityImpl::paramsExamples
static auto paramsExamples() -> std::vector< Params >
Definition: identity.h:191
sophus::lie::IdentityImpl::exp
static auto exp(Tangent const &tangent) -> Params
Definition: identity.h:71
sophus::lie::IdentityImpl::log
static auto log(Params const &params) -> Tangent
Definition: identity.h:73
sophus::lie::IdentityWithDim
Definition: identity.h:207
sophus::lie::IdentityImpl::tangentExamples
static auto tangentExamples() -> std::vector< Tangent >
Definition: identity.h:187
sophus::lie::IdentityImpl::areParamsValid
static auto areParamsValid(Params const &scale_factors) -> sophus::Expected< Success >
Definition: identity.h:57
sophus::lie::IdentityImpl::matrix
static auto matrix(Params const &params) -> Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim >
Definition: identity.h:128
sophus::lie::IdentityImpl
Definition: identity.h:18
sophus::lie::IdentityImpl::identityParams
static auto identityParams() -> Params
Definition: identity.h:55
sophus::lie::IdentityImpl::ad
static auto ad(Tangent const &) -> Eigen::Matrix< Scalar, kDof, kDof >
Definition: identity.h:156
sophus::lie::IdentityImpl::Tangent
Eigen::Vector< Scalar, kDof > Tangent
Definition: identity.h:34