docs: design lightweight Kalman obstacle tracker
This commit is contained in:
@@ -0,0 +1,153 @@
|
|||||||
|
# Lightweight Kalman Obstacle Tracker Design
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
Replace the current exponential-smoothing tracker with a true lightweight
|
||||||
|
constant-velocity Kalman filter. The tracker must improve association and
|
||||||
|
short dropout handling for a robot moving at up to 2 m/s, without using TF and
|
||||||
|
without materially increasing RDKx5 CPU load.
|
||||||
|
|
||||||
|
## Operating Conditions
|
||||||
|
|
||||||
|
- ROS2 Humble on RDKx5.
|
||||||
|
- LaserScan rate is approximately 12 Hz.
|
||||||
|
- Robot speed is at most 2 m/s, corresponding to about 0.167 m translation per
|
||||||
|
scan.
|
||||||
|
- The environment is simple: walls and two or three target signboards.
|
||||||
|
- Two-point observations may update an existing track but may not create one.
|
||||||
|
- Track coordinates remain in the laser frame. No TF or odometry dependency is
|
||||||
|
introduced in this version.
|
||||||
|
|
||||||
|
## Alternatives Considered
|
||||||
|
|
||||||
|
1. Constant-velocity linear Kalman filter: selected. It provides velocity-based
|
||||||
|
prediction and covariance-aware association using fixed-size matrices.
|
||||||
|
2. Alpha-beta filter: rejected because association would still depend mainly on
|
||||||
|
manually tuned fixed distance gates.
|
||||||
|
3. TF/odometry compensated filter: deferred because transform data can have
|
||||||
|
significant latency on this robot.
|
||||||
|
|
||||||
|
## State And Prediction
|
||||||
|
|
||||||
|
Each track contains the state `[x, y, vx, vy]` and a fixed-size 4x4 covariance
|
||||||
|
matrix. The transition model is constant velocity and uses `dt` calculated from
|
||||||
|
consecutive LaserScan timestamps. Invalid, non-positive, or unusually large
|
||||||
|
time deltas are clamped to a safe range around the nominal scan period so that
|
||||||
|
velocity and covariance cannot diverge after clock discontinuities.
|
||||||
|
|
||||||
|
The process model uses configurable acceleration noise. Initial velocity is
|
||||||
|
zero, but initial velocity covariance is intentionally broad enough to associate
|
||||||
|
the second observation after a 0.167 m frame-to-frame displacement.
|
||||||
|
|
||||||
|
## Measurements
|
||||||
|
|
||||||
|
Circle fitting produces a two-dimensional center measurement and can initialize
|
||||||
|
a tentative track. Its measurement covariance is relatively small.
|
||||||
|
|
||||||
|
A two-point chord uses the track's predicted radius to construct the unique
|
||||||
|
center farther from the laser origin. It has a larger measurement covariance,
|
||||||
|
does not change track radius, and can only update an existing track.
|
||||||
|
|
||||||
|
Circle measurements update radius with conservative smoothing. Chord
|
||||||
|
measurements never update radius.
|
||||||
|
|
||||||
|
## Association
|
||||||
|
|
||||||
|
All tracks are predicted before association. Circle measurements are associated
|
||||||
|
first, followed by chord measurements. Candidate pairs must pass both:
|
||||||
|
|
||||||
|
- squared Mahalanobis distance at or below `9.21`;
|
||||||
|
- Euclidean center distance at or below `0.35 m`.
|
||||||
|
|
||||||
|
Pair selection is global greedy assignment over all valid observation-track
|
||||||
|
pairs sorted by innovation score. Each observation and each track can be used at
|
||||||
|
most once per source pass. This removes the current observation-order bias while
|
||||||
|
remaining trivial for the expected three or four tracks.
|
||||||
|
|
||||||
|
An unmatched circle measurement creates a tentative track. Unmatched chord
|
||||||
|
measurements are discarded.
|
||||||
|
|
||||||
|
## Track Lifecycle
|
||||||
|
|
||||||
|
A new track starts as tentative and is not published. It becomes confirmed
|
||||||
|
after either:
|
||||||
|
|
||||||
|
- two circle-fit updates; or
|
||||||
|
- one circle-fit initialization followed by enough reliable chord updates to
|
||||||
|
reach three total updates.
|
||||||
|
|
||||||
|
A tentative track is deleted after one missed frame. A confirmed track remains
|
||||||
|
internally available for association for five missed frames.
|
||||||
|
|
||||||
|
A confirmed track may publish predicted coordinates for at most three missed
|
||||||
|
frames, approximately 0.25 seconds at 12 Hz. Predicted output stops earlier when
|
||||||
|
the largest position standard deviation exceeds `0.15 m`. This separates
|
||||||
|
reassociation lifetime from externally visible stale-data lifetime.
|
||||||
|
|
||||||
|
When an observation falls outside the association gates, the old track is not
|
||||||
|
silently reassigned. A new circle observation may form a tentative track, but
|
||||||
|
neither the old prediction nor the new tentative track creates an immediate
|
||||||
|
duplicate published obstacle.
|
||||||
|
|
||||||
|
## Initial Parameters
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
process_accel_noise: 3.0
|
||||||
|
initial_velocity_stddev: 2.5
|
||||||
|
fit_position_stddev: 0.02
|
||||||
|
chord_position_stddev: 0.06
|
||||||
|
mahalanobis_gate: 9.21
|
||||||
|
max_association_distance: 0.35
|
||||||
|
max_position_stddev: 0.15
|
||||||
|
track_confirm_fit_hits: 2
|
||||||
|
track_confirm_total_hits: 3
|
||||||
|
track_publish_misses: 3
|
||||||
|
track_delete_misses: 5
|
||||||
|
```
|
||||||
|
|
||||||
|
Every parameter will be documented in `config/params.yaml`. Obsolete EMA and
|
||||||
|
fixed nearest-neighbor parameters will be removed rather than retained as dead
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
## Debug Information
|
||||||
|
|
||||||
|
The existing compact debug topic remains controlled by `debug` as the master
|
||||||
|
switch and `debug_info` as the textual-output switch. It gains these counters:
|
||||||
|
|
||||||
|
- tracks created, confirmed, and deleted;
|
||||||
|
- fit and chord Kalman updates;
|
||||||
|
- association rejections;
|
||||||
|
- predicted tracks currently published;
|
||||||
|
- mean and maximum accepted innovation.
|
||||||
|
|
||||||
|
The debug path must not alter tracker decisions. Production operation continues
|
||||||
|
to use `debug: false` when visualization and diagnostic output are unnecessary.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Unit tests will cover:
|
||||||
|
|
||||||
|
- constant-velocity prediction and association at 2 m/s and 12 Hz;
|
||||||
|
- suppression of a one-frame false circle;
|
||||||
|
- confirmation by two circle fits;
|
||||||
|
- confirmation by one fit followed by two valid chord updates;
|
||||||
|
- predicted publication for three misses and suppression on the fourth;
|
||||||
|
- internal deletion after five misses;
|
||||||
|
- covariance-based early publication suppression;
|
||||||
|
- rejection of distant fit and chord observations;
|
||||||
|
- invalid and discontinuous timestamps;
|
||||||
|
- preservation of existing circle-fit and chord geometry behavior.
|
||||||
|
|
||||||
|
Tests are written and observed failing before production implementation. Final
|
||||||
|
verification uses a Release build with `colcon build --symlink-install`, package
|
||||||
|
tests, and a short ROS2 launch/topic smoke test on domain 22 without replacing
|
||||||
|
or terminating unrelated running nodes.
|
||||||
|
|
||||||
|
## Scope Exclusions
|
||||||
|
|
||||||
|
- TF, odometry, IMU, or command-velocity compensation;
|
||||||
|
- nonlinear turn-rate motion models;
|
||||||
|
- Hungarian assignment;
|
||||||
|
- creation of obstacles from two points alone;
|
||||||
|
- browser visualization changes;
|
||||||
|
- unrelated navigation or workspace cleanup.
|
||||||
Reference in New Issue
Block a user