tune.motion --noise/--filter, which is also where the diagnostics dashboard runs it.
The production pipeline is:
--noise picks the source under test, and each source is injected at its real entry point — which is what makes the two testable independently:
network— transport artifacts injected before the pose low-pass, so the whole stack gets to clean them: jitter (white noise on every sample — hand tremor, sensor noise), outliers (isolated teleported samples — tracking glitches), and stalls (the stream freezes on its last sample, then jumps to catch up — wifi stalls, dropped frames).ik— solver artifacts injected between the low-pass and the EMA, exactly where the solver sits in production, so only the EMA and the trapezoid can see them (the pose filter never gets a chance, same as on the real robot): band-limited 3–20 Hz per-joint churn (a restless null space — the scalediag.offline kinematicsmeasures on real recordings) and persistent jumps (a redundancy flip: one joint steps to another solution branch for 0.3–1 s, then returns).combined(default) — both at once, each at its own injection point: the full production insult.
--cutoff), rerun, and compare scores on the exact same input.
Reading the scorecard
One caveat when reading: while the stream is stalled the clean reference keeps moving, so error during a stall is missing information, not filter failure. What the filter owns is the catch-up — resuming without overshoot or an acceleration spike.
