Repository navigation
[TASK] UKF #745
Description
Description of task
Description of task
Implement an Unscented Kalman Filter (UKF) for AUV navigation as an alternative to the ESKF. The UKF should use quaternion formulation of orientation in order to avoid problems downstream with gimbal lock. The nominal state should be 16D (position, velocity, attitude error, accelerometer bias, gyro bias), however in the unscented transform itself it is necessary to use a 15D covariance matrix as using the full 16D matrix would yield singularities due to the nature of the SO(3) manifold Attitude must be handled on the manifold. I.e we will generate sigma points in the 3-dimensional attitude error space and map them onto the nominal quaternion. The UKF should also share the same sensor models (IMU prediction, DVL and depth updates) and the same ROS interface, so the two filters can be swapped and compared directly. With the exception of the magnetometer which will be implemented in the UKF to mitigate the weakly observable heading.
Contacts
assignee @Q3rkses
My navigation guru - @chrstrom
Testing and quality control expert - @Andeshog
A once relevant vortexer - @Talhanc
My GOAT - @ApatShe
Control team lead - @anbit-adhi
some guy i worked with @jorgenfj
Suggested Workflow
- Read through the ESKF in PR #640: its state definition, IMU/DVL/depth models, NIS gating and ROS interface. Reuse as much of it as possible.
- Read up on the theory:
- The scaled unscented transform (Wan & van der Merwe, 2000).
- UKFs on manifolds: Crassidis & Markley, 2003 (USQUE); Brossard, Barrau & Bonnabel, 2020 (UKF-M).
- Solà, 2017, Quaternion kinematics for the error-state Kalman filter, for the shared error-state conventions.
- Implement the sigma-point generation and unscented transform as a standalone, unit-tested component.
- Implement IMU prediction and DVL/depth updates, with the same NIS gating as the ESKF.
- Run both filters on the same simulator runs and rosbags. Compare RMSE, NEES/NIS consistency and runtime, and summarise the results on the wiki.
Specifications
- Must handle DVL dropout (rolls, near-surface) without corrupting the estimate or jumping on recovery.
- Covariance must stay symmetric positive definite. The Cholesky decomposition used for sigma points must not fail silently; handle a failed factorisation explicitly.
- Must run in real time at the IMU rate on the onboard computer.
- Must publish the same output messages as the ESKF and be selectable through a launch parameter.
- The filter must be consistent in simulation: NEES stays within its χ² bounds.
Code Quality
- The code is relatively easy to reason about for an outside person when the theory is understood
- Every function in the header files is documented (inputs/returns/exceptions)
- The project has automated tests that cover most of the functions and branches in functions (pytest/gtest)
- The code is documented on the wiki (provide link)
Activity
[-][TASK] [Task] UKF[/-][+][TASK] UKF[/+]chrstrom commentedon Oct 11, 2026
@Q3rkses whats the plan for obtaining a ground-truth when comparing the different filter implementations? (Trivial in simulations, but I assume you'd want real-world performance numbers as well)
jorgenfj commentedon Oct 11, 2026
A simple solution that might work to some degree is to bring the camera calibration board to the Aku lab and try to keep the drone facing the board during maneuvers
Q3rkses commentedon Oct 11, 2026
We are looking into if MC lab or other pools have facilities for mocap or similar. Otherwise as a last resort we thought we could utilize aruco/april/charuco/... markers with known global position and orientation being scattered around the pool and running VO independently to compare with.
chrstrom commentedon Oct 11, 2026
if going the MC Lab route you could look at the 2020 thesis of Øyvind Denvik for some pointers to the experimental setup 😺