farm-ng-core
vector_manifold.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/common.h"
14 
15 namespace sophus {
16 
17 template <class TScalar, int kDim>
19  using Scalar = TScalar;
20  static int constexpr kDof = kDim;
21  static int constexpr kNumParams = kDim;
22 
23  using Params = Eigen::Vector<TScalar, kDim>;
24  using Tangent = Params;
25 
26  VectorManifold() { vec.setZero(); }
27 
29 
30  auto oplus(Tangent const& a) const -> VectorManifold {
31  return VectorManifold(this->vec + a);
32  }
33 
34  auto ominus(VectorManifold const& other) const -> Tangent {
35  return this->vec - other.params();
36  }
37 
38  static auto fromParams(Params const& params) -> VectorManifold {
39  return VectorManifold(params);
40  }
41 
42  auto setParams(Params const& params) -> void { vec = params; }
43 
44  auto params() const -> Params const& { return vec; }
45 
46  auto ptr() const -> Scalar const* { return vec.data(); }
47 
48  auto unsafeMutPtr() -> Scalar* { return vec.data(); }
49 
50  static auto tangentExamples() -> std::vector<Tangent> {
51  return pointExamples<Scalar, kDim>();
52  }
53 
54  template <concepts::Range TSequenceContainer>
55  static auto average(TSequenceContainer const& range)
56  -> std::optional<VectorManifold> {
57  size_t const len = std::distance(std::begin(range), std::end(range));
58  SOPHUS_ASSERT_GE(len, 0);
59 
60  Params params = Params::Zero();
61  for (auto const& m : range) {
62  params += m.params();
63  }
64  return VectorManifold(params / len);
65  }
66 
68 };
69 
70 } // namespace sophus
SOPHUS_ASSERT_GE
#define SOPHUS_ASSERT_GE(...)
Definition: common.h:42
sophus::VectorManifold
Definition: vector_manifold.h:18
sophus::VectorManifold::ominus
auto ominus(VectorManifold const &other) const -> Tangent
Definition: vector_manifold.h:34
manifold.h
sophus::VectorManifold::vec
Params vec
Definition: vector_manifold.h:67
sophus::VectorManifold::params
auto params() const -> Params const &
Definition: vector_manifold.h:44
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::VectorManifold::VectorManifold
VectorManifold(Params const &vec)
Definition: vector_manifold.h:28
sophus::VectorManifold::Scalar
TScalar Scalar
Definition: vector_manifold.h:19
sophus::VectorManifold::VectorManifold
VectorManifold()
Definition: vector_manifold.h:26
sophus::VectorManifold::oplus
auto oplus(Tangent const &a) const -> VectorManifold
Definition: vector_manifold.h:30
sophus::VectorManifold::kNumParams
static constexpr int kNumParams
Definition: vector_manifold.h:21
sophus::VectorManifold::kDof
static constexpr int kDof
Definition: vector_manifold.h:20
sophus::VectorManifold::Params
Eigen::Vector< TScalar, kDim > Params
Definition: vector_manifold.h:23
sophus::VectorManifold::fromParams
static auto fromParams(Params const &params) -> VectorManifold
Definition: vector_manifold.h:38
sophus::VectorManifold::average
static auto average(TSequenceContainer const &range) -> std::optional< VectorManifold >
Definition: vector_manifold.h:55
common.h
sophus::VectorManifold::setParams
auto setParams(Params const &params) -> void
Definition: vector_manifold.h:42
sophus::VectorManifold::tangentExamples
static auto tangentExamples() -> std::vector< Tangent >
Definition: vector_manifold.h:50
sophus::VectorManifold::unsafeMutPtr
auto unsafeMutPtr() -> Scalar *
Definition: vector_manifold.h:48
sophus::VectorManifold::Tangent
Params Tangent
Definition: vector_manifold.h:24
sophus::VectorManifold::ptr
auto ptr() const -> Scalar const *
Definition: vector_manifold.h:46
vector_space.h