Z27AG decode pass 3: wheel positions from corners, odometer (570, 24-bit); layouts can be 24 bits
/ crosscheck (push) Successful in 1s
Rust consumers (L4T) / Clippy, test, build, glibc for every service that compiles contracts in (push) Successful in 25s

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 22:13:34 +09:00
parent 642be2a5e1
commit e8ba581985
3 changed files with 157 additions and 3 deletions
+96 -1
View File
@@ -1,5 +1,5 @@
{
"$comment": "Single source for signal identity. Topic name and envelope unit are both derived from these entries and are never authored separately. source=obd2 is standardised (OBD-II mode 01 over the K-line, through the ELM327): calibration references, every name prefixed obd_ (project-yukart decision 30); source=host is the Orin itself (orin-status), not the car. source=gnss is the receiver (svc-core gnss), on yukart/gnss/<signal>. source=imu is the WT61 IMU, already turned into the car's frame (mounting and gravity handled by its publisher), on yukart/imu/<signal>. source=z27ag is reverse-engineered from the car's own broadcast frames, and its 'can' block is the only place its layout is written down: id (11-bit, hex string), byte (first data byte, 0-7), length in bits (1, 8 or 16), bit (length 1 only: 0 = LSB of that byte), order (length 16: big = byte first is most significant, little = the reverse), signed (lengths 8 and 16: two's complement; default unsigned), scale and offset (value = raw * scale + offset; booleans are raw != 0). 'evidence' names the contracts report that found it.",
"$comment": "Single source for signal identity. Topic name and envelope unit are both derived from these entries and are never authored separately. source=obd2 is standardised (OBD-II mode 01 over the K-line, through the ELM327): calibration references, every name prefixed obd_ (project-yukart decision 30); source=host is the Orin itself (orin-status), not the car. source=gnss is the receiver (svc-core gnss), on yukart/gnss/<signal>. source=imu is the WT61 IMU, already turned into the car's frame (mounting and gravity handled by its publisher), on yukart/imu/<signal>. source=z27ag is reverse-engineered from the car's own broadcast frames, and its 'can' block is the only place its layout is written down: id (11-bit, hex string), byte (first data byte, 0-7), length in bits (1, 8, 16 or 24), bit (length 1 only: 0 = LSB of that byte), order (lengths 16 and 24: big = byte first is most significant, little = the reverse), signed (lengths 8 and up: two's complement; default unsigned), scale and offset (value = raw * scale + offset; booleans are raw != 0). 'evidence' names the contracts report that found it.",
"signals": {
"obd_vehicle_speed_kph": {
"unit": "kph",
@@ -350,6 +350,101 @@
"evidence": "Z27AG-DECODE-2"
}
},
"wheel_speed_fr_kph": {
"unit": "kph",
"type": "number",
"source": "z27ag",
"description": "Front right wheel speed from the ABS (CAN), scaled against GNSS while cruising. Which word is which wheel: from cornering (outer wheels faster, fronts on a wider arc than rears), not yet checked on jack stands",
"range": [
0,
250
],
"can": {
"id": "0x235",
"byte": 0,
"length": 16,
"order": "little",
"scale": 0.0578,
"offset": 0,
"evidence": "Z27AG-DECODE-3"
}
},
"wheel_speed_fl_kph": {
"unit": "kph",
"type": "number",
"source": "z27ag",
"description": "Front left wheel speed from the ABS (CAN), scaled against GNSS while cruising. Which word is which wheel: from cornering (outer wheels faster, fronts on a wider arc than rears), not yet checked on jack stands",
"range": [
0,
250
],
"can": {
"id": "0x235",
"byte": 2,
"length": 16,
"order": "little",
"scale": 0.0578,
"offset": 0,
"evidence": "Z27AG-DECODE-3"
}
},
"wheel_speed_rr_kph": {
"unit": "kph",
"type": "number",
"source": "z27ag",
"description": "Rear right wheel speed from the ABS (CAN), scaled against GNSS while cruising. Which word is which wheel: from cornering (outer wheels faster, fronts on a wider arc than rears), not yet checked on jack stands",
"range": [
0,
250
],
"can": {
"id": "0x235",
"byte": 4,
"length": 16,
"order": "little",
"scale": 0.0581,
"offset": 0,
"evidence": "Z27AG-DECODE-3"
}
},
"wheel_speed_rl_kph": {
"unit": "kph",
"type": "number",
"source": "z27ag",
"description": "Rear left wheel speed from the ABS (CAN), scaled against GNSS while cruising. Which word is which wheel: from cornering (outer wheels faster, fronts on a wider arc than rears), not yet checked on jack stands",
"range": [
0,
250
],
"can": {
"id": "0x235",
"byte": 6,
"length": 16,
"order": "little",
"scale": 0.0581,
"offset": 0,
"evidence": "Z27AG-DECODE-3"
}
},
"odometer_km": {
"unit": "km",
"type": "number",
"source": "z27ag",
"description": "Total distance (CAN), whole kilometres: steps once per kilometre driven (12 steps over 11.9 km). Not yet compared with the cluster's display",
"range": [
0,
16777215
],
"can": {
"id": "0x570",
"byte": 4,
"length": 24,
"order": "little",
"scale": 1,
"offset": 0,
"evidence": "Z27AG-DECODE-3"
}
},
"coolant_temp_c": {
"unit": "celsius",
"type": "number",