estkit
Header-only C++17 · embedded · dependency-free

Every state estimator, in one library, on one benchmark.

estkit implements 86 state estimators and observers — from the Kalman filter to moving-horizon estimation, particle filters and deterministic observers — against a single model-agnostic interface, with no dynamic memory and no exceptions, then measures every one of them on the battery-management problem of an electric aircraft.

86
estimators & observers
70 cell · 7 pack · 9 attitude
12
algorithm families
baselines → smoothers
~9,000
benchmark runs
2 plants · 12 faults · 3 seeds
0
runtime dependencies
C++17 standard library only

What it is

A library

One header per estimator, each templated on a small model concept (f, h, Q, R; Jacobians optional). No heap, no exceptions, fixed-size linear algebra with compile-time dimensions, Real = double or float, warning-free under -Wall -Wextra -Wpedantic -Werror on GCC and Clang, and it cross-compiles to a Cortex-M7. The battery model is one instance; a drone navigation model and an attitude model are others — the same Ekf<M> estimates all three.

The model concept & getting started →

A benchmark

Two truth plants — an enhanced equivalent-circuit cell and an electrochemical single-particle model built from LG M50 electrode data — over four missions, twelve fault scenarios and three noise seeds, plus a twelve-cell pack, a 120-mission ageing study and an instrumented flight. Cross-validated against FilterPy, PyBaMM and ahrs to floating-point precision.

The results →

The architecture

Models Battery ECM Battery SPM Attitude / IMU Drone / nav your model Model conceptf, h, Q, RJacobians optional Estimation engine Kalman & sigma-point Adaptive & robust Observers Particle / ensemble Joint / dual (SOH) MHE & smoothers Embedded C++17no heap · no exceptionsdouble or float · Cortex-M7

Any discrete-time model that provides a transition, a measurement and two noise covariances plugs into every estimator unchanged. Everything below the model concept is problem-independent; everything above it is the only battery-specific code.

The twelve families

Baselines3
CoulombOCVHybrid, CoulombCounting, OCVLookup
Classical & sigma-point Kalman15
SO-EKF, UKF, SR-UKF, IEKF, SR-EKF, EIF…
Adaptive Kalman8
IMM, IAE-AKF, VB-AKF, SageHusa-AKF, Fuzzy-AKF, Fading-EKF…
Robust & embedded Kalman8
StudentT-KF, Huber-EKF, MC-EKF, ReducedOrder-EKF, Constrained-EKF, Hinf-EKF…
Deterministic observers12
DOB, AdaptiveObserver, UIO, SSKF, IntervalObserver, SuperTwisting-SMO…
Joint / dual state–parameter (SOH)6
AWTLS, JointEKF, JointUKF, DualEKF, DualUKF, RLS-EKF
Particle, ensemble & Gaussian-sum9
GSF, RBPF, PF-Regularized, PF-Auxiliary, PF-Bootstrap, PF-Fast…
Data-driven hybrids3
ELM-RLS-EKF, NN-EKF, NN-Direct
Moving-horizon estimation2
MHE, MHE-RTI
Smoothers (offline)4
URTS, Batch-NLS, ERTS, FixedLag-EKF
Pack-level & distributed7
BarDelta, Consensus, Decentralized-EKF, Decentralized-ReducedEKF, Decentralized-UKF, Federated…
Attitude (AHRS)9
Complementary, InvariantEKF, MEKF, Madgwick, Madgwick-Gated, Mahony…

One headline from ~9,000 runs

Accuracy versus computational cost
Nominal accuracy versus cost per step. The best twelve estimators run within five times the cost of the EKF — below 2 µs on a desktop core, a fraction of a percent of a flight processor.

The finding

On a cell whose model the estimator knows, the nominal problem is solved by any tuned closed-loop filter; the field is separated only by faults. On a cell whose model it does not know, every converged Kalman filter parks on a ~4 % bias with a clean innovation, while fading-memory and fixed-gain estimators hold under 0.7 %. The choice of estimator matters much less than whether it is told the truth about its model and its sensors.

The plain EKF fails the hardest scenario (MHE-RTI and the adaptive family reach 0.50 % where the EKF has 12.4 %) not because it is a poor filter but because it is an exact one for a model that is wrong.

See it scenario by scenario →

Who it is for

Engineers

Drop one header into your project and run any filter on your own model in twenty lines.

Getting started →

Researchers

A reproducible, cross-validated benchmark and a 958-page report with one chapter per estimator.

The report →

Practitioners (BMS)

A reference estimator stack for an electric-aircraft battery-management system, with the evidence.

Recommendations →