gtsam
Loading...
Searching...
No Matches
TangentLieGroup.h
Go to the documentation of this file.
1/* ----------------------------------------------------------------------------
2 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
3 * Atlanta, Georgia 30332-0415
4 * All Rights Reserved
5 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
6 * See LICENSE for the license information
7 * -------------------------------------------------------------------------- */
8
16
17#pragma once
18
20#include <gtsam/base/Lie.h>
21#include <gtsam/base/Testable.h>
22
23#include <iostream>
24#include <string>
25#include <type_traits>
26#include <utility>
27
28namespace gtsam {
29namespace internal {
30
36template <typename T, typename = void>
37struct TangentLieGroupHasAdjointMap : std::false_type {};
38template <typename T>
40 T, std::void_t<decltype(T::adjointMap(
41 std::declval<const typename traits<T>::TangentVector&>()))>>
42 : std::true_type {};
43
50template <typename G>
52 static constexpr bool available = false;
53 static constexpr bool expmapAvailable = false;
54};
55
56} // namespace internal
57
59template <typename G>
60struct AdjointAction : public GroupAction<AdjointAction<G>, G,
61 typename traits<G>::TangentVector> {
62 static constexpr ActionType type = ActionType::Left;
63 using TangentVector = typename traits<G>::TangentVector;
64 static constexpr int n = traits<G>::dimension;
66 "AdjointAction<G> requires G::adjointMap(TangentVector)");
67
68 TangentVector operator()(const G& g, const TangentVector& v,
70 OptionalJacobian<n, n> Hv = {}) const {
71 const typename traits<G>::Jacobian Ad = traits<G>::AdjointMap(g);
72 if (Hv) *Hv = Ad;
73 if (Hg) *Hg = -(Ad * G::adjointMap(v));
74 return Ad * v;
75 }
76
77 static typename traits<G>::Jacobian generator(const TangentVector& u) {
78 return G::adjointMap(u);
79 }
80};
81
93template <typename G>
94class TangentLieGroup
95 : public std::pair<G, typename traits<G>::TangentVector>,
96 public LieGroup<TangentLieGroup<G>,
97 internal::dimensionProduct(2, traits<G>::dimension)> {
98 GTSAM_CONCEPT_ASSERT(IsLieGroup<G>);
99 GTSAM_CONCEPT_ASSERT(IsTestable<G>);
100 static_assert(traits<G>::dimension != Eigen::Dynamic,
101 "TangentLieGroup requires a fixed-dimensional base group");
103 "TangentLieGroup requires G::adjointMap(TangentVector)");
104
105 private:
106 inline constexpr static int n = traits<G>::dimension;
107
108 public:
109 using This = TangentLieGroup<G>;
110 using Base = std::pair<G, typename traits<G>::TangentVector>;
111 using LieBase = LieGroup<This, internal::dimensionProduct(2, n)>;
112 using LieBase::Dim;
113 using LieBase::dimension;
114 using BaseTangent = typename traits<G>::TangentVector;
115 using BaseJacobian = typename traits<G>::Jacobian;
116 using TangentVector = typename LieBase::TangentVector;
117 using Jacobian = typename LieBase::Jacobian;
118 using ChartJacobian = typename LieBase::ChartJacobian;
119 using ChartAtOrigin = internal::ChartAtIdentity<This, dimension>;
121 using group_flavor = multiplicative_group_tag;
122
123 using LieBase::between;
124 using LieBase::compose;
125 using LieBase::expmap;
126 using LieBase::inverse;
127 using LieBase::logmap;
128
129 TangentLieGroup() : Base(traits<G>::Identity(), BaseTangent::Zero()) {}
130 TangentLieGroup(const G& g, const BaseTangent& v) : Base(g, v) {}
131 TangentLieGroup(const Base& base) : Base(base) {}
132
133 static TangentLieGroup Identity() { return TangentLieGroup(); }
134 constexpr size_t dim() const { return dimension; }
135
136 TangentLieGroup operator*(const TangentLieGroup& other) const;
137 TangentLieGroup inverse() const;
138 TangentLieGroup retract(const TangentVector& xi, ChartJacobian H1 = {},
139 ChartJacobian H2 = {}) const;
140 TangentVector localCoordinates(const TangentLieGroup& other,
141 ChartJacobian H1 = {},
142 ChartJacobian H2 = {}) const;
143
144 static TangentLieGroup Expmap(const TangentVector& xi, ChartJacobian H = {});
145 static TangentLieGroup Expmap(const Eigen::Ref<const BaseTangent>& u,
146 const Eigen::Ref<const BaseTangent>& v,
147 SplitJacobian H1 = {}, SplitJacobian H2 = {});
148 static TangentVector Logmap(const TangentLieGroup& p, ChartJacobian H = {});
149 static TangentVector LocalCoordinates(const TangentLieGroup& p,
150 ChartJacobian H = {}) {
151 return Logmap(p, H);
152 }
153
154 Jacobian AdjointMap() const;
155 static Jacobian adjointMap(const TangentVector& xi);
156
157 void print(const std::string& s = "") const;
158 bool equals(const TangentLieGroup& other, double tol = 1e-9) const {
159 return traits<G>::Equals(this->first, other.first, tol) &&
160 traits<BaseTangent>::Equals(this->second, other.second, tol);
161 }
162
163 private:
164 static std::pair<BaseTangent, BaseTangent> split(const TangentVector& xi);
165 static TangentVector join(const BaseTangent& u, const BaseTangent& v);
166 static Jacobian rightJacobian(const TangentVector& xi);
167};
168
169template <typename G>
170struct traits<TangentLieGroup<G>> : internal::LieGroup<TangentLieGroup<G>> {};
171
172} // namespace gtsam
173
Internal implementation of TangentLieGroup.
Concept check for values that can be used in unit tests.
Group action concept and CRTP base class.
Base class and basic functions for Lie types.
constexpr int dimensionProduct(int n, int m)
Multiply compile-time dimensions, propagating Eigen::Dynamic.
Definition Lie.h:51
STL namespace.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
ActionType
Enum to specify whether the action is a Left or Right action.
Definition GroupAction.h:30
Group operator syntax flavors.
Definition Group.h:34
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
GroupAction CRTP base class.
Definition GroupAction.h:236
Chart-at-origin adapter for LieGroup-derived classes with explicit instance retract/localCoordinates ...
Definition Lie.h:65
A CRTP helper class that implements Lie group methods Prerequisites: methods operator*,...
Definition Lie.h:114
static constexpr int Dim()
Definition Lie.h:121
TangentVector logmap(const This &g) const
Definition Lie.h:161
This expmap(const TangentVector &v) const
Definition Lie.h:155
std::enable_if_t< M !=Eigen::Dynamic, int > dim() const
Definition Lie.h:125
Both LieGroupTraits and Testable.
Definition Lie.h:346
Lie Group Concept.
Definition Lie.h:377
OptionalJacobian is an Eigen::Ref like class that can take be constructed using either a fixed size o...
Definition OptionalJacobian.h:40
Enforces the static algebra-adjoint requirement of TangentLieGroup and AdjointAction below.
Definition TangentLieGroup.h:37
Optional closed-form kernels used by TangentLieGroup::Expmap() and its private rightJacobian() helper...
Definition TangentLieGroup.h:51
The adjoint action phi(g,v) = Ad_g v, also useful independently.
Definition TangentLieGroup.h:61
Tangent Lie group TG = G ⋉ 𝔤, with dimension 2 dim(G).
Definition TangentLieGroup.h:97
A testable concept check that should be placed in applicable unit tests and in generic algorithms.
Definition Testable.h:59