MOVEdot

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

Steer-by-Wire

The first data off the rig

Girish Radhakrishnan
Girish RadhakrishnanJune 22, 2026 · 6 min read
Steer-by-WireData PrepSeries

27 runs across five instruments, three temperatures, two voltages, and two sweep rates. Five spec failures remain after correcting the on-center slope spec — all concentrated in two metrics at specific conditions.

5 spec failures remain after correcting the on-center slope spec to 0.005 N·m/deg — all concentrated in two metrics at specific conditions.

27 runs across 5 instruments · 3 temperatures · 2 voltages · 2 sweep rates · 135 raw files

Data preparation in five steps

Five instruments logged the same bench simultaneously with incompatible channel names, mixed units, and unsynchronised clocks. The pipeline resolved all of this before any spec check ran.

The overnight pipelineunattended · ~8 min
1Ingest
135 files → 17 canonical channels
5 sources
2Align clocks
cross-correlate to a 100 Hz grid
±1 s
3Sensor QC
drift · dropout · spikes · truncation
58 flags
4Stabilised points
held-point detection at ±200 / ±400°
100 holds
5Spec checks
6 metrics on every run
143 checks
Every step runs in sequence, on every run, with no one carrying files between tools. By morning the cleaned dataset and the first spec pass are on the shared drive.
StepWhat happenedResult
1 · Ingest135 raw files (MF4 + CSV) read. Channel names mapped to one canonical set. Robot rad→deg, rack→rwa via 1.8 mm/deg, ECU-A current→torque via Kt = 0.20 N·m/A.Complete
2 · Clock alignmentPer-source offset estimated by cross-correlating hwa_cmd_deg against the rig master (±3 s window). All sources resampled to a common 100 Hz grid.Offsets: ±1 s max
3 · Sensor QCNaN gaps, frozen dropouts, spikes, warm-up masking, and truncation detection across all 17 canonical channels × 27 runs.58 instances flagged
4 · Stabilised pointsHeld-point detection at ±200 deg and ±400 deg. 25 of 27 runs have holds; run07 and run18 truncated before the held-point phase.100 holds detected
5 · Spec checks6 metrics computed per run and compared against the baseline spec sheet (on-center slope spec corrected to 0.005 N·m/deg).5 FAILs

Source mapping

Five sources, one dataset27 runs · 135 files
Rig DAQMF4 · 1 kHzSWA_cmd_deg, FbTrq_Nm
Steering robotCSV · rad, mmcmd_angle, rack_pos_mm
Torque / angle sensorsCSV · raw countstrq_raw, ang_raw
ECU-ACSV · currentI_mot_A, HwaCmd
ECU-BCSVtheta_cmd, M_fb
harmonise
Canonical dataset
17 channels · 100 Hz
hwa_cmd_degrwa_degfb_torque_Nmmotor_torque_Nm+ 13 more
Applied automaticallyrad → degrack ÷ 1.8 mm/degcurrent × 0.20 N·m/Aclocks → 100 Hz grid
Canonical signalRig DAQRobotECU-AECU-BConversion
hwa_cmd_degSWA_cmd_deg (deg)cmd_angle (rad)HwaCmdtheta_cmdrobot: rad → deg
rwa_degRWA_deg (deg)rack_pos_mmrack / 1.8 mm/deg
fb_torque_NmFbTrq_NmTrqFbM_fb
motor_torque_NmMotTrq_Nm(I_mot_A × Kt)T_motECU-A: current × 0.20 N·m/A
motor_current_AI_mot_A

Channel health — nothing that blocks the analysis

All faults are minor and isolated. No canonical rig channel is compromised on more than one run.

  • 54 spike instances — motor torque/current, 23 runs. Sparse 1–4 sample events. Peak metrics use 99.9th percentile.
  • 3 NaN gapsrwa_deg__robot on run04 (5 samples) and run12 (4 samples); motor_torque_Nm__rig on run14 (1 sample).
  • 1 frozen dropoutrwa_deg__robot on run03, 540 samples while rig rwa was moving. Rig copy is clean; used as primary.

Where the campaign stands — 5 failures, 2 metrics

Spec-check matrix27 runs · 6 metrics
Steering ratio
FB torque @ lock
On-center slope
Motor torque
Motor current
On-center hyst.
−10 °C
25 °C
80 °C
Pass
Fail
Not evaluated
138 of 143 checks pass. The five failures sit in just two metrics (feedback torque at lock, all at 80 °C, and on-center hysteresis at a single condition). The other four metrics are clean across the campaign.
MetricSpec targetTolerancePASSFAIL
Steering ratio15.0±5 %270
FB torque at lock3.5 N·m±1.5 N·m223
FB on-center slope0.005 N·m/deg±50 %180
Motor torque peak≤ 8.0 N·m270
Motor current peak≤ 40.0 A270
On-center hysteresis≤ 0.4 N·m162

Four of six metrics are clean campaign-wide. Steering ratio holds at 15.000 ± 0.001 across all 27 runs. Motor torque peaks at 2.44 N·m — well below the 8.0 N·m limit.

Feedback torque at full lock — 3 FAILs at 80 °C only

Feedback torque at full lockspec 3.5 ± 1.5 N·m
2.03.04.05.06.0upper limit · 5.0 N·mtarget 3.5-10 °C25 °C80 °C|FB torque| · N·m
Three runs at 80 °C (×) reach ~5.38 N·m, just past the 5.0 N·m limit and about 20% above the temperature-scaling model. Every other condition sits inside the band. A temperature trend, not random scatter.

Spec: 3.5 ± 1.5 N·m (band: 2.0–5.0 N·m). All three failures are at 80 °C — runs 19, 20, and 25 — measuring ~5.38 N·m against the 5.0 N·m upper limit. Every other condition is within the band. Runs run07 and run18 are truncated before the held-point phase and cannot be evaluated for full-lock torque, so 25 of 27 runs are scored — 22 PASS / 3 FAIL.

The temperature-scaling model predicts ~4.46 N·m at 80 °C. The measured value of ~5.38 N·m is 20% above that prediction. The −10 °C conditions sit near 2.8 N·m — within band but on the low side.

On-center hysteresis — 2 FAILs, both at 25 °C / 13.5 V

On-center hysteresislimit ≤ 0.4 N·m
0.00.20.40.6limit · 0.4 N·m0.65clunk0.65rerunhysteresis · N·meach bar = one run, sorted low → high
Only two runs exceed the limit, both at 25 °C / 13.5 V and both carrying operator notes (a rerun and a reported clunk). The other runs at that same condition pass, so this reads as run-specific, not a property of the actuator.

Measured within |HWA| < 0.5 deg. Limit: ≤ 0.4 N·m. Only run09 and run10 fail, both at 25 °C / 13.5 V, measuring ~0.65 N·m. All other rateA runs are within limit (0.17–0.39 N·m). Both failing runs carry operator notes.

On-center slope — all 18 rateA runs PASS (spec corrected)

The previous spec value of 0.014 N·m/deg was incorrect. The correct spec is 0.005 N·m/deg ±50 % (band: 0.0025–0.0075 N·m/deg). All 18 evaluated rateA runs measure 3.51–6.82 × 10⁻³ N·m/deg.

The prior version of this report showed 18 FAILs on this metric. Those were entirely an artefact of the incorrect spec value (0.014 instead of 0.005 N·m/deg). With the corrected spec, this metric is clean across the full campaign.

What the data shows

5 failures across 2 metrics. 4 of 6 metrics are clean campaign-wide.

  • FB torque at full lock — 3 FAILs at 80 °C. Runs 19, 20, 25 measure ~5.38 N·m vs upper limit 5.0 N·m. All other conditions pass.
  • On-center hysteresis — 2 FAILs at 25 °C / 13.5 V. Runs 09 and 10 measure ~0.65 N·m vs limit 0.4 N·m. Both have operator notes.
  • Steering ratio, motor torque, motor current, on-center slope — all PASS. Steering ratio is 15.000 ± 0.001 across all 27 runs.

Spec correction. On-center slope spec updated from 0.014 to 0.005 N·m/deg (±50 % tolerance). This change converts 18 previous FAILs to PASSes. 27 runs × 5 sources = 135 files.

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 fault-injection campaign. If the week that disappears before the first plot sounds familiar, we would like to talk: founders@movedot.com, or www.movedot.ai.