Flight Controller выполняет жёсткий полётный контур. Companion SBC обслуживает видео, маршрутизацию, API и внешнюю связь. Mission Control выбирает прямой USB, LAN‑путь или remote relay, не смешивая их ответственность.
End-to-end поток описан как целевая архитектура; задержка и частоты остаются проектными ориентирами до измерений KairOS.
Репозиторий KairOS ↗На этой странице +
Два компьютера на борту — разные обязанности
Flight Controller управляет motors, stabilization, GPS и sensors. Companion computer — Raspberry Pi, Radxa, Jetson или другой Linux SBC — запускает KairOS Drone Agent и не заменяет FC: он добавляет video, telemetry relay, cloud connectivity, radio, REST API и extensions.
На земле Mission Control работает в браузере. Он может обращаться к FC напрямую по WebSerial, к Drone Agent по LAN, либо к удалённому relay через MQTT/Convex и WebRTC signaling. Ground Agent добавляется в WFB-ng‑сценарии и превращает radio receive в понятный локальный web‑контур.
Полный круг telemetry, command и video
FC → Agent
MAVLink UART обычно работает в диапазоне 115200–921600 baud; agent ждёт heartbeat и определяет firmware.
Agent → local consumers
Router распределяет raw MAVLink в IPC socket, WebSocket, cloud service и health state.
Agent → cloud
Целевой контур публикует telemetry примерно 2 Hz и status через HTTP/MQTT paths.
Camera → browser
V4L2 capture проходит H.264 encode, MediaMTX/RTSP и выбранный WHEP, WebRTC или WFB-ng transport.
GCS → FC
Arm, mode, mission и другие команды идут обратно тем же выбранным path; FC выполняет pre-arm rules.
ACK → UI
Command acknowledgement и новые heartbeat/state возвращаются, после чего UI меняет статус.
Прямой USB, локальная сеть и remote P2P
| Режим | Транспорт | Когда использовать | Целевой ориентир |
|---|---|---|---|
| Direct USB | WebSerial → FC, agent не нужен | Bench, configuration, calibration, firmware | Проектная цель <10 ms |
| LAN Direct | REST :8080, MAVLink WS :8765, WHEP :8889 | Indoor, short range, development, field LAN | Цель: video 50–150 ms; telemetry <100 ms |
| P2P remote | 4G/Internet, MQTT SDP signaling, WebRTC, Convex | Удалённое наблюдение и second path | Цель: video 100–300 ms; telemetry 2–5 Hz |
Auto transport должен сначала искать LAN‑путь около четырёх секунд, затем переходить к P2P signaling с окном около четырнадцати секунд. Это проектные интервалы: они зависят от сети и не являются KairOS SLA.
Router обслуживает heartbeat, streams и несколько клиентов
- Agent отправляет companion heartbeat 1 Hz с MAV_TYPE_ONBOARD_CONTROLLER.
- После FC heartbeat он запрашивает attitude, GPS, battery, RC и sensors.
- Stream requests повторяются примерно каждые 30 секунд, чтобы переживать reboot или смену состояния FC.
- Типовые ports: /dev/ttyS0, /dev/ttyUSB0, /dev/ttyACM*; board profile задаёт приоритет автопоиска.
- IPC socket /run/kairos/mavlink.sock несёт binary frames другим сервисам.
- Mission Control парсит MAVLink v2 с CRC; ArduPilot/PX4 используют MAVLink, Betaflight/iNav — MSP v1/v2.
Flight Controller UART
│
▼
kairos-mavlink router
├─ /run/kairos/mavlink.sock
├─ /run/kairos/state.sock
├─ WebSocket :8765
├─ TCP :5760 / UDP :14550
└─ optional cloud relayОт V4L2 capture до native H.264 playback
Capture
USB UVC или MIPI CSI открывается через V4L2; доступный format и resolution проверяются до запуска.
Encode
ffmpeg использует H.264 high profile, level 4.1, yuv420p и low-latency flags; hardware encoder выбирается при наличии.
Publish
Encoded stream публикуется в MediaMTX/RTSP и становится источником дальнейших transports.
LAN
WHEP выдаёт WebRTC напрямую на локальный browser.
Remote
MQTT переносит SDP signaling, после чего media идёт P2P WebRTC либо через relay при необходимости.
Radio
wfb_tx отправляет H.264 по WFB-ng, Ground Agent принимает и повторно публикует локально.
Параметры nobuffer, low_delay и малый probe size уменьшают очередь, но реальная latency определяется capture, encoder, bitrate, FEC, radio, network и browser decode. KairOS будет публиковать измерения по конкретным профилям, а не одну универсальную цифру.
MQTT для real-time, Convex для состояния и command queue
Целевой KairOS Agent публикует telemetry в MQTT примерно 2 Hz. MQTT-to-Convex bridge агрегирует состояние с debounce около трёх секунд на устройство, а browser получает reactive queries. Команды записываются в Convex, agent polling забирает pending item, преобразует в MAVLink и возвращает ACK.
Telemetry: FC → Agent → MQTT → bridge → Convex → Mission Control
Commands: Mission Control → Convex queue → Agent poll → MAVLink → FC
Video: Camera → Agent → MQTT SDP → P2P WebRTC → BrowserПолевой узел переводит radio receive в локальные интерфейсы
| Клиент | Путь |
|---|---|
| Laptop | Wi‑Fi AP, Ethernet или USB CDC-NCM tether |
| Phone / tablet | Browser в той же локальной сети или KairOS Android track |
| Field monitor | HDMI + Chromium kiosk |
| Mission Control | Ground-station profile с источниками video/telemetry |
Profile literal называется ground-station. Это один codebase с Drone Agent, но другой набор enabled services: receive вместо onboard encode, AP/tether/kiosk вместо FC‑centric onboarding.
Stores разделяют vehicle, telemetry, mission и transport
| Store | Ответственность |
|---|---|
| drone-manager | Nodes, connection paths и active vehicle |
| telemetry-store | Живое состояние и ring buffer на 300 samples |
| mission-store | Waypoints, patterns, validation, upload state |
| video-store | Sources, transport, playback и errors |
| settings-store | IndexedDB persistence и migrations |
| ground-station-store | Receivers, relay path, sources и field IO |
Arm — это подтверждённая цепочка, а не локальное переключение
Operator intent
Mission Control вызывает protocol.arm() после явного подтверждения.
Protocol
Создаётся MAV_CMD_COMPONENT_ARM_DISARM, command #400.
Transport
Frame идёт через WebSocket/LAN либо Convex/cloud path к Agent.
Serial
Agent передаёт command во FC и не выдаёт себя за арбитра pre-arm checks.
FC validation
Firmware проверяет sensors, GPS, battery, safety switch, EKF и configured failsafes.
State confirmation
HEARTBEAT base_mode bit 7 и ACK возвращаются через IPC/MQTT; UI показывает ARMED только после подтверждения.

