The bus is up: decision 4 accepted; orin-status publishes yukart/host/*
Also: std::process::Command breaks the cross-compile fallback (GLIBC_2.39). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DDwfd6Ki8UfG4hK6W5YpJz
This commit is contained in:
@@ -35,6 +35,7 @@ The Orin runs headless: no local video out. The tablet app is the display.
|
|||||||
| `decoder` | Raw frames → named signals via DBC | No |
|
| `decoder` | Raw frames → named signals via DBC | No |
|
||||||
| `recorder` | Persist raw + decoded sessions to disk; raw CAN and GNSS read directly, not via the bus (decision 25) | No |
|
| `recorder` | Persist raw + decoded sessions to disk; raw CAN and GNSS read directly, not via the bus (decision 25) | No |
|
||||||
| `telemetry-gw` | Serve external display clients | No |
|
| `telemetry-gw` | Serve external display clients | No |
|
||||||
|
| `orin-status` | The Orin's own health: temperatures, CPU/GPU load, memory, network links, UPS battery → `yukart/host/*` | No |
|
||||||
| `vision` | Camera capture (any V4L2 camera; in practice USB UVC, MJPEG), live view, software H.264 recording; on-device inference later. Repo `svc-vision`, Python (decision 29) | No |
|
| `vision` | Camera capture (any V4L2 camera; in practice USB UVC, MJPEG), live view, software H.264 recording; on-device inference later. Repo `svc-vision`, Python (decision 29) | No |
|
||||||
|
|
||||||
Each ships as a systemd unit. The host-level prerequisites they depend on
|
Each ships as a systemd unit. The host-level prerequisites they depend on
|
||||||
@@ -60,7 +61,7 @@ traffic; discovered signals are recorded as a DBC rather than as code.
|
|||||||
|
|
||||||
## Message bus
|
## Message bus
|
||||||
|
|
||||||
**Proposed: MQTT (mosquitto) on the Jetson.** Rationale:
|
**MQTT (mosquitto) on the Jetson**, listening on localhost only: displays reach the bus through `svc-gw`. Rationale:
|
||||||
|
|
||||||
- First-class client libraries on every display target — ESP32 (Arduino
|
- First-class client libraries on every display target — ESP32 (Arduino
|
||||||
`PubSubClient` / ESP-IDF) and Android (Paho) — which is the deciding factor.
|
`PubSubClient` / ESP-IDF) and Android (Paho) — which is the deciding factor.
|
||||||
@@ -74,6 +75,7 @@ traffic; discovered signals are recorded as a DBC rather than as code.
|
|||||||
yukart/can/raw high-rate raw frames, not retained
|
yukart/can/raw high-rate raw frames, not retained
|
||||||
yukart/vehicle/<signal> decoded signals (rpm, speed, coolant, …), retained
|
yukart/vehicle/<signal> decoded signals (rpm, speed, coolant, …), retained
|
||||||
yukart/gnss/fix position/speed/time, retained
|
yukart/gnss/fix position/speed/time, retained
|
||||||
|
yukart/host/<signal> the Orin itself: temperatures, load, links, UPS battery, retained
|
||||||
yukart/system/<service> health and status, retained
|
yukart/system/<service> health and status, retained
|
||||||
yukart/nav/guidance next manoeuvre, distance, street name, retained
|
yukart/nav/guidance next manoeuvre, distance, street name, retained
|
||||||
yukart/nav/route active route geometry, retained
|
yukart/nav/route active route geometry, retained
|
||||||
@@ -350,7 +352,7 @@ rewriting the document.
|
|||||||
| 1 | Separate services over a message bus, not one process | Accepted | 2026-08-14 |
|
| 1 | Separate services over a message bus, not one process | Accepted | 2026-08-14 |
|
||||||
| 2 | Displays are bus subscribers; no display-specific logic upstream | Accepted | 2026-08-14 |
|
| 2 | Displays are bus subscribers; no display-specific logic upstream | Accepted | 2026-08-14 |
|
||||||
| 3 | Listen-only sniffing + active OBD-II, single writer | Accepted | 2026-08-14 |
|
| 3 | Listen-only sniffing + active OBD-II, single writer | Accepted | 2026-08-14 |
|
||||||
| 4 | MQTT as the bus | **Proposed** | 2026-08-14 |
|
| 4 | MQTT as the bus (raw CAN rate still to confirm) | Accepted | 2026-10-12 |
|
||||||
| 5 | Rust for on-Orin services, Python for off-car tooling, Dart for the display client. One exception: decision 29 | Accepted | 2026-09-04 |
|
| 5 | Rust for on-Orin services, Python for off-car tooling, Dart for the display client. One exception: decision 29 | Accepted | 2026-09-04 |
|
||||||
| 21 | Two clocks per envelope; `monotonic` orders, `timestamp` references | Accepted | 2026-09-05 |
|
| 21 | Two clocks per envelope; `monotonic` orders, `timestamp` references | Accepted | 2026-09-05 |
|
||||||
| 22 | `signals.json` is the single source for signal name and unit; both are derived, never authored twice | Accepted | 2026-09-05 |
|
| 22 | `signals.json` is the single source for signal name and unit; both are derived, never authored twice | Accepted | 2026-09-05 |
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ Ordered by what is lost if a tier is late.
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 0 | kernel modules, gpsd, network | Host layer; nothing of ours can precede it |
|
| 0 | kernel modules, gpsd, network | Host layer; nothing of ours can precede it |
|
||||||
| 1 | `mosquitto`, `can-bridge`, `recorder` | **Data is lost if late.** Must reach ready fastest |
|
| 1 | `mosquitto`, `can-bridge`, `recorder` | **Data is lost if late.** Must reach ready fastest |
|
||||||
| 2 | `decoder`, `gnss`, `obd-poller` | Derive from tier 1; a late start loses nothing |
|
| 2 | `decoder`, `gnss`, `obd-poller`, `orin-status` | Derive from tier 1; a late start loses nothing |
|
||||||
| 3 | `svc-gw`, `svc-nav`, `svc-vision` | Serving; a display can wait |
|
| 3 | `svc-gw`, `svc-nav`, `svc-vision` | Serving; a display can wait |
|
||||||
| 4 | voice — ASR, TTS | Interactive; seconds late is harmless |
|
| 4 | voice — ASR, TTS | Interactive; seconds late is harmless |
|
||||||
|
|
||||||
|
|||||||
@@ -215,6 +215,13 @@ because everything above 2.30 comes from one event: glibc 2.34 merged
|
|||||||
`libpthread` and `libdl` into `libc` and re-versioned the moved symbols. Stable,
|
`libpthread` and `libdl` into `libc` and re-versioned the moved symbols. Stable,
|
||||||
but not guaranteed the way a native build is.
|
but not guaranteed the way a native build is.
|
||||||
|
|
||||||
|
⚠ **`std::process::Command` breaks it.** Any binary that spawns a process links
|
||||||
|
`pidfd_spawnp` and `pidfd_getpid` (GLIBC_2.39) from the workstation's sysroot.
|
||||||
|
They are weak references, but the version requirement is not, so the car Orin
|
||||||
|
refuses to load the binary. `check-glibc.sh` catches it; such binaries build
|
||||||
|
natively (svc-core's `orin-status` runs `mmcli`, so its deploy script builds on
|
||||||
|
the development Orin).
|
||||||
|
|
||||||
### Writing style
|
### Writing style
|
||||||
|
|
||||||
Documents describe **what is and what will be**. They are not changelogs — git
|
Documents describe **what is and what will be**. They are not changelogs — git
|
||||||
|
|||||||
+4
-2
@@ -67,8 +67,10 @@ provides a cross-check for reverse-engineered ones.
|
|||||||
|
|
||||||
## Phase 3 — Bus and contracts
|
## Phase 3 — Bus and contracts
|
||||||
|
|
||||||
- [ ] Stand up the broker; confirm MQTT holds up at real CAN rates (decision 4
|
- [x] Stand up the broker, 2026-10-12: mosquitto 2.0.11 on the car Orin,
|
||||||
in [ARCHITECTURE.md](ARCHITECTURE.md) is still *proposed*)
|
localhost only. First publisher `orin-status` (svc-core,
|
||||||
|
`yukart/host/*`); `svc-gw` subscribes and serves it to the tablet
|
||||||
|
- [ ] Confirm MQTT holds up at real CAN rates (`yukart/can/raw`)
|
||||||
- [ ] Freeze v1 of topic names and payload schemas
|
- [ ] Freeze v1 of topic names and payload schemas
|
||||||
- [ ] `telemetry-gw` — external client access, including the serial bridge
|
- [ ] `telemetry-gw` — external client access, including the serial bridge
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user