08d787d977
- ISO-TP (ISO 15765-2): нативный CAN-OBD требует can-isotp/CAN_ISOTP для multiframe (Mode 03 DTC, Mode 09 VIN), не голый socketcan; адресация 0x7DF/0x7E8..0x7EF - планировщик опроса: бюджет req/s на транспорт (ELM327 half-duplex) + приоритеты PID, round-robin при насыщении; эффективная частота = min(desired, потолок, доля бюджета) - §5a безопасность активного опроса: гейт по движению, предпочтение passive listen-only, fail-safe при аномалиях шины, риск ретрофита; «безобидность» read-запросов условна - §5b отказ/восстановление транспорта: bus-off + restart-ms, ELM327 reconnect, Online=false → unavailable, без зависания (#4) - владение computed: core (состояние/мгновенный расход) vs плагин (trip-производные) - tech-stack: CAN/OBD row + ISO-TP Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
86 lines
5.5 KiB
Markdown
86 lines
5.5 KiB
Markdown
# Технический стек
|
||
|
||
> Канонический список технологий Штурмана с обоснованием — источник правды по
|
||
> «на чём пишем». Архитектурные *решения* — в [architecture.md](architecture.md);
|
||
> здесь — конкретные технологии и крейты.
|
||
|
||
Статус: **v1 (на ревью).**
|
||
Связано с: [architecture.md](architecture.md) · [principles.md](principles.md) (#11 отзывчивость, #12 лицензии) · [dev-environment.md](dev-environment.md)
|
||
|
||
---
|
||
|
||
## Язык: Rust-first, один прод-рантайм
|
||
|
||
**Всё, что мы шипим, — на Rust.** Core, SDK, shell и весь прикладной слой,
|
||
включая ассистента.
|
||
|
||
- **Почему:** один тулчейн, минимальный footprint (важно на RK3588 и 16 ГБ-dev),
|
||
единый sandbox-профиль, безопасность памяти, перформанс (принцип #11 — отзывчивость).
|
||
- **ML без Python в проде:** STT/TTS/VAD — через **ONNX Runtime** (крейт `ort`) и
|
||
нативные биндинги (Vosk, llama.cpp); облачные LLM — обычный HTTP. PyTorch в прод
|
||
не тащим.
|
||
- **Python — только в dev:** прототипы, Vehicle Simulator, скрипты, CI-утилиты.
|
||
- **Escape-hatch:** если у конкретной ML-возможности нет вменяемого Rust-пути —
|
||
она шипится **изолированным Python-sidecar процессом** (архитектура позволяет:
|
||
всё и так отдельные процессы на D-Bus + sandbox). Это исключение, не правило.
|
||
- **SDK язык-агностичен для плагинов:** транспорт — D-Bus, поэтому сторонний
|
||
плагин можно писать на любом языке. Биндинги: **Rust — first-class**, другие
|
||
(Python…) — по мере нужды экосистемы.
|
||
|
||
---
|
||
|
||
## Полный стек
|
||
|
||
| Слой / концерн | Выбор | Примечание |
|
||
|----------------|-------|------------|
|
||
| **Языки (прод)** | **Rust** | единственный шипимый рантайм |
|
||
| **Языки (dev)** | Python | прототипы, Vehicle Simulator, скрипты — не в проде |
|
||
| **UI** | **Slint** | декларативный, GPU-ускоренный, Rust-native |
|
||
| **Графика** | **Wayland** — shell = кастомный композитор на `smithay` (Rust) · Panfrost/Mesa | `cage` не годится (single-app) — только ранний bring-up |
|
||
| **Аудио/видео plane** | **PipeWire** + WirePlumber | микрофон, TTS, медиа, BT-аудио |
|
||
| **IPC (control plane)** | **D-Bus** | низкополосное управление и события |
|
||
| **Песочница** | **bubblewrap** + systemd-hardening | апы/плагины; WASM-тир — позже |
|
||
| **OS base** | Armbian/Debian (RK3588), ядро ближе к mainline | read-only rootfs + overlay |
|
||
| **Init / lifecycle** | **systemd** | ядро; апы/плагины — App-Host |
|
||
| **CAN/OBD (read-only)** | **SocketCAN** (`socketcan`) + **ISO-TP** (`can-isotp`/`CAN_ISOTP`) для нативного OBD | ELM327 (мульти-протокол, прячет ISO-TP) на старте; `python-OBD` — в симуляторе |
|
||
| **Wake-word** | **openWakeWord** | RU-фраза «Штурман»; Porcupine отвергнут (проприетарный, #12) |
|
||
| **VAD** | Silero VAD | через ONNX Runtime |
|
||
| **STT** | Vosk · Silero | офлайн, RU; через биндинги / `ort` |
|
||
| **TTS** | Silero | офлайн, RU |
|
||
| **LLM онлайн** | GigaChat · YandexGPT | HTTP, provider-agnostic, 152-ФЗ |
|
||
| **LLM офлайн** | llama.cpp / Ollama | квантованная мелкая модель |
|
||
| **Карты (фаза 2)** | MapLibre + Valhalla/OSRM | офлайн |
|
||
| **Dev VM** | Lima (vz-backend) | ARM64, нативная виртуализация |
|
||
| **CI** | GitHub Actions, ARM64-Linux | совпадает с таргетом |
|
||
| **Сборка / оркестрация** | Cargo (workspace) + `justfile` | |
|
||
| **Лицензия / гигиена** | **MIT** · `cargo-deny` | без AGPL-заразы (принцип #12) |
|
||
|
||
---
|
||
|
||
## Ключевые крейты (Rust)
|
||
|
||
| Концерн | Крейт |
|
||
|---------|-------|
|
||
| D-Bus | `zbus` |
|
||
| UI | `slint` |
|
||
| Async-рантайм | `tokio` |
|
||
| SocketCAN | `socketcan` |
|
||
| ONNX-инференс (STT/TTS/VAD) | `ort` (ONNX Runtime) |
|
||
| Локальная LLM | биндинги `llama.cpp` |
|
||
| STT (Vosk) | `vosk` |
|
||
| HTTP (облачные LLM) | `reqwest` |
|
||
| Сериализация | `serde` |
|
||
| Логи/трейсинг | `tracing` |
|
||
|
||
> Список крейтов уточняется при проектировании доменов; здесь — опорные.
|
||
|
||
---
|
||
|
||
## Журнал решений (stack)
|
||
|
||
| Решение | Выбор | Дата |
|
||
|---------|-------|------|
|
||
| Язык прод-рантайма | **Rust-first, один рантайм** (Python — dev-only; sidecar как escape-hatch) | 2026-06-16 |
|
||
| ML в проде | ONNX Runtime (`ort`) + нативные биндинги, без PyTorch | 2026-06-16 |
|
||
| SDK для плагинов | язык-агностичен (D-Bus); Rust — first-class | 2026-06-16 |
|