49template <
typename M,
typename Symmetry>
61 using G =
typename Symmetry::Group;
66 using MatrixMG = Eigen::Matrix<double, DimM, DimG>;
67 using MatrixGM = Eigen::Matrix<double, DimG, DimM>;
71 typename Symmetry::Orbit act_on_ref_;
73 MatrixGM InnovationLift_;
94 act_on_ref_ =
typename Symmetry::Orbit(xi_ref_);
96 act_on_ref_(identity_at_g, &Dphi0_);
97 InnovationLift_ = Dphi0_.completeOrthogonalDecomposition().pseudoInverse();
99 if constexpr (DimM == Eigen::Dynamic) {
101 this->
I_ = MatrixM::Identity(this->
n_, this->
n_);
104 this->
X_ = act_on_ref_(g_);
114 template <
typename Lift,
typename InputOrbit>
117 Lift lift_u_origin(psi_u(g_.inverse()));
118 return lift_u_origin(xi_ref_, D_lift);
127 void propagate(
const TangentG& increment,
const MatrixM& Phi,
128 const CovarianceM& Qd) {
130 const G g_next = Symmetry::type == ActionType::Left
143 g_ = Symmetry::type == ActionType::Left
146 this->
X_ = act_on_ref_(g_);
159 : Base(xi_ref, Sigma), xi_ref_(xi_ref), act_on_ref_(xi_ref), g_(X0) {
162 act_on_ref_(identity_at_g, &Dphi0_);
165 InnovationLift_ = Dphi0_.completeOrthogonalDecomposition().pseudoInverse();
166 this->
X_ = act_on_ref_(g_);
185 if constexpr (MatrixM::RowsAtCompileTime == Eigen::Dynamic) {
186 J.resize(this->
n_, this->
n_);
188 const typename Symmetry::Diffeomorphism action_at_g(g_);
189 action_at_g(xi_ref_, &J);
204 return J * this->
P_ * J.transpose();
237 template <
typename Lift,
typename InputOrbit>
241 return Dphi0_ * D_lift;
251 template <
size_t K = 1>
253 if constexpr (K == 1) {
254 return this->
I_ + A * dt;
256 return MatrixM(
expm(A * dt, K));
282 template <
size_t K = 1,
typename Lift,
typename InputOrbit>
283 void predict(
const Lift& lift_u,
const InputOrbit& psi_u,
const MatrixM& Qc,
312 template <
size_t K = 1,
typename Lift>
314 const MatrixM& Qc,
double dt) {
315 const TangentG Lambda = lift_u(this->
state());
335 template <
typename Lift>
337 const CovarianceM& Qd,
double dt) {
353 template <
typename Measurement>
355 const Measurement& prediction,
357 const Measurement& z,
369 Eigen::Matrix<double, DimM, MeasDim> K = this->
KalmanGain(H, R);
373 TangentM delta_xi = -K * innovation;
376 TangentG delta_x = InnovationLift_ * delta_xi;
384 template <
typename Z,
typename Func>
388 static_assert(IsManifold<Z>::value,
389 "Template parameter Z must be a GTSAM Manifold.");
392 Z prediction = h(this->
X_, H);
398 const gtsam::Vector& z,
const Matrix& R) {
404 template <
typename InnovationLiftFn>
406 const gtsam::Vector& z,
const Matrix& R,
407 InnovationLiftFn&& innovationLift) {
412 const TangentM delta_xi = -K * innovation;
413 const TangentG delta_x = innovationLift(delta_xi);
typedef and functions to augment Eigen's MatrixXd
Group action concept and CRTP base class.
typedef and functions to augment Eigen's VectorXd
Extended Kalman Filter base class on a generic manifold M.
A non-templated config holding any types of Manifold-group elements.
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
MatrixM computeErrorDynamicsMatrix(const InputOrbit &psi_u) const
Compute the error dynamics matrix A (Automatic).
Definition EquivariantFilter.h:238
void predict(const Lift &lift_u, const InputOrbit &psi_u, const MatrixM &Qc, double dt)
Propagate the filter state (Automatic).
Definition EquivariantFilter.h:283
EquivariantFilter(const M &xi_ref, const CovarianceM &Sigma, const G &X0=traits< G >::Identity())
Initialize the Equivariant Filter.
Definition EquivariantFilter.h:157
const M & state() const
State on the manifold M is given by the base class.
Definition ManifoldEKF.h:92
void update(Func &&h, const Z &z, const Eigen::Matrix< double, traits< Z >::dimension, traits< Z >::dimension > &R)
Same API as ManifoldEKF for measurement update with model function.
Definition EquivariantFilter.h:385
void propagate(const TangentG &increment, const MatrixM &Phi, const CovarianceM &Qd)
Advance using a lift evaluated at the current estimate and propagate covariance with an already-discr...
Definition EquivariantFilter.h:127
void updateWithVector(const gtsam::Vector &prediction, const Matrix &H, const gtsam::Vector &z, const Matrix &R)
Same API as ManifoldEKF for measurement update with vector inputs.
Definition EquivariantFilter.h:397
void update(const Measurement &prediction, const Eigen::Matrix< double, traits< Measurement >::dimension, DimM > &H, const Measurement &z, const Eigen::Matrix< double, traits< Measurement >::dimension, traits< Measurement >::dimension > &R)
Measurement update: Corrects the state and covariance using a pre-calculated predicted measurement an...
Definition EquivariantFilter.h:354
CovarianceM covariance() const
Covariance in the tangent space at the current state.
Definition EquivariantFilter.h:202
MatrixM transitionMatrix(const MatrixM &A, double dt) const
Discretize continuous-time error dynamics δ̇ = A δ over dt.
Definition EquivariantFilter.h:252
const M & referenceState() const
Access current reference state used as the EqF chart origin.
Definition EquivariantFilter.h:108
TangentG liftAtOrigin(const InputOrbit &psi_u, OptionalJacobian< DimG, DimM > D_lift={}) const
Evaluate the lift at the reference with input u_origin = psi_u(X^-1).
Definition EquivariantFilter.h:115
MatrixM actionDifferential() const
Differential of the group action at the reference state.
Definition EquivariantFilter.h:183
void predictWithJacobian(const Lift &lift_u, const MatrixM &A, const MatrixM &Qc, double dt)
Propagate the filter state (Explicit).
Definition EquivariantFilter.h:313
void applyCorrection(const TangentG &delta_x)
Apply an innovation correction, which lives in error coordinates at the reference state,...
Definition EquivariantFilter.h:141
void predictWithTransition(const Lift &lift_u, const MatrixM &Phi, const CovarianceM &Qd, double dt)
Propagate with an already-discretized transition and process noise.
Definition EquivariantFilter.h:336
void updateWithVector(const gtsam::Vector &prediction, const Matrix &H, const gtsam::Vector &z, const Matrix &R, InnovationLiftFn &&innovationLift)
Vector measurement update using a custom innovation lift delta_x=f(delta_xi).
Definition EquivariantFilter.h:405
const G & groupEstimate() const
Definition EquivariantFilter.h:208
void resetReferenceAndGroup(const M &xi_ref, const CovarianceM &P, const G &g)
Synchronization hooks for derived filters with dynamic runtime structure.
Definition EquivariantFilter.h:88
const Base::Covariance & errorCovariance() const
errorCovariance that returns P_, on the equivariant filter error
Definition EquivariantFilter.h:173
auto KalmanGain(const HMatrix &H, const RMatrix &R) const
Kalman gain K = P H^T S^-1.
Definition ManifoldEKF.h:130
Eigen::Matrix< double, Dim, Dim > Covariance
Covariance matrix type (P, Q).
Definition ManifoldEKF.h:58
void validateInputs(const gtsam::Vector &prediction, const Matrix &H, const gtsam::Vector &z, const Matrix &R)
Validate inputs to update.
Definition ManifoldEKF.h:255
const M & state() const
Definition ManifoldEKF.h:92
Jacobian I_
Identity matrix sized to the state dimension.
Definition ManifoldEKF.h:286
static constexpr int Dim
Compile-time dimension of the manifold M.
Definition ManifoldEKF.h:53
M X_
Manifold state estimate.
Definition ManifoldEKF.h:284
Eigen::Matrix< double, Dim, Dim > Jacobian
State transition Jacobian type (F).
Definition ManifoldEKF.h:60
ManifoldEKF(const M &X0, const Covariance &P0)
Constructor: initialize with state and covariance.
Definition ManifoldEKF.h:67
void JosephUpdate(const GainMatrix &K, const HMatrix &H, const RMatrix &R)
Joseph-form covariance update in the current tangent space using a precomputed gain.
Definition ManifoldEKF.h:138
Covariance P_
Covariance (Eigen::Matrix<double, Dim, Dim>).
Definition ManifoldEKF.h:285
typename traits< M >::TangentVector TangentVector
Tangent vector type for the manifold M.
Definition ManifoldEKF.h:56
size_t n_
Runtime tangent space dimension of M.
Definition ManifoldEKF.h:287
void predict(const M &X_next, const Jacobian &F, const Covariance &Q)
Basic predict step: Updates state and covariance given the predicted next state and the state transit...
Definition ManifoldEKF.h:114