Z27AG decode pass 2: vehicle speed, coolant, front wiper; wheel speeds little-endian; IMU checked against GNSS
/ crosscheck (push) Successful in 1s
Rust consumers (L4T) / Clippy, test, build, glibc for every service that compiles contracts in (push) Successful in 22s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
This commit is contained in:
2026-10-15 20:15:07 +09:00
parent b52a7dcedb
commit 0af2c956e4
2 changed files with 112 additions and 2 deletions
+60
View File
@@ -0,0 +1,60 @@
---
type: report
date: 2026-10-15
---
# Z27AG CAN: second pass, against OBD-II and GNSS
Sessions `000007-20261015T192938` and `000008-20261015T200202` (car Orin): doors, tailgate,
bonnet and wipers (checklist step 10–11), then a short drive with GNSS (3D fix, helix antenna)
and OBD-II through the ELM327 on the K-line, all on the Orin's clock. The first time CAN, OBD-II
and GNSS were recorded together. About 30 minutes; 1190 OBD-II samples of each fast value.
## Confirmed
| Signal | Where | Evidence | Registered as |
|---|---|---|---|
| Engine speed | `210` bytes 4–5, BE, 1 rpm (pass 1) | equal to OBD-II `0C`: median ratio 1.0000, median difference 4 rpm, 1190 samples | `engine_rpm` (unchanged) |
| Coolant temperature | `449` byte 2, −40 °C | equal to OBD-II `05` within ±1 °C (median 0.0) over 86–97 °C; no other byte tracks it | `coolant_temp_c` |
| Vehicle speed | `231` bytes 6–7, **little-endian**, **0.0577 km/h per count** | steady cruising (> 15 km/h, GNSS change < 1 km/h over 2 s, 117 fixes): spread 2.6 % against GNSS | `vehicle_speed_kph` |
| Four wheel speeds | `235` four words, **little-endian** (pass 1 left the byte order open) | big-endian misses by 28 km/h rms; little-endian fits. Words 0, 1: 0.0578; words 2, 3: 0.0581 km/h per count against GNSS | not yet: which word is which wheel waits for the jack-stands run (fronts turn, rears stay) |
Scales are against **GNSS**, so they include this car's tyres today. **OBD-II speed reads 3 % low**
against GNSS (0.9706): the ECU's figure is no better a reference than the ABS frames. The two
word pairs of `235` differ by 0.5 %, the usual size of a front/rear tyre difference.
## Doors, tailgate, bonnet, wipers
| Thing | Bit | Notes |
|---|---|---|
| Driver's door | `423.0.4` | its own bit (pass 1); also sets any-door |
| Passenger, rear left, rear right | only `423.2.1` (any door) | no bit of their own |
| Tailgate | only `423.2.1` | with the driver's door open, `423.0.4` cleared on closing it while `423.2.1` stayed set until the tailgate shut |
| Bonnet | nothing | a mechanical latch with no switch, as expected |
| Front wiper running | `423.3.3` | set through "low" and "high"; nothing in a 4 s "interval" window. Medium confidence; also explains pass 1's unexplained `423.3.3` stretch |
## IMU calibration, checked against GNSS
Level from session `000006` (two still stretches, the ground's 1.9° slope cancelled), forward from
`000008` (three stops, one launch; 3512 samples, mean spread 12.7°). The module sits upside down,
about 24° off level, turned so its X axis points forward. Calibrated, the marked stretches read:
| Stretch | IMU longitudinal (0.25 s mean, peak) | GNSS |
|---|---|---|
| Stop, 48 → 0 km/h | −0.35 g | −0.28 g |
| Stop, 45 → 0 | −0.17 g | −0.17 g |
| Stop, 40 → 0 | −0.21 g | −0.18 g |
| Launch | +0.32 g | +0.36 g |
Lateral stays at about 0 in all four: forward is straight ahead. GNSS reports about once a second,
which smooths short peaks.
## Not found
- **Intake air temperature:** no byte of `449` tracks OBD-II `0F` (29–51 °C here).
- `449` bytes 0, 1, 3 move like temperatures but match nothing on OBD-II.
## Notes on the recording
- **The Orin froze mid-drive** (19:59; hardware watchdog reset at 20:01:47), splitting the drive
over two sessions. orin-nano-env-setup has the investigation.
- OBD-II through the ELM gave each fast value about every 2 s (K-line, ~250 ms per request).
+52 -2
View File
@@ -250,7 +250,7 @@
"unit": "", "unit": "",
"type": "boolean", "type": "boolean",
"source": "z27ag", "source": "z27ag",
"description": "Any door open", "description": "Any door open, the tailgate included (the bonnet has no switch)",
"can": { "can": {
"id": "0x423", "id": "0x423",
"byte": 2, "byte": 2,
@@ -263,7 +263,7 @@
"unit": "", "unit": "",
"type": "boolean", "type": "boolean",
"source": "z27ag", "source": "z27ag",
"description": "Driver's door open", "description": "Driver's door open: the only door with its own bit",
"can": { "can": {
"id": "0x423", "id": "0x423",
"byte": 0, "byte": 0,
@@ -285,6 +285,56 @@
"evidence": "Z27AG-DECODE-1" "evidence": "Z27AG-DECODE-1"
} }
}, },
"vehicle_speed_kph": {
"unit": "kph",
"type": "number",
"source": "z27ag",
"description": "Road speed from the ABS (CAN), scaled against GNSS on this car's tyres: OBD-II speed reads 3 % lower",
"range": [
0,
250
],
"can": {
"id": "0x231",
"byte": 6,
"length": 16,
"order": "little",
"scale": 0.0577,
"offset": 0,
"evidence": "Z27AG-DECODE-2"
}
},
"coolant_temp_c": {
"unit": "celsius",
"type": "number",
"source": "z27ag",
"description": "Engine coolant temperature (CAN): equal to OBD-II's within 1 °C over 86-97 °C",
"range": [
-40,
215
],
"can": {
"id": "0x449",
"byte": 2,
"length": 8,
"scale": 1,
"offset": -40,
"evidence": "Z27AG-DECODE-2"
}
},
"front_wiper": {
"unit": "",
"type": "boolean",
"source": "z27ag",
"description": "Front wiper running (low or high; interval not seen in a 4 s window). Medium confidence",
"can": {
"id": "0x423",
"byte": 3,
"bit": 3,
"length": 1,
"evidence": "Z27AG-DECODE-2"
}
},
"orin_cpu_temp_c": { "orin_cpu_temp_c": {
"unit": "celsius", "unit": "celsius",
"type": "number", "type": "number",