Performance Visualization
We replay representative tracking trajectories (Figure-8, circle, spiral, ellipse) with unknown payload events from our quadrotor experiments in Isaac Sim, comparing controllers using TAG-K as the online parameter estimator against the best-performing baseline. The first red marker denotes payload addition and the second denotes payload drop; the white curve is the reference trajectory. Performance is evaluated by tracking accuracy relative to the reference. TAG-K adapts substantially faster during both events, yielding more reliable end-to-end performance.
Tracking - Figure 8
Tracking - Circle
Tracking - Spiral
Tracking - Ellipse
Abstract
Accurate online inertial parameter estimation is essential for adaptive robotic control, enabling real-time adjustment to payload changes, environmental interactions, and system wear. Traditional methods such as Recursive Least Squares (RLS) and the Kalman Filter (KF) often struggle to track abrupt parameter shifts or incur high computational costs, limiting their effectiveness in dynamic environments and for computationally constrained robotic systems. As such, we introduce TAG-K, a lightweight extension of the Kaczmarz method that combines greedy randomized row selection for rapid convergence with tail averaging for robustness under noise and inconsistency. This design enables fast, stable parameter adaptation while retaining the low per-iteration complexity inherent to the Kaczmarz framework.
We evaluate TAG-K in synthetic benchmarks and quadrotor tracking tasks against RLS, KF, and other Kaczmarz variants. TAG-K achieves 1.5×–1.9× faster solve times on laptop-class CPUs and 4.8×–20.7× faster solve times on embedded microcontrollers. More importantly, these speedups are paired with improved resilience to measurement noise and a 25% reduction in estimation error, leading to nearly 2× better end-to-end tracking performance.
Key Results
Computational Speed
1.5×–1.9× faster on laptop CPUs
4.8×–20.7× faster on embedded processors (Teensy 4.1)
Estimation Accuracy
~25% lower estimation error than RLS and KF baselines across all test scenarios
Tracking Performance
~2× better downstream trajectory tracking in closed-loop quadrotor control
Embedded-Friendly
O(mn) per-iteration complexity, cache-friendly memory access, no matrix inversions required
Method
TAG-K solves streaming linear systems Aθ ≈ b arising from rigid-body dynamics. At each iteration, it:
- Greedy row selection: Picks the measurement row with the largest residual, focusing computational effort where it matters most.
- Kaczmarz update: Projects the current estimate onto the hyperplane defined by the selected row—a simple, cache-friendly vector operation with no matrix inversions.
- Tail averaging: Averages the last k iterates to damp oscillations and improve convergence, especially under noisy measurements.
This combination yields an estimator that is both fast (O(mn) per iteration, no linear solves) and accurate (greedy selection + averaging compensate for the single-row update limitation).
Implemented Estimators
The online_estimators Python package provides a unified interface for 16 online estimation algorithms.
See the full API documentation →
| Class | Description |
|---|---|
TAGK | Greedy Randomized Kaczmarz + tail averaging (ours) |
TAGK_Tikh | TAGK + Tikhonov regularisation |
GRK | Greedy Randomized Kaczmarz (max-residual row) |
RK / TARK | Randomized Kaczmarz / Tail-Averaged RK |
RLS | Recursive Least Squares with forgetting factor |
KF | Kalman Filter (parameters-as-state formulation) |
REK | Randomized Extended Kaczmarz (inconsistent systems) |
IGRK / MGRK | Block Greedy / Momentum-accelerated GRK |
FDBK | Fully-Determined Block Kaczmarz |
RK_ColScaled | RK with column-norm scaling |
RK_Equi | RK with Ruiz equilibration |
RK_Tikh / RK_EquiTikh | RK + Tikhonov / + equilibration + Tikhonov |
GRK_Tikh | GRK + Tikhonov regularisation |
Quick Start
Installation
git clone https://github.com/A2R-Lab/TAG-K.git
cd TAG-K
pip install -e . # pure-Python
pip install -e ".[cpp]" # with C++ accelerated backends
Usage
import numpy as np
from online_estimators.estimators import TAGK
rng = np.random.default_rng(0)
n, m = 5, 50
A = rng.standard_normal((m, n))
x_true = rng.standard_normal(n)
b = A @ x_true
est = TAGK(n)
for _ in range(500):
x_hat = est.iterate(A, b)
print("Error:", np.linalg.norm(x_hat - x_true))