Skip to content

Conversation

jenniferoum
Copy link
Contributor

Updates to template equivariant filter on group and manifold

  • Also template on geometry structure to allow functions to be called in EquivariantFilter.h
  • Reorganize files:
    • ABC.h contains geometry specific definitions
    • EquivariantFilter.h contains fitler specific functions
    • Renamed ABC_EQF_Demo to AbbcEquivariantFilterExample.cpp

Copy link
Member

@dellaert dellaert left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice progress! Some initial comments.

…equire for template, change EqF to take in initial state, use traits for group
@jenniferoum jenniferoum force-pushed the feature/equivariant-filter branch from 73215df to 4ee2efe Compare July 30, 2025 17:20
* @param Sigma Initial covariance
* @param m Number of sensors
*/
EqF(const G& X0, const M& x0, const Matrix& Sigma, int m);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

X0 and x0 are related by x0 = \phi(X0, ref), and if it's an action, we can always get X0 from this. So I think: we need to give 2 M thingies: x0, and ref. X0 is derived.

Because the state is defined on the manifold, the user will want to specify the initial state on the manifold. And, more often than not, they will initialize the filter at the reference element.

EqF(const M& xi_circle, const M& xi_0, const Matrix& Sigma, int m);
EqF(const M& xi_circle, const Matrix& Sigma, int m);

Matrix Q = Geometry::processNoise(u); // Replaces blockDiag(...)

X_hat = traits<G>::Compose(X_hat, traits<G>::Expmap(L * dt));
Sigma = Phi * Sigma * Phi.transpose() + Bt * Q * Bt.transpose() * dt;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is already done in the ManifoldEKF, specialized to groups in the LieGroupEKF, which is the main reason to derive form that class.

Vector3 delta_vec = Rot3::Hat(y.d.unitVector()) * action_result;
Matrix Dt = Geometry::outputMatrixDt(y.cal_idx, X_hat);

Matrix S = Ct * Sigma * Ct.transpose() + Dt * y.Sigma * Dt.transpose();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You'll also find this somewhere in the existing hierarchy.

@AlessandroFornasier
Copy link

Nice to see this one in gtsam 👍🏻

@dellaert
Copy link
Member

Thans @AlessandroFornasier !We're going to substantially rewrite and base on LieGroupEKF (or derived), we'll let you know :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants