Released · v1.1.0MTH 407 term project · May 2026, revised Oct 2026

MTH Tracker: time-based target localisation and tracking

A two-dimensional TOA/TDOA tracker, least-squares initialiser and extended Kalman filter, validated against the posterior Cramér–Rao bound, with a real-time interactive simulator.

Extended Kalman filterEstimation theoryCramér–Rao boundTOA / TDOAMonte CarloTkinterPython
Urban clutter: walls, trees, two base stations, 40 pedestrians and light rain. The map-aware filter stays consistent.

Overview

A sensor network measures when a signal from a moving target arrives (TOA), or the differences between arrival times (TDOA). MTH Tracker turns those times into a position and velocity track and asks how close it comes to the best any unbiased estimator could do.

The answer is very close: on matched data the Monte Carlo RMSE is between 0.967 and 1.004 of the posterior Cramér–Rao bound for constant-velocity, constant-acceleration, Singer and coordinated-turn models, and the filter's self-reported uncertainty is consistent to within 3 %.

The report derives the mathematics, proves three propositions and presents ten experiments: geometry and GDOP, sensor count, noise sweeps, TOA vs TDOA, manoeuvres, occlusion and an environment ladder. Every figure and number in it is regenerated by one command.

What I built

  • Two plug-in axes: any motion model (CV, CA, Singer with exact Van Loan discretisation, CT) combines with any measurement model, and the EKF never branches on their type.
  • TOA and TDOA as one model z = D r(p)/c + D w; TDOA noise is simulated per sensor and then differenced, so its correlation appears in the data rather than being imposed.
  • Closed-form initialisation (Chan–Ho for three sensors), Gauss–Newton refinement and explicit resolution of ambiguous geometries; Joseph-form updates with one Cholesky factorisation and no explicit inverses.
  • NIS-gated adaptive process noise for manoeuvres and map-aware measurement noise from an environment model; 76 tests that run in under 10 s.

The interactive simulator (python -m mth_tracker gui)

Run it

$ pip install -e .
$ python -m mth_tracker gui
$ python -m mth_tracker run --trajectory coordinated_turn --motion CT --runs 50
$ python -m mth_tracker reproduce   # every figure and number, < 3 min