farm-ng-core
group_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 
12 #include "sophus/lie/lie_group.h"
13 
14 namespace sophus {
15 SOPHUS_ENUM(ManifoldPlusType, (left_plus, right_plus));
16 
17 template <concepts::LieGroup TGroup, ManifoldPlusType kPlus>
18 struct GroupManifold {
19  using Group = TGroup;
20  using Tangent = typename TGroup::Tangent;
21  using Params = typename Group::Params;
22  using Scalar = typename TGroup::Scalar;
23  static int constexpr kDof = TGroup::kDof;
24  static int constexpr kNumParams = TGroup::kNumParams;
25 
26  // Constructor
27 
28  GroupManifold() = default;
29  GroupManifold(GroupManifold const& g) = default;
30  GroupManifold& operator=(GroupManifold const& g) = default;
31 
32  GroupManifold(Group const& g) : group(g) {}
33 
34  static auto fromParams(Params const& params) -> GroupManifold {
35  return GroupManifold(Group::fromParams(params));
36  }
37 
38  auto setParams(Params const& params) -> void { group.setParams(params); }
39 
40  auto unsafeMutPtr() -> Scalar* { return group.unsafeMutPtr(); }
41 
42  auto ptr() -> Scalar const* { return group.ptr(); }
43 
44  // oplus (either "left translation" or "right translation")
45  auto oplus(Tangent const& a) const -> GroupManifold {
46  if constexpr (kPlus == ManifoldPlusType::left_plus) {
47  return group.leftPlus(a);
48  } else {
49  return group.rightPlus(a);
50  }
51  }
52 
53  // ominus (inverse operation of oplus, corresponding to the logarithm map)
54  auto ominus(GroupManifold const& h) const -> Tangent {
55  if constexpr (kPlus == ManifoldPlusType::left_plus) {
56  return group.leftMinus(h.group);
57  } else {
58  return group.rightMinus(h.group);
59  }
60  }
61 
62  static auto tangentExamples() -> std::vector<Tangent> {
63  return Group::tangentExamples();
64  }
65 
66  auto params() const -> Params const& { return group.params(); }
67 
68  template <concepts::Range TSequenceContainer>
69  static auto average(TSequenceContainer const& range)
70  -> std::optional<GroupManifold> {
71  std::vector<Group> groups;
72  for (auto const& m : range) {
73  groups.push_back(m.group);
74  }
75 
76  auto maybe_mean = sophus::average(groups);
77  if (maybe_mean) {
78  return GroupManifold(*maybe_mean);
79  }
80  return std::nullopt;
81  }
82 
84 };
85 
86 template <concepts::LieGroup TGroup>
88 
89 template <concepts::LieGroup TGroup>
91 
92 } // namespace sophus
sophus::GroupManifold::Params
typename Group::Params Params
Definition: group_manifold.h:21
sophus::average
auto average(TSequenceContainer const &foo_from_bar_transforms) -> std::enable_if_t< std::is_same< typename TSequenceContainer::value_type, Translation< TScalar, kPointDim > >::value, std::optional< typename TSequenceContainer::value_type > >
Definition: average.h:81
sophus::GroupManifold
Definition: group_manifold.h:18
sophus::GroupManifold::setParams
auto setParams(Params const &params) -> void
Definition: group_manifold.h:38
sophus::GroupManifold::group
Group group
Definition: group_manifold.h:83
sophus::GroupManifold::oplus
auto oplus(Tangent const &a) const -> GroupManifold
Definition: group_manifold.h:45
sophus::GroupManifold::params
auto params() const -> Params const &
Definition: group_manifold.h:66
sophus
Image MutImage, owning images types.
Definition: num_diff.h:20
sophus::GroupManifold::kNumParams
static constexpr int kNumParams
Definition: group_manifold.h:24
sophus::GroupManifold::fromParams
static auto fromParams(Params const &params) -> GroupManifold
Definition: group_manifold.h:34
average.h
sophus::GroupManifold::ominus
auto ominus(GroupManifold const &h) const -> Tangent
Definition: group_manifold.h:54
sophus::GroupManifold::tangentExamples
static auto tangentExamples() -> std::vector< Tangent >
Definition: group_manifold.h:62
sophus::GroupManifold::unsafeMutPtr
auto unsafeMutPtr() -> Scalar *
Definition: group_manifold.h:40
sophus::GroupManifold::Tangent
typename TGroup::Tangent Tangent
Definition: group_manifold.h:20
sophus::GroupManifold::GroupManifold
GroupManifold(Group const &g)
Definition: group_manifold.h:32
sophus::GroupManifold::kDof
static constexpr int kDof
Definition: group_manifold.h:23
sophus::GroupManifold::average
static auto average(TSequenceContainer const &range) -> std::optional< GroupManifold >
Definition: group_manifold.h:69
sophus::concepts::Tangent
concept Tangent
Definition: params.h:34
sophus::SOPHUS_ENUM
SOPHUS_ENUM(NumberType,(fixed_point, floating_point))
sophus::GroupManifold::GroupManifold
GroupManifold()=default
lie_group.h
sophus::GroupManifold::Scalar
typename TGroup::Scalar Scalar
Definition: group_manifold.h:22
sophus::GroupManifold::operator=
GroupManifold & operator=(GroupManifold const &g)=default
sophus::GroupManifold::ptr
auto ptr() -> Scalar const *
Definition: group_manifold.h:42
sophus::GroupManifold::Group
TGroup Group
Definition: group_manifold.h:19
sophus::concepts::Params
concept Params
Definition: params.h:41