29#include <gtsam/base/VectorSpace.h>
75 template <
typename Dynamics>
76 using enable_if_dynamics =
77 std::enable_if_t<!std::is_convertible_v<Dynamics, TangentVector> &&
85 template <
typename Control,
typename Dynamics>
86 using enable_if_full_dynamics = std::enable_if_t<
87 std::is_invocable_r_v<
TangentVector, Dynamics,
const G&,
const Control&,
90 template <
typename T,
typename =
void>
91 struct has_adjoint_map : std::false_type {};
94 struct has_adjoint_map<
95 T,
std::void_t<decltype(T::adjointMap(
96 std::declval<typename traits<T>::TangentVector>()))>>
106 static_assert(IsLieGroup<G>::value,
107 "Template parameter G must be a GTSAM Lie Group");
125 template <
size_t K = 1>
127 double dt,
const G& U,
const Jacobian& Dexp)
const {
128 if constexpr (std::is_same_v<G, Matrix>) {
132 return expm(Df * dt, K);
134 if constexpr (K == 1) {
162 has_adjoint_map<G>::value,
163 "transitionMatrix<K> requires G::adjointMap(xi) when K > 1.");
165 const Matrix A = Df - ad_xi;
166 return expm(A * dt, K);
186 template <
size_t K = 1,
typename Dynamics,
187 typename = enable_if_dynamics<Dynamics>>
193 if constexpr (std::is_same_v<G, Matrix>) {
194 *Phi =
expm(Df * dt, K);
198 G U = traits<G>::Expmap(xi * dt, &Dexp);
200 return traits<G>::Compose(this->
X_, U);
204 if constexpr (std::is_same_v<G, Matrix>) {
205 return traits<G>::Retract(this->
X_, xi * dt);
207 G U = traits<G>::Expmap(xi * dt);
208 return traits<G>::Compose(this->
X_, U);
226 template <
size_t K = 1,
typename Dynamics,
227 typename = enable_if_dynamics<Dynamics>>
230 if constexpr (
Dim == Eigen::Dynamic) {
231 Phi.resize(this->
n_, this->
n_);
254 template <
size_t K = 1,
typename Control,
typename Dynamics,
255 typename = enable_if_full_dynamics<Control, Dynamics>>
278 template <
size_t K = 1,
typename Control,
typename Dynamics,
279 typename = enable_if_full_dynamics<Control, Dynamics>>
308 if constexpr (std::is_same_v<G, Matrix>) {
309 const Matrix& I_n = this->
I_;
310 A_local = I_n + J_UX;
314 this->
X_ = this->
X_.compose(U);
316 this->
P_ = A_local * this->
P_ * A_local.transpose() + Q;
Base class and basic functions for Lie types.
Extended Kalman Filter base class on a generic manifold M.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
Matrix expm(const Matrix &A, size_t K)
Numerical exponential map, naive approach, not industrial strength !
Definition Matrix.cpp:587
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition Group.h:37
OptionalJacobian is an Eigen::Ref like class that can take be constructed using either a fixed size o...
Definition OptionalJacobian.h:40
G predictMean(Dynamics &&f, double dt, OptionalJacobian< Dim, Dim > Phi={}) const
Predict mean and Jacobian Phi with state-dependent dynamics: xi = f(X_k, Df) (tangent vector dynamics...
Definition LieGroupEKF.h:188
ManifoldEKF< G > Base
Base class type.
Definition LieGroupEKF.h:63
void predict(Dynamics &&f, const Control &u, double dt, const Covariance &Q)
Predict step with state and control input dynamics: Wraps the dynamics function and calls the state-o...
Definition LieGroupEKF.h:280
G predictMean(Dynamics &&f, const Control &u, double dt, OptionalJacobian< Dim, Dim > Phi={}) const
Predict mean and Jacobian A with state and control input dynamics: Wraps the dynamics function and ca...
Definition LieGroupEKF.h:256
typename Base::TangentVector TangentVector
Tangent vector type.
Definition LieGroupEKF.h:68
void predict(Dynamics &&f, double dt, const Covariance &Q)
Predict step with state-dependent dynamics: Uses predictMean to compute X_{k+1} and Phi,...
Definition LieGroupEKF.h:228
Jacobian transitionMatrix(const TangentVector &xi, const Jacobian &Df, double dt, const G &U, const Jacobian &Dexp) const
Compute the discrete-time transition matrix Φ corresponding to a continuous-time linearization (Df) o...
Definition LieGroupEKF.h:126
typename Base::Jacobian Jacobian
Dim x Dim.
Definition LieGroupEKF.h:66
static constexpr int Dim
Compile-time dimension of G.
Definition LieGroupEKF.h:64
typename Base::Covariance Covariance
Dim x Dim.
Definition LieGroupEKF.h:67
void predictWithCompose(const G &U, const Jacobian &J_UX, const Covariance &Q)
Predict using a precomputed group increment U and its Jacobian J_UX.
Definition LieGroupEKF.h:305
LieGroupEKF(const G &X0, const Covariance &P0)
Constructor: initialize with state and covariance.
Definition LieGroupEKF.h:105
void update(const Measurement &prediction, const Eigen::Matrix< double, traits< Measurement >::dimension, Dim > &H, const Measurement &z, const Eigen::Matrix< double, traits< Measurement >::dimension, traits< Measurement >::dimension > &R, bool performReset=true)
Definition ManifoldEKF.h:156
Eigen::Matrix< double, Dim, Dim > Covariance
Definition ManifoldEKF.h:58
Jacobian I_
Definition ManifoldEKF.h:286
static constexpr int Dim
Definition ManifoldEKF.h:53
G X_
Definition ManifoldEKF.h:284
Eigen::Matrix< double, Dim, Dim > Jacobian
Definition ManifoldEKF.h:60
ManifoldEKF(const G &X0, const Covariance &P0)
Definition ManifoldEKF.h:67
Covariance P_
Definition ManifoldEKF.h:285
typename traits< G >::TangentVector TangentVector
Definition ManifoldEKF.h:56
size_t n_
Definition ManifoldEKF.h:287
void predict(const G &X_next, const Jacobian &F, const Covariance &Q)
Definition ManifoldEKF.h:114