diff --git a/docs/impl/reports/Z27AG-DECODE-2.md b/docs/impl/reports/Z27AG-DECODE-2.md index ca87a7a..50a80eb 100644 --- a/docs/impl/reports/Z27AG-DECODE-2.md +++ b/docs/impl/reports/Z27AG-DECODE-2.md @@ -48,6 +48,24 @@ about 24° off level, turned so its X axis points forward. Calibrated, the marke Lateral stays at about 0 in all four: forward is straight ahead. GNSS reports about once a second, which smooths short peaks. +## Session 000009: lights at night, corners + +`z27ag-20261015-203117-lights-corners-drive`: step 9 at night, then a 35-minute errand drive +(no OBD-II: the obd-poller was off after the freeze). References: GNSS and the calibrated IMU. + +| Signal | Where | Evidence | Registered as | +|---|---|---|---| +| Main beam | `423.2.7` | set exactly through the marked stretch; also fired once with the other lights off: flash-to-pass | `main_beam` | +| Front fog lamps | `423.2.4` | set exactly through the marked stretch (lights on) | `front_fogs` | +| **Steering wheel angle** | `0C0` bytes 0–1, little-endian, **signed**, **0.1° per count**, positive left | correlation **+0.995** with how sharply the car turns (IMU yaw rate ÷ speed), 1021 s of driving. Lock to lock −479…+471°; with a 2.5 m wheelbase that is a 16.3:1 steering ratio, typical. Straight driving reads −2.7° (camber or alignment) | `steering_angle_deg` (the layout format gained `signed`) | +| Dipped beam? | `423.3.1` | clean in daylight on the 13th; at night it flickers on for 0.1–0.2 s at each switch movement. The cluster has **no dipped-beam lamp** (only side lights, main beam and fogs, no rear fogs), and `423` matches the cluster's lamps, so this bit is probably something else that moves with the lights (illumination, dimming). A walk through Off → Auto → Dim → Main settles it | `dipped_beam` kept, description says so | + +**IMU, lateral axis:** lateral g against speed × yaw rate gives a slope of **−0.998** (correlation +−0.91; the sign is right: yaw counts a left turn positive, lateral g counts right positive). With the +stops above, both horizontal axes of the calibration are confirmed. + +`149` bytes 1–2 is not a yaw-rate sensor (correlation 0.02 with the IMU's yaw rate). + ## Not found - **Intake air temperature:** no byte of `449` tracks OBD-II `0F` (29–51 °C here). diff --git a/schema/signals.json b/schema/signals.json index 3f9d63a..7147adb 100644 --- a/schema/signals.json +++ b/schema/signals.json @@ -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/. source=imu is the WT61 IMU, already turned into the car's frame (mounting and gravity handled by its publisher), on yukart/imu/. 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), 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/. source=imu is the WT61 IMU, already turned into the car's frame (mounting and gravity handled by its publisher), on yukart/imu/. 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.", "signals": { "obd_vehicle_speed_kph": { "unit": "kph", @@ -168,6 +168,26 @@ "evidence": "Z27AG-DECODE-1" } }, + "steering_angle_deg": { + "unit": "degree", + "type": "number", + "source": "z27ag", + "description": "Steering wheel angle: positive to the left. About -2.7° driving straight; lock to lock about ±475° (ratio about 16:1)", + "range": [ + -600, + 600 + ], + "can": { + "id": "0x0C0", + "byte": 0, + "length": 16, + "order": "little", + "signed": true, + "scale": 0.1, + "offset": 0, + "evidence": "Z27AG-DECODE-2" + } + }, "brake_pedal": { "unit": "", "type": "boolean", @@ -237,7 +257,7 @@ "unit": "", "type": "boolean", "source": "z27ag", - "description": "Dipped headlights on", + "description": "Probably not dipped beam: clean in daylight (2026-10-13) but flickering at each switch movement at night (2026-10-15), and the Z27AG's cluster has no dipped-beam lamp (side lights, main beam and fogs only), so frame 423, the cluster's status, has little reason to carry it. Kept under this name until a light-switch walk shows what it is", "can": { "id": "0x423", "byte": 3, @@ -246,6 +266,32 @@ "evidence": "Z27AG-DECODE-1" } }, + "main_beam": { + "unit": "", + "type": "boolean", + "source": "z27ag", + "description": "Main beam lamp on, flash-to-pass included", + "can": { + "id": "0x423", + "byte": 2, + "bit": 7, + "length": 1, + "evidence": "Z27AG-DECODE-2" + } + }, + "front_fogs": { + "unit": "", + "type": "boolean", + "source": "z27ag", + "description": "Front fog lamps on (they need side lights or dipped beam)", + "can": { + "id": "0x423", + "byte": 2, + "bit": 4, + "length": 1, + "evidence": "Z27AG-DECODE-2" + } + }, "door_open": { "unit": "", "type": "boolean",