Two signals carry the whole of kinematic telematics.
Both come free from data the preparation stage already produces — no human labelling anywhere in this path. The engineering is in what happens after them.
Longitudinal acceleration
Braking and acceleration. Speed is smoothed over 0.5 s before differentiation — long enough to reject CAN quantisation noise, short enough to preserve a real one-second brake application. Differentiating raw speed turns sensor noise into events that never happened.
Lateral acceleration
Cornering, from curvature and speed. The square matters: the same 100 m radius bend is 1.0 m/s² at 36 km/h and 6.25 m/s² at 90 km/h. A curvature-only detector flags both or neither, and is wrong either way.
Manoeuvres, not samples
A threshold crossing lasting one frame is a sensor dropout. Two brake applications 0.3 s apart are one manoeuvre. Crossings under 0.2 s are discarded; same-kind events within 1 s are merged.
Exposure normalisation
Rates are per 100 km, never raw counts. Counting events alone ranks the driver who drives the most, not the driver who drives the worst.
Trip boundaries are respected
Every trip is processed independently. Concatenating two clips puts a 30 → 2 m/s step at the seam, which differentiates into a spectacular braking event that never occurred. Enforced and covered by tests.
Unit guards
A steering angle is not curvature without the steering ratio and wheelbase. Feed one in as the other and you get event counts that look merely high rather than obviously broken, so implied lateral acceleration is checked against what tyres can physically deliver before anything is scored.
Signals derived from ego-motion are verified against a second, independent derivation.
Curvature comes from fused ego-pose. A sign or axis error there does not crash — it silently produces confident numbers that are backwards. So it is cross-checked against curvature recomputed from the position track alone, which is geometrically independent.
| Check | Expected | Measured |
|---|---|---|
| Trajectory vs yaw-rate curvature correlation | ≈ −0.9 | −0.927 |
| Same check, 551-segment reference run | ≈ −0.9 | −0.917 |
| GNSS speed vs position-track speed | ≈ +1.0 | pass |
| Implied lateral acceleration plausibility | p99 < 12 m/s² | pass |
A mirrored axis inverts turn direction while every magnitude stays perfectly plausible. The verifier is written to reject that case specifically, and there is a test that fails if it ever certifies one.
Testing philosophy
The test suite targets the places where a bug produces a plausible-looking number rather than a crash — because those are the ones that reach production. Circular paths of known radius pin the curvature derivations. Yaw unwrapping is tested across the ±π branch cut. Sequence boundaries are tested to make sure a stack or a derivative never spans two trips. Compression round-trips content and labels through every storage format, so packing cannot quietly desynchronise data from its labels.