MOVEdot

Building a Steer-by-Wire System · Chapter 3 · Part 3 of 5

1Gate failed of 11
Steer-by-Wire

The regression run

Girish Radhakrishnan
Girish RadhakrishnanJuly 6, 2026 · 7 min read
Steer-by-WireRegressionSeries

v4 → v5 paired comparison across 384 runs and four fixes applied. Five of six mechanisms fixed; one new failure sits on the golden runs that never failed once in Chapter 2.

Verdict: 5 of 6 mechanisms fixed. 1 new failure — and it sits on the golden runs that never failed once in Chapter 2.

v4 → v5 paired comparison · 384 runs · 4 fixes applied · 1 regression surfaced

Diff table — 4 buckets

52
Fixed
Failed v4 → passes v5
328
Unchanged
Same result both versions
4
New break
Passed v4 → fails v5
0
Still broken
Failed both
Fixed runs (52)
MechanismRun kindMagnitudeCountFix
motor_driver_open (ECUB standby)single_pointmild / moderate / severe18Fix 1 (active probing)
torque_sensor_driftsingle_pointmild12Fix 2 (drift retune)
angle_sensor_biassingle_pointmild4Fix 3 (bias threshold)
motor_driver_shorthandoversevere + moderate12Fix 4 (B-channel recal)
can_timeout / channel_supply / motor_openhandoversevere (park)6Fix 4 (B-channel recal)
New breaks (4)
RunRun kindOp pointDTCNote
gld_001goldenhs (120 kph)torque_sensor_driftFix 2 regression
gld_002goldenhs (120 kph)torque_sensor_driftFix 2 regression
gld_003goldenhs (120 kph)torque_sensor_driftFix 2 regression
gld_004goldenhs (120 kph)torque_sensor_driftFix 2 regression

Fix confirmation — before/after

Coverage by fault type■ v4■ v5
99% gate0%25%50%75%100%Motor driver openAngle sensor biasTorque sensor driftMotor driver shortCross-channel freezeCAN corruptionCAN timeoutChannel supply dropoutAngle sensor open
Pooled coverage moves from 93.21% to 100%. The two shortfalls in v4 — motor driver open on ECU-B and mild angle sensor bias — both close after Fixes 1 and 3.

Fix 1: Active probing — motor_driver_open standby channel

v4v5
ECU-B (standby) detection0/18 (blind)18/18
Coverage50%100%
Detection timing (ECU-B)50–104 ms (mean 94 ms)

Mechanism: periodic 50 ms diagnostic pulse on standby motor; 2-probe debounce. Detection is not instant — requires at least one full probe cycle.

Fix 2: Drift monitor retune — torque_sensor_drift threshold

v4v5
Threshold0.15 N·m0.06 N·m
Mild detection time210–230 ms (all 12 breach 150 ms)83–116 ms
Mild FTTI pass (150 ms gate)0/1212/12
Moderate detection time110–130 ms55–68 ms
Fix 2 — drift detection latencythreshold 0.15 → 0.06 N·m
050100150200150 ms FTTI gate200–22683–116v4v5Mild109–12855–68v4v5Moderate70–8040–50v4v5Severedetection time · ms
Each bar spans the min–max across all runs at that severity. Mild is the story: all 12 v4 runs sat above the 150 ms gate; all 12 v5 runs sit below it. That same threshold change is what trips the high-speed golden-run false alarms.

Fix 3: Bias monitor sensitivity — angle_sensor_bias threshold

v4v5
Threshold0.80 deg0.40 deg
Mild detected8/12 (4 misses: 2 urban, 2 park)12/12
Coverage88.9%100%

Fix 4: B-channel recalibration + settling

v4v5
Handover RWA failures18/480/48
Max deviation8.81 deg0.15 deg
Settling time20–30 ms + 3×error15–25 ms (pre-loaded integral)

Mechanism: b_sensor_gain forced to 1.0; B controller pre-loads integral state from standby tracking.

The regression

4 golden runs went green → red

Golden run false-positive status in v5
Runtorque_sensor_drift_atorque_sensor_drift_bNote
gld_0010.022 s0.022 sTrips almost immediately — noise exceeds threshold from start
gld_0020.049 s0.049 s
gld_0030.485 s0.485 s
gld_0040.490 s0.490 s
All 4 failures are high-speed. Urban and park golden runs are clean.

The most stable tests in the entire campaign — fault-free baselines that passed every metric in Chapter 2 — now throw false alarms in v5.

Root cause

Affected runsgld_001, gld_002, gld_003, gld_004
Operating pointHigh-speed only (120 kph). Urban and park golden runs are clean.
DTC that firestorque_sensor_drift (both A and B channels simultaneously)
Source fixFix 2 — drift monitor threshold lowered from 0.15 → 0.06 N·m
Physical causeAt 120 kph, combined tire-road coupling noise (5–70 Hz) produces torque feedback peaks exceeding 0.06 N·m for sustained periods (>25 ms), tripping the debounce window. At 50/5 kph, amplitude is well below threshold.
Real fault present?No. These are fault-free baseline runs. The alarm is false.

Why this matters

A human cannot compare 384 test pairs by hand. These 4 false alarms hide inside thousands of passing results. They land on the golden runs — the most stable tests in the whole campaign. Automated paired-run diffing catches it in minutes.

Acceptance verdict

Acceptance gates — v4 vs v5v4 5 pass / 6 fail · v5 10 pass / 1 fail
MetricGatev4v5
Coverage per fault type≥ 99%FAIL (min 50%)PASS (100%)
Coverage pooled≥ 99%FAIL (93.21%)PASS (100%)
Detection time vs FTTI< governing FTTIFAIL (34/324)PASS (0 breach)
FTTI self-steer hs< 100 msPASSPASS
FTTI self-steer urban< 200 msPASSPASS
FTTI self-steer park< 500 msPASSPASS
FTTI incorrect steer< 150 msFAIL (16/72)PASS
Handover omission< 150 msFAIL (18/144)PASS
RWA handover deviation≤ 1.0 degFAIL (18/48)PASS
False positive rate= 0PASSFAIL (4/12)
EOTTI≤ 5 sPASSPASS
Overall: v4 5 PASS / 6 FAIL · v5 10 PASS / 1 FAIL.

5 of 6 mechanisms fixed. 1 new failure — and it sits on the golden runs that never failed once in Chapter 2.

The retuned torque_sensor_drift monitor (Fix 2, threshold 0.15 → 0.06 N·m) now trips on normal high-speed road/tire noise. The fix that closed 12 timing breaches opened 4 false alarms on the most stable tests in the campaign.

Analysis performed on paired ground-truth timing data from v4 (sbw_ch2) and v5 (sbw_ch3) datasets. 384 runs × 5 sources × 2 versions = 3,840 files compared.

All data in this series is synthetic, generated to mirror a real steer-by-wire validation program. No customer data is used.


Next in the series: the noise filter fix, where the change that clears every gate turns out to have quietly eaten the detection margin. If your regression diff still lives in spreadsheets, we would like to talk: founders@movedot.com, or www.movedot.ai.