farm-ng-core
spiral_similarity3.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
15 
16 namespace sophus {
17 namespace lie {
18 
19 template <class TScalar>
21  public:
22  using Scalar = TScalar;
24 
25  static bool constexpr kIsOriginPreserving = true;
26  static bool constexpr kIsAxisDirectionPreserving = false;
27  static bool constexpr kIsDirectionVectorPreserving = false;
28  static bool constexpr kIsShapePreserving = false;
29  static bool constexpr kIisSizePreserving = true;
30  static bool constexpr kIisParallelLinePreserving = true;
31 
32  static int const kDof = 4;
33  static int const kNumParams = 4;
34  static int const kPointDim = 3;
35  static int const kAmbientDim = 3;
36 
37  using Tangent = Eigen::Vector<Scalar, kDof>;
38  using Params = Eigen::Vector<Scalar, kNumParams>;
39  using Point = Eigen::Vector<Scalar, kPointDim>;
40 
41  template <class TCompatibleScalar>
42  using ScalarReturn = typename Eigen::
43  ScalarBinaryOpTraits<Scalar, TCompatibleScalar>::ReturnType;
44 
45  template <class TCompatibleScalar>
46  using ParamsReturn =
47  Eigen::Vector<ScalarReturn<TCompatibleScalar>, kNumParams>;
48 
49  template <class TCompatibleScalar>
50  using PointReturn = Eigen::Vector<ScalarReturn<TCompatibleScalar>, kPointDim>;
51 
52  template <class TCompatibleScalar>
53  using UnitVectorReturn =
55 
56  // constructors and factories
57 
58  static auto identityParams() -> Params {
59  return Eigen::Vector<Scalar, 4>(
60  Scalar(0.0), Scalar(0.0), Scalar(0.0), Scalar(1.0));
61  }
62 
63  static auto areParamsValid(Params const& non_zero_quat)
64  -> sophus::Expected<Success> {
65  static const Scalar kThr = kEpsilon<Scalar> * kEpsilon<Scalar>;
66  const Scalar squared_norm = non_zero_quat.squaredNorm();
67  using std::abs;
68  if (!(squared_norm > kThr || squared_norm < 1.0 / kThr)) {
69  return SOPHUS_UNEXPECTED(
70  "complex number ({}, {}) is too large or too small.\n"
71  "Squared norm: {}, thr: {}",
72  non_zero_quat[0],
73  non_zero_quat[1],
74  squared_norm,
75  kThr);
76  }
77  return sophus::Expected<Success>{};
78  }
79 
80  static auto hasShortestPathAmbiguity(Params const& non_zero_quat) -> bool {
82  non_zero_quat.normalized());
83  }
84 
85  // Manifold / Lie Group concepts
86 
87  static auto exp(Tangent const& omega_logscale) -> Params {
88  using std::exp;
89  using std::max;
90  using std::min;
91  using std::sqrt;
92 
93  Eigen::Vector3<Scalar> const vec_omega = omega_logscale.template head<3>();
94  Scalar scale = exp(omega_logscale[3]);
95  // Ensure that scale-factor constraint is always valid
96  scale = max(scale, kEpsilonPlus<Scalar>);
97  scale = min(scale, Scalar(1.) / kEpsilonPlus<Scalar>);
98  Scalar sqrt_scale = sqrt(scale);
99  Params quat = Rotation3Impl<Scalar>::exp(vec_omega);
100  quat *= sqrt_scale;
101  return quat;
102  }
103 
104  static auto log(Params const& non_zero_quat) -> Tangent {
105  using std::log;
106 
107  Scalar scale = non_zero_quat.squaredNorm();
108  Tangent omega_and_logscale;
109  omega_and_logscale.template head<3>() =
110  Rotation3Impl<Scalar>::log(non_zero_quat.normalized());
111  omega_and_logscale[3] = log(scale);
112  return omega_and_logscale;
113  }
114 
115  static auto hat(Tangent const& omega_logscale)
116  -> Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> {
117  return Eigen::Matrix<Scalar, 3, 3>{
118  {+omega_logscale(3), -omega_logscale(2), +omega_logscale(1)},
119  {+omega_logscale(2), +omega_logscale(3), -omega_logscale(0)},
120  {-omega_logscale(1), +omega_logscale(0), +omega_logscale(3)}};
121  }
122 
123  static auto vee(Eigen::Matrix<Scalar, kAmbientDim, kAmbientDim> const& mat)
124  -> Eigen::Matrix<Scalar, kDof, 1> {
125  return Eigen::Matrix<Scalar, kDof, 1>{
126  mat(2, 1), mat(0, 2), mat(1, 0), mat(0, 0)};
127  }
128 
129  // group operations
130 
131  static auto inverse(Params const& non_zero_quat) -> Params {
132  Scalar squared_scale = non_zero_quat.norm();
133  return (1.0 / squared_scale) *
134  QuaternionImpl<Scalar>::conjugate(non_zero_quat.normalized());
135  }
136 
137  template <class TCompatibleScalar>
138  static auto multiplication(
139  Params const& lhs_params,
140  Eigen::Vector<TCompatibleScalar, kNumParams> const& rhs_params)
143  QuaternionImpl<Scalar>::multiplication(lhs_params, rhs_params);
145  R const squared_scale = result.squaredNorm();
146 
147  if (squared_scale < kEpsilon<Scalar> * kEpsilon<Scalar>) {
148  /// Saturation to ensure class invariant.
149  result.normalize();
150  result *= kEpsilonPlus<R>;
151  }
152  if (squared_scale > Scalar(1.) / (kEpsilon<Scalar> * kEpsilon<Scalar>)) {
153  /// Saturation to ensure class invariant.
154  result.normalize();
155  result /= kEpsilonPlus<R>;
156  }
157  return result;
158  }
159 
160  // Point actions
161  template <class TCompatibleScalar>
162  static auto action(
163  Params const& non_zero_quat,
164  Eigen::Vector<TCompatibleScalar, kPointDim> const& point)
166  return matrix(non_zero_quat) * point;
167  }
168 
169  template <class TCompatibleScalar>
170  static auto action(
171  Params const& non_zero_quat,
172  UnitVector<TCompatibleScalar, kPointDim> const& direction_vector)
175  Rotation3Impl<Scalar>::matrix(non_zero_quat.normalized()) *
176  direction_vector.params());
177  }
178 
179  static auto toAmbient(Point const& point)
180  -> Eigen::Vector<Scalar, kAmbientDim> {
181  return point;
182  }
183 
184  static auto adj(Params const& non_zero_quat)
185  -> Eigen::Matrix<Scalar, kDof, kDof> {
186  Eigen::Matrix<Scalar, kDof, kDof> mat;
187  mat.setIdentity();
188  mat.template topLeftCorner<3, 3>() =
189  Rotation3Impl<Scalar>::matrix(non_zero_quat.normalized());
190  return mat;
191  }
192 
193  // matrices
194 
195  static auto compactMatrix(Params const& non_zero_quat)
196  -> Eigen::Matrix<Scalar, kPointDim, kPointDim> {
197  Eigen::Matrix<Scalar, kPointDim, kPointDim> s_r;
198 
199  Scalar const vx_sq = non_zero_quat.x() * non_zero_quat.x();
200  Scalar const vy_sq = non_zero_quat.y() * non_zero_quat.y();
201  Scalar const vz_sq = non_zero_quat.z() * non_zero_quat.z();
202  Scalar const w_sq = non_zero_quat.w() * non_zero_quat.w();
203  Scalar const two_vx = Scalar(2) * non_zero_quat.x();
204  Scalar const two_vy = Scalar(2) * non_zero_quat.y();
205  Scalar const two_vz = Scalar(2) * non_zero_quat.z();
206  Scalar const two_vx_vy = two_vx * non_zero_quat.y();
207  Scalar const two_vx_vz = two_vx * non_zero_quat.z();
208  Scalar const two_vx_w = two_vx * non_zero_quat.w();
209  Scalar const two_vy_vz = two_vy * non_zero_quat.z();
210  Scalar const two_vy_w = two_vy * non_zero_quat.w();
211  Scalar const two_vz_w = two_vz * non_zero_quat.w();
212 
213  s_r(0, 0) = vx_sq - vy_sq - vz_sq + w_sq;
214  s_r(1, 0) = two_vx_vy + two_vz_w;
215  s_r(2, 0) = two_vx_vz - two_vy_w;
216 
217  s_r(0, 1) = two_vx_vy - two_vz_w;
218  s_r(1, 1) = -vx_sq + vy_sq - vz_sq + w_sq;
219  s_r(2, 1) = two_vx_w + two_vy_vz;
220 
221  s_r(0, 2) = two_vx_vz + two_vy_w;
222  s_r(1, 2) = -two_vx_w + two_vy_vz;
223  s_r(2, 2) = -vx_sq - vy_sq + vz_sq + w_sq;
224  return s_r;
225  }
226 
227  static auto matrix(Params const& non_zero_quat)
228  -> Eigen::Matrix<Scalar, kPointDim, kPointDim> {
229  return compactMatrix(non_zero_quat);
230  }
231 
232  // Sub-group concepts
233  static auto matV(Params const& /*unused*/, Tangent const& angle_logscale)
234  -> Eigen::Matrix<Scalar, kPointDim, kPointDim> {
235  Eigen::Matrix<Scalar, 3, 1> omega = angle_logscale.template head<3>();
236  Eigen::Matrix<Scalar, 3, 3> mat_omega = Rotation3Impl<Scalar>::hat(omega);
237  Scalar theta = omega.norm();
238  Eigen::Matrix3<Scalar> const w =
239  details::calcW<Scalar, 3>(mat_omega, theta, angle_logscale[3]);
240  return w;
241  }
242 
243  static auto matVInverse(
244  Params const& non_zero_quat, Tangent const& angle_logscale)
245  -> Eigen::Matrix<Scalar, kPointDim, kPointDim> {
246  Eigen::Matrix<Scalar, 3, 1> omega = angle_logscale.template head<3>();
247  Eigen::Matrix<Scalar, 3, 3> mat_omega = Rotation3Impl<Scalar>::hat(omega);
248  Scalar theta = omega.norm();
249  return details::calcWInv<Scalar, 3>(
250  mat_omega, theta, angle_logscale[3], non_zero_quat.squaredNorm());
251  }
252 
253  static auto adjOfTranslation(Params const& quat, Point const& point)
254  -> Eigen::Matrix<Scalar, kPointDim, kDof> {
255  Eigen::Matrix<Scalar, 3, 4> tr_adj;
256  tr_adj.template topLeftCorner<3, 3>() =
258  Rotation3Impl<Scalar>::matrix(quat.normalized());
259  tr_adj.template topRightCorner<3, 1>() = -point;
260  return tr_adj;
261  }
262 
263  static auto adOfTranslation(Point const& point)
264  -> Eigen::Matrix<Scalar, kPointDim, kDof> {
265  Eigen::Matrix<Scalar, 3, 4> tr_ad;
266  tr_ad.template leftCols<3>() = Rotation3Impl<Scalar>::hat(point);
267  tr_ad.col(3) = -point;
268  return tr_ad;
269  }
270 
271  // derivatives
272 
273  static auto ad(Tangent const& tangent) -> Eigen::Matrix<Scalar, kDof, kDof> {
274  Eigen::Matrix<Scalar, kDof, kDof> mat;
275  mat.setZero();
276  mat.template topLeftCorner<3, 3>() =
277  Rotation3Impl<Scalar>::hat(tangent.template head<3>());
278  return mat;
279  }
280 
281  static auto dxExpX(Tangent const& a)
282  -> Eigen::Matrix<Scalar, kNumParams, kDof> {
283  using std::exp;
284  using std::sqrt;
285  Eigen::Matrix<Scalar, 4, 4> j;
286  Eigen::Vector3<Scalar> const omega = a.template head<3>();
287  Scalar const sigma = a[3];
288  Params quat = Rotation3Impl<Scalar>::exp(omega);
289  Scalar const scale = sqrt(exp(sigma));
290  Scalar const scale_half = scale * Scalar(0.5);
291 
292  j.template block<4, 3>(0, 0) = Rotation3Impl<Scalar>::dxExpX(omega) * scale;
293  j.col(3) = a * scale_half;
294  return j;
295  }
296 
297  static auto dxExpXAt0() -> Eigen::Matrix<Scalar, kNumParams, kDof> {
298  static Scalar const kH(0.5);
299  return kH * Eigen::Matrix<Scalar, 4, 4>::Identity();
300  }
301 
302  static auto dxExpXTimesPointAt0(Point const& point)
303  -> Eigen::Matrix<Scalar, kPointDim, kDof> {
304  Eigen::Matrix<Scalar, 3, 4> j;
305  j << Rotation3Impl<Scalar>::hat(-point), point;
306  return j;
307  }
308 
309  static auto dxThisMulExpXAt0(Params const& non_zero_quat)
310  -> Eigen::Matrix<Scalar, kNumParams, kDof> {
311  Eigen::Matrix<Scalar, 4, 4> j;
312  j.col(3) = non_zero_quat * Scalar(0.5);
313  Scalar const c0 = Scalar(0.5) * non_zero_quat.w();
314  Scalar const c1 = Scalar(0.5) * non_zero_quat.z();
315  Scalar const c2 = -c1;
316  Scalar const c3 = Scalar(0.5) * non_zero_quat.y();
317  Scalar const c4 = Scalar(0.5) * non_zero_quat.x();
318  Scalar const c5 = -c4;
319  Scalar const c6 = -c3;
320  j(0, 0) = c0;
321  j(0, 1) = c2;
322  j(0, 2) = c3;
323  j(1, 0) = c1;
324  j(1, 1) = c0;
325  j(1, 2) = c5;
326  j(2, 0) = c6;
327  j(2, 1) = c4;
328  j(2, 2) = c0;
329  j(3, 0) = c5;
330  j(3, 1) = c6;
331  j(3, 2) = c2;
332  return j;
333  }
334 
335  static auto dxLogThisInvTimesXAtThis(Params const& q)
336  -> Eigen::Matrix<Scalar, kDof, kNumParams> {
337  Eigen::Matrix<Scalar, 4, 4> j;
338  // clang-format off
339  j << q.w(), q.z(), -q.y(), -q.x(),
340  -q.z(), q.w(), q.x(), -q.y(),
341  q.y(), -q.x(), q.w(), -q.z(),
342  q.x(), q.y(), q.z(), q.w();
343  // clang-format on
344  const Scalar scaler = Scalar(2.) / q.squaredNorm();
345  return j * scaler;
346  }
347 
348  // for tests
349 
350  static auto tangentExamples() -> std::vector<Tangent> {
351  return std::vector<Tangent>({
352  Tangent{Scalar(0.0), Scalar(0.0), Scalar(0.0), Scalar(0.0)},
353  Tangent{Scalar(1.0), Scalar(0.0), Scalar(0.0), Scalar(0.0)},
354  Tangent{Scalar(1.0), Scalar(0.0), Scalar(0.0), Scalar(0.1)},
355  Tangent{Scalar(0.0), Scalar(1.0), Scalar(0.0), Scalar(0.1)},
356  Tangent{Scalar(0.00001), Scalar(0.00001), Scalar(0.0), Scalar(0.3)},
357  Tangent{
358  Scalar(0.5 * kPi<Scalar>), Scalar(0.9), Scalar(0.0), Scalar(0.0)},
359  Tangent{
360  Scalar(0.0),
361  Scalar(0.0),
362  Scalar(0.5 * kPi<Scalar> + 0.00001),
363  Scalar(0.2)},
364  });
365  }
366 
367  static auto paramsExamples() -> std::vector<Params> {
368  return std::vector<Params>({
370  {Scalar(0.2), Scalar(0.5), Scalar(0.0), Scalar(1.0)}),
372  {Scalar(0.2), Scalar(0.5), Scalar(-1.0), Scalar(1.1)}),
374  {Scalar(0.0), Scalar(0.0), Scalar(0.0), Scalar(1.1)}),
376  {Scalar(0.0), Scalar(0.0), Scalar(0.00001), Scalar(0)}),
378  {Scalar(0.0), Scalar(0.0), Scalar(0.00001), Scalar(0.00001)}),
380  {Scalar(0.5 * kPi<Scalar>), Scalar(0.9), Scalar(0.0), Scalar(0.0)}),
382  {Scalar(0.5 * kPi<Scalar> + 0.00001),
383  Scalar(0.0),
384  Scalar(0.0),
385  Scalar(0.9)}),
386  });
387  }
388 
389  static auto invalidParamsExamples() -> std::vector<Params> {
390  return std::vector<Params>({
391  Params::Zero(),
392  -Params::Ones(),
393  -Params::UnitX(),
394  });
395  }
396 };
397 
398 } // namespace lie
399 } // namespace sophus
rotation3.h
sim_mat_w.h
sophus::lie::SpiralSimilarity3Impl::dxLogThisInvTimesXAtThis
static auto dxLogThisInvTimesXAtThis(Params const &q) -> Eigen::Matrix< Scalar, kDof, kNumParams >
Definition: spiral_similarity3.h:335
sophus::lie::Rotation3Impl::matrix
static auto matrix(Params const &unit_quat) -> Eigen::Matrix< Scalar, kPointDim, kPointDim >
Definition: rotation3.h:267
sophus::lie::SpiralSimilarity3Impl::matrix
static auto matrix(Params const &non_zero_quat) -> Eigen::Matrix< Scalar, kPointDim, kPointDim >
Definition: spiral_similarity3.h:227
lie_group.h
sophus::lie::Rotation3Impl
Definition: rotation3.h:18
sophus::lie::SpiralSimilarity3Impl::Tangent
Eigen::Vector< Scalar, kDof > Tangent
Definition: spiral_similarity3.h:37
sophus::lie::SpiralSimilarity3Impl::kIsOriginPreserving
static constexpr bool kIsOriginPreserving
Definition: spiral_similarity3.h:25
sophus::lie::SpiralSimilarity3Impl::adjOfTranslation
static auto adjOfTranslation(Params const &quat, Point const &point) -> Eigen::Matrix< Scalar, kPointDim, kDof >
Definition: spiral_similarity3.h:253
sophus::lie::SpiralSimilarity3Impl::Point
Eigen::Vector< Scalar, kPointDim > Point
Definition: spiral_similarity3.h:39
sophus::lie::SpiralSimilarity3Impl::action
static auto action(Params const &non_zero_quat, Eigen::Vector< TCompatibleScalar, kPointDim > const &point) -> PointReturn< TCompatibleScalar >
Definition: spiral_similarity3.h:162
sophus::lie::SpiralSimilarity3Impl::dxExpX
static auto dxExpX(Tangent const &a) -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: spiral_similarity3.h:281
sophus::lie::SpiralSimilarity3Impl::areParamsValid
static auto areParamsValid(Params const &non_zero_quat) -> sophus::Expected< Success >
Definition: spiral_similarity3.h:63
sophus::lie::Rotation3Impl::hat
static auto hat(Tangent const &omega) -> Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim >
Definition: rotation3.h:164
sophus::UnitVector
Definition: lie_group.h:14
sophus::lie::SpiralSimilarity3Impl::matVInverse
static auto matVInverse(Params const &non_zero_quat, Tangent const &angle_logscale) -> Eigen::Matrix< Scalar, kPointDim, kPointDim >
Definition: spiral_similarity3.h:243
sophus::lie::SpiralSimilarity3Impl::invalidParamsExamples
static auto invalidParamsExamples() -> std::vector< Params >
Definition: spiral_similarity3.h:389
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::min
auto min(TPoint const &a, TPoint const &b) -> TPoint
Definition: vector_space.h:104
sophus::lie::SpiralSimilarity3Impl::dxExpXTimesPointAt0
static auto dxExpXTimesPointAt0(Point const &point) -> Eigen::Matrix< Scalar, kPointDim, kDof >
Definition: spiral_similarity3.h:302
sophus::lie::SpiralSimilarity3Impl::kDof
static const int kDof
Definition: spiral_similarity3.h:32
quaternion.h
sophus::lie::Rotation3Impl::hasShortestPathAmbiguity
static auto hasShortestPathAmbiguity(Params const &foo_from_bar) -> bool
Definition: rotation3.h:78
sophus::QuaternionImpl::conjugate
static auto conjugate(Eigen::Vector< Scalar, 4 > const &a) -> Eigen::Vector< Scalar, 4 >
Definition: quaternion.h:77
sophus::lie::SpiralSimilarity3Impl::adj
static auto adj(Params const &non_zero_quat) -> Eigen::Matrix< Scalar, kDof, kDof >
Definition: spiral_similarity3.h:184
sophus::lie::SpiralSimilarity3Impl::kAmbientDim
static const int kAmbientDim
Definition: spiral_similarity3.h:35
sophus::lie::SpiralSimilarity3Impl::multiplication
static auto multiplication(Params const &lhs_params, Eigen::Vector< TCompatibleScalar, kNumParams > const &rhs_params) -> ParamsReturn< TCompatibleScalar >
Definition: spiral_similarity3.h:138
sophus::lie::SpiralSimilarity3Impl::ParamsReturn
Eigen::Vector< ScalarReturn< TCompatibleScalar >, kNumParams > ParamsReturn
Definition: spiral_similarity3.h:47
sophus::lie::SpiralSimilarity3Impl::kIisSizePreserving
static constexpr bool kIisSizePreserving
Definition: spiral_similarity3.h:29
sophus::lie::SpiralSimilarity3Impl::identityParams
static auto identityParams() -> Params
Definition: spiral_similarity3.h:58
sophus::lie::SpiralSimilarity3Impl::kPointDim
static const int kPointDim
Definition: spiral_similarity3.h:34
sophus::lie::SpiralSimilarity3Impl::paramsExamples
static auto paramsExamples() -> std::vector< Params >
Definition: spiral_similarity3.h:367
sophus::lie::SpiralSimilarity3Impl::inverse
static auto inverse(Params const &non_zero_quat) -> Params
Definition: spiral_similarity3.h:131
sophus::lie::SpiralSimilarity3Impl::exp
static auto exp(Tangent const &omega_logscale) -> Params
Definition: spiral_similarity3.h:87
sophus::lie::SpiralSimilarity3Impl::hat
static auto hat(Tangent const &omega_logscale) -> Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim >
Definition: spiral_similarity3.h:115
sophus::lie::SpiralSimilarity3Impl::dxExpXAt0
static auto dxExpXAt0() -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: spiral_similarity3.h:297
sophus::lie::SpiralSimilarity3Impl::kNumParams
static const int kNumParams
Definition: spiral_similarity3.h:33
SOPHUS_UNEXPECTED
#define SOPHUS_UNEXPECTED(...)
Definition: common.h:57
sophus::lie::SpiralSimilarity3Impl::ScalarReturn
typename Eigen::ScalarBinaryOpTraits< Scalar, TCompatibleScalar >::ReturnType ScalarReturn
Definition: spiral_similarity3.h:43
sophus::lie::SpiralSimilarity3Impl::log
static auto log(Params const &non_zero_quat) -> Tangent
Definition: spiral_similarity3.h:104
sophus::lie::SpiralSimilarity3Impl::kIsShapePreserving
static constexpr bool kIsShapePreserving
Definition: spiral_similarity3.h:28
sophus::lie::SpiralSimilarity3Impl::toAmbient
static auto toAmbient(Point const &point) -> Eigen::Vector< Scalar, kAmbientDim >
Definition: spiral_similarity3.h:179
unit_vector.h
sophus::lie::Rotation3Impl::log
static auto log(Params const &unit_quaternion) -> Tangent
Definition: rotation3.h:119
sophus::lie::SpiralSimilarity3Impl::dxThisMulExpXAt0
static auto dxThisMulExpXAt0(Params const &non_zero_quat) -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: spiral_similarity3.h:309
sophus::lie::SpiralSimilarity3Impl::adOfTranslation
static auto adOfTranslation(Point const &point) -> Eigen::Matrix< Scalar, kPointDim, kDof >
Definition: spiral_similarity3.h:263
sophus::lie::SpiralSimilarity3Impl::ad
static auto ad(Tangent const &tangent) -> Eigen::Matrix< Scalar, kDof, kDof >
Definition: spiral_similarity3.h:273
sophus::lie::Rotation3Impl::exp
static auto exp(Tangent const &omega) -> Params
Definition: rotation3.h:87
sophus::UnitVector::fromParams
static auto fromParams(Eigen::Matrix< TScalar, kN, 1 > const &v) -> UnitVector
Definition: unit_vector.h:166
sophus::lie::SpiralSimilarity3Impl::compactMatrix
static auto compactMatrix(Params const &non_zero_quat) -> Eigen::Matrix< Scalar, kPointDim, kPointDim >
Definition: spiral_similarity3.h:195
sophus::QuaternionImpl
Definition: quaternion.h:17
sophus::lie::SpiralSimilarity3Impl::kIsDirectionVectorPreserving
static constexpr bool kIsDirectionVectorPreserving
Definition: spiral_similarity3.h:27
sophus::lie::SpiralSimilarity3Impl::Scalar
TScalar Scalar
Definition: spiral_similarity3.h:22
sophus::lie::SpiralSimilarity3Impl::action
static auto action(Params const &non_zero_quat, UnitVector< TCompatibleScalar, kPointDim > const &direction_vector) -> UnitVectorReturn< TCompatibleScalar >
Definition: spiral_similarity3.h:170
sophus::lie::SpiralSimilarity3Impl
Definition: spiral_similarity3.h:20
sophus::lie::SpiralSimilarity3Impl::hasShortestPathAmbiguity
static auto hasShortestPathAmbiguity(Params const &non_zero_quat) -> bool
Definition: spiral_similarity3.h:80
sophus::lie::SpiralSimilarity3Impl::kIisParallelLinePreserving
static constexpr bool kIisParallelLinePreserving
Definition: spiral_similarity3.h:30
sophus::max
auto max(TPoint const &a, TPoint const &b) -> TPoint
Definition: vector_space.h:114
sophus::lie::Rotation3Impl::dxExpX
static auto dxExpX(Tangent const &omega) -> Eigen::Matrix< Scalar, kNumParams, kDof >
Definition: rotation3.h:335
sophus::QuaternionImpl::multiplication
static auto multiplication(Eigen::Vector< Scalar, 4 > const &lhs, Eigen::Vector< TCompatibleScalar, 4 > const &rhs) -> ParamsReturn< TCompatibleScalar >
Definition: quaternion.h:55
sophus::lie::SpiralSimilarity3Impl::kIsAxisDirectionPreserving
static constexpr bool kIsAxisDirectionPreserving
Definition: spiral_similarity3.h:26
sophus::lie::SpiralSimilarity3Impl::tangentExamples
static auto tangentExamples() -> std::vector< Tangent >
Definition: spiral_similarity3.h:350
sophus::lie::SpiralSimilarity3Impl::Params
Eigen::Vector< Scalar, kNumParams > Params
Definition: spiral_similarity3.h:38
sophus::lie::SpiralSimilarity3Impl::PointReturn
Eigen::Vector< ScalarReturn< TCompatibleScalar >, kPointDim > PointReturn
Definition: spiral_similarity3.h:50
sophus::lie::SpiralSimilarity3Impl::vee
static auto vee(Eigen::Matrix< Scalar, kAmbientDim, kAmbientDim > const &mat) -> Eigen::Matrix< Scalar, kDof, 1 >
Definition: spiral_similarity3.h:123
sophus::lie::SpiralSimilarity3Impl::matV
static auto matV(Params const &, Tangent const &angle_logscale) -> Eigen::Matrix< Scalar, kPointDim, kPointDim >
Definition: spiral_similarity3.h:233