LieGroupEKF.h
Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
25 #pragma once
26 
27 #include <gtsam/navigation/ManifoldEKF.h> // Include the base class
28 #include <gtsam/base/Lie.h> // Include for Lie group traits and operations
29 
30 #include <Eigen/Dense>
31 #include <type_traits>
32 #include <functional> // For std::function
33 
34 namespace gtsam {
35 
48  template <typename G>
49  class LieGroupEKF : public ManifoldEKF<G> {
50  public:
51  using Base = ManifoldEKF<G>;
52  static constexpr int Dim = Base::Dim;
54  using Jacobian = typename Base::Jacobian; // Eigen::Matrix<double, Dim, Dim>
56  using Covariance = typename Base::Covariance; // Eigen::Matrix<double, Dim, Dim>
57 
63  LieGroupEKF(const G& X0, const Covariance& P0) : Base(X0, P0) {
64  static_assert(IsLieGroup<G>::value, "Template parameter G must be a GTSAM Lie Group");
65  }
66 
72  template <typename Dynamics>
74  !std::is_convertible_v<Dynamics, TangentVector>&&
75  std::is_invocable_r_v<TangentVector, Dynamics, const G&,
77 
91  template <typename Dynamics, typename = enable_if_dynamics<Dynamics>>
92  G predictMean(Dynamics&& f, double dt, OptionalJacobian<Dim, Dim> A = {}) const {
93  Jacobian Df, Dexp; // Eigen::Matrix<double, Dim, Dim>
94 
95  if constexpr (std::is_same_v<G, Matrix>) {
96  // Specialize to Matrix case as its Expmap is not defined.
97  TangentVector xi = f(this->X_, A ? &Df : nullptr);
98  const Matrix nextX = traits<Matrix>::Retract(this->X_, xi * dt, A ? &Dexp : nullptr); // just addition
99  if (A) {
100  const Matrix I_n = Matrix::Identity(this->n_, this->n_);
101  *A = I_n + Dexp * Df * dt; // AdjointMap is always identity for Matrix
102  }
103  return nextX;
104  }
105  else {
106  TangentVector xi = f(this->X_, A ? &Df : nullptr); // xi and Df = d(xi)/d(localX)
107  G U = traits<G>::Expmap(xi * dt, A ? &Dexp : nullptr);
108  if (A) {
109  // State transition Jacobian for left-invariant EKF:
110  *A = traits<G>::Inverse(U).AdjointMap() + Dexp * Df * dt;
111  }
112  return this->X_.compose(U);
113  }
114  }
115 
116 
128  template <typename Dynamics, typename = enable_if_dynamics<Dynamics>>
129  void predict(Dynamics&& f, double dt, const Covariance& Q) {
130  Jacobian A;
131  if constexpr (Dim == Eigen::Dynamic) {
132  A.resize(this->n_, this->n_);
133  }
134  this->X_ = predictMean(std::forward<Dynamics>(f), dt, A);
135  this->P_ = A * this->P_ * A.transpose() + Q;
136  }
137 
142  template<typename Control, typename Dynamics>
144  std::is_invocable_r_v<TangentVector, Dynamics, const G&, const Control&, OptionalJacobian<Dim, Dim>&>
145  >;
146 
160  template <typename Control, typename Dynamics, typename = enable_if_full_dynamics<Control, Dynamics>>
161  G predictMean(Dynamics&& f, const Control& u, double dt, OptionalJacobian<Dim, Dim> A = {}) const {
162  return predictMean([&](const G& X, OptionalJacobian<Dim, Dim> Df) { return f(X, u, Df); }, dt, A);
163  }
164 
165 
178  template <typename Control, typename Dynamics, typename = enable_if_full_dynamics<Control, Dynamics>>
179  void predict(Dynamics&& f, const Control& u, double dt, const Covariance& Q) {
180  return predict([&](const G& X, OptionalJacobian<Dim, Dim> Df) { return f(X, u, Df); }, dt, Q);
181  }
182 
183  }; // LieGroupEKF
184 
185 } // namespace gtsam
gtsam::LieGroupEKF::predictMean
G predictMean(Dynamics &&f, double dt, OptionalJacobian< Dim, Dim > A={}) const
Definition: LieGroupEKF.h:92
gtsam::ManifoldEKF< G >::n_
int n_
Runtime tangent space dimension of M.
Definition: ManifoldEKF.h:255
gtsam::ManifoldEKF< G >::TangentVector
typename traits< G >::TangentVector TangentVector
Tangent vector type for the manifold M.
Definition: ManifoldEKF.h:71
ManifoldEKF.h
Extended Kalman Filter base class on a generic manifold M.
screwPose2::xi
Vector xi
Definition: testPose2.cpp:169
gtsam::LieGroupEKF::Covariance
typename Base::Covariance Covariance
Definition: LieGroupEKF.h:56
gtsam::ManifoldEKF< G >::Jacobian
Eigen::Matrix< double, Dim, Dim > Jacobian
State transition Jacobian type (F).
Definition: ManifoldEKF.h:75
gtsam::LieGroupEKF::predict
void predict(Dynamics &&f, const Control &u, double dt, const Covariance &Q)
Definition: LieGroupEKF.h:179
dt
const double dt
Definition: testVelocityConstraint.cpp:15
gtsam::ManifoldEKF< G >::X_
G X_
Manifold state estimate.
Definition: ManifoldEKF.h:253
gtsam::Matrix
Eigen::MatrixXd Matrix
Definition: base/Matrix.h:39
X
#define X
Definition: icosphere.cpp:20
Q
Quaternion Q
Definition: testQuaternion.cpp:27
gtsam::ManifoldEKF< G >::Covariance
Eigen::Matrix< double, Dim, Dim > Covariance
Covariance matrix type (P, Q).
Definition: ManifoldEKF.h:73
Expmap
Pose2_ Expmap(const Vector3_ &xi)
Definition: InverseKinematicsExampleExpressions.cpp:47
A
Definition: test_numpy_dtypes.cpp:300
gtsam::LieGroupEKF::predictMean
G predictMean(Dynamics &&f, const Control &u, double dt, OptionalJacobian< Dim, Dim > A={}) const
Definition: LieGroupEKF.h:161
gtsam::LieGroupEKF
Extended Kalman Filter on a Lie group G, derived from ManifoldEKF.
Definition: LieGroupEKF.h:49
gtsam::LieGroupEKF::TangentVector
typename Base::TangentVector TangentVector
Definition: LieGroupEKF.h:53
gtsam::ManifoldEKF< G >::P_
Covariance P_
Covariance (Eigen::Matrix<double, Dim, Dim>).
Definition: ManifoldEKF.h:254
Eigen::Dynamic
const int Dynamic
Definition: Constants.h:22
gtsam::IsLieGroup
Definition: Lie.h:287
gtsam::LieGroupEKF::LieGroupEKF
LieGroupEKF(const G &X0, const Covariance &P0)
Definition: LieGroupEKF.h:63
gtsam::LieGroupEKF::predict
void predict(Dynamics &&f, double dt, const Covariance &Q)
Definition: LieGroupEKF.h:129
gtsam::LieGroupEKF::Jacobian
typename Base::Jacobian Jacobian
Jacobian for group operations (Adjoint, Expmap derivatives, F).
Definition: LieGroupEKF.h:55
tree::f
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
Definition: testExpression.cpp:218
Eigen::Quaternion
The quaternion class used to represent 3D orientations and rotations.
Definition: ForwardDeclarations.h:293
gtsam::ManifoldEKF
Extended Kalman Filter on a generic manifold M.
Definition: ManifoldEKF.h:65
Lie.h
Base class and basic functions for Lie types.
gtsam::LieGroupEKF::enable_if_dynamics
std::enable_if_t< !std::is_convertible_v< Dynamics, TangentVector > &&std::is_invocable_r_v< TangentVector, Dynamics, const G &, OptionalJacobian< Dim, Dim > & > > enable_if_dynamics
Definition: LieGroupEKF.h:76
gtsam
traits
Definition: ABC.h:17
gtsam::traits
Definition: Group.h:36
gtsam::OptionalJacobian
Definition: OptionalJacobian.h:38
gtsam::LieGroupEKF::Dim
static constexpr int Dim
Compile-time dimension of G.
Definition: LieGroupEKF.h:52
G
JacobiRotation< float > G
Definition: Jacobi_makeGivens.cpp:2
gtsam::ManifoldEKF< G >::Dim
static constexpr int Dim
Compile-time dimension of the manifold M.
Definition: ManifoldEKF.h:68
U
@ U
Definition: testDecisionTree.cpp:342
gtsam::LieGroupEKF::enable_if_full_dynamics
std::enable_if_t< std::is_invocable_r_v< TangentVector, Dynamics, const G &, const Control &, OptionalJacobian< Dim, Dim > & > > enable_if_full_dynamics
Definition: LieGroupEKF.h:145
P0
static double P0[5]
Definition: ndtri.c:59
enable_if_t
typename std::enable_if< B, T >::type enable_if_t
from cpp_future import (convenient aliases from C++14/17)
Definition: wrap/pybind11/include/pybind11/detail/common.h:673


gtsam
Author(s):
autogenerated on Wed May 28 2025 03:01:42