Per-target Kalman/IMM tracking: interacting multiple models, maneuver segmentation, RTS smoothing, EKF/UKF observable updates, and a motion-model bank
Project description
gri-kalman
Per-target Kalman tracking for geolocation: interacting multiple model (IMM)
filters with a motion-model bank, maneuver segmentation, RTS smoothing, and
EKF/UKF measurement updates from either Ell position fixes or raw observables.
This package was factored out of gri-convolve so the per-target estimators can
be reused without the ellipsoid-convolution stack. It depends only on gri-ell,
gri-obs, gri-pos, gri-utils (plus numpy/scipy).
Install
uv add gri-kalman
Trackers
All implement the Tracker protocol (update / update_observable / predict /
coast / smoothed_track / result / is_initialized):
| Tracker | Description |
|---|---|
IMM |
Interacting multiple model filter over a motion-model bank |
SmartIMM |
IMM with outlier rejection on the measurement stream |
SegmentedIMM |
Maneuver-segmenting IMM (per-segment filters) |
SmartSegmentedIMM |
Segmenting + outlier-rejecting (the recommended default) |
Motion models: ConstantVelocity, ConstantAcceleration, NearlyConstantSpeed,
CoordinatedTurn, Singer, AscendDescend, Static (plus the
LinearMotionModel / NonlinearMotionModel / MotionModel base protocols).
Local-level (ENU) awareness
The state is ECEF, but a maneuver's "horizontal" and "vertical" are defined
relative to local up, not the ECEF axes. Models whose dynamics or noise are
anisotropic in that sense take a level_rotation provider (an ECEF position ->
3x3 ECEF->ENU rotation):
CoordinatedTurnturns in the local horizontal plane about local up (not the ECEF polar axis).AscendDescendputs its large maneuvering noise along local up.ConstantVelocitycan split process noise / velocity prior into horizontal and a small vertical component, to model a level mover (boat, car, cruising aircraft).
Pass a constant rotation for a fixed local-level frame (rigorous over a bounded
area) or the position-dependent wgs84_level_rotation to follow Earth curvature
with no re-origining.
Gauss-Markov reverting components
Several models hold a state that should revert toward zero absent evidence, all
via the same first-order Gauss-Markov (Ornstein-Uhlenbeck) mechanism — a
(tau, sigma) pair (time constant + steady-state spread), gauss_markov_step:
Staticreverts its (nuisance) velocity toward zero.CoordinatedTurnreverts its turn rate toward zero (straight), so a turn rate picked up from noise on a straight leg relaxes instead of persisting.Singerreverts its acceleration toward zero (the canonical named case).
The pull is gentle (long tau) — real maneuver evidence overrides it within a
scan or two, so it costs no responsiveness.
Smoothing: rts_smooth, rts_smooth_segments, track_to_ells. Result container:
KalmanResult.
EKF vs UKF for observable updates
update() consumes an Ell (3D position + covariance) and is always an exact
linear update. update_observable() consumes a nonlinear observable (TDOA, FDOA,
AOA, Range, ...); choose the linearization with update_method:
"ekf"(default): linearizes at the predicted mean via the observable'sjacobian(). Cheap and accurate when the prior is tight relative to the geometry's nonlinearity."ukf": propagates sigma points throughpredicted()(no Jacobian). More robust (better-calibrated covariance) when the prior is broad and the observable is strongly nonlinear -- e.g. track initiation, long coast gaps, AOA, or satellite TDOA. Tune the spread withukf_alpha.
The UKF's advantage is consistency, not necessarily smaller point error; switch to it for robustness when the prior is broad, not expecting lower position error in mildly nonlinear cases.
Notes
- State is ECEF; positions/covariances interchange with gri-ell
Ellobjects. - Downstream consumers: the multi-target engine
gri-multitrackorchestrates these trackers via theTrackerprotocol; gri-convolve no longer ships them.
License
MIT -- see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gri_kalman-0.2.0.tar.gz.
File metadata
- Download URL: gri_kalman-0.2.0.tar.gz
- Upload date:
- Size: 80.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73ab92135ad23a9fe376040f13b5d25c7ebce0d913b20cc6547518402a468d1c
|
|
| MD5 |
c9573289427ced57c08a9b7193a47783
|
|
| BLAKE2b-256 |
07bd14393996e3527ede02f38285be9c4a31434620d46357a8bdd31ff364652e
|
File details
Details for the file gri_kalman-0.2.0-py3-none-any.whl.
File metadata
- Download URL: gri_kalman-0.2.0-py3-none-any.whl
- Upload date:
- Size: 70.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
15c24218770a9b7500b95c9cf682990285bca90418ca4302a6068a0871fbc145
|
|
| MD5 |
e7162b723e3b81943f93c1b3f23f2d1c
|
|
| BLAKE2b-256 |
c34fb9cc29b5b509125452377d0e5b218d5710ad5a8a19b8aff43ad5d44181fe
|