O controlador de voo executa o ciclo de voo de tempo real estrito. O SBC auxiliar gere vídeo, encaminhamento, API e comunicações externas. Mission Control escolhe USB direto, caminho LAN ou retransmissão remota sem misturar responsabilidades.
O fluxo de ponta a ponta é descrito como arquitetura prevista; latência e frequências são referências de projeto até às medições KairOS.
Repositório KairOS ↗Nesta página +
Dois computadores a bordo, responsabilidades diferentes
O controlador de voo gere motores, estabilização, GPS e sensores. O computador auxiliar — Raspberry Pi, Radxa, Jetson ou outro SBC Linux — executa KairOS Drone Agent e não substitui o FC: acrescenta vídeo, retransmissão de telemetria, conectividade na nuvem, rádio, API REST e extensões.
Em terra, Mission Control funciona no navegador. Pode aceder ao FC diretamente por WebSerial, ao Drone Agent por LAN ou a um retransmissor remoto por MQTT/Convex e sinalização WebRTC. Ground Agent é adicionado no cenário WFB-ng e transforma a receção de rádio num ambiente web local compreensível.
Ciclo completo de telemetria, comandos e vídeo
FC → Agente
MAVLink UART funciona habitualmente entre 115200 e 921600 baud; o agente espera pelo heartbeat e identifica o firmware.
Agente → consumidores locais
O encaminhador distribui MAVLink em bruto ao socket IPC, WebSocket, serviço na nuvem e estado de saúde.
Agente → nuvem
O sistema previsto publica telemetria a cerca de 2 Hz e estado através de caminhos HTTP/MQTT.
Câmara → navegador
A captura V4L2 passa por codificação H.264, MediaMTX/RTSP e transporte WHEP, WebRTC ou WFB-ng escolhido.
GCS → FC
Armamento, modo, missão e outros comandos regressam pelo mesmo caminho selecionado; o FC aplica as regras de pré-armamento.
ACK → interface
A confirmação do comando e novos heartbeat/estados regressam, após o que a interface atualiza o estado.
USB direto, rede local e P2P remoto
| Modo | Transporte | Quando utilizar | Referência prevista |
|---|---|---|---|
| USB direto | WebSerial → FC, sem necessidade de agente | Bancada, configuração, calibração e firmware | Objetivo de projeto <10 ms |
| LAN direta | REST :8080, MAVLink WS :8765, WHEP :8889 | Interiores, curto alcance, desenvolvimento e LAN de campo | Objetivo: vídeo 50–150 ms; telemetria <100 ms |
| P2P remoto | 4G/Internet, sinalização SDP por MQTT, WebRTC e Convex | Observação remota e segunda via | Objetivo: vídeo 100–300 ms; telemetria 2–5 Hz |
O transporte automático deverá procurar primeiro um caminho LAN durante cerca de quatro segundos e depois passar à sinalização P2P numa janela de cerca de catorze segundos. São intervalos de projeto: dependem da rede e não constituem um SLA KairOS.
O encaminhador gere heartbeat, fluxos e vários clientes
- O agente envia heartbeat de controlador a bordo a 1 Hz com MAV_TYPE_ONBOARD_CONTROLLER.
- Após o heartbeat do FC, solicita atitude, GPS, bateria, RC e sensores.
- Os pedidos de fluxos repetem-se aproximadamente a cada 30 segundos para tolerar reinício ou mudança de estado do FC.
- Portas típicas: /dev/ttyS0, /dev/ttyUSB0, /dev/ttyACM*; o perfil da placa define a prioridade de procura automática.
- O socket IPC /run/kairos/mavlink.sock transporta tramas binárias para outros serviços.
- Mission Control interpreta MAVLink v2 com CRC; ArduPilot/PX4 usa MAVLink, Betaflight/iNav usa 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 relayDa captura V4L2 à reprodução H.264 nativa
Captura
USB UVC ou MIPI CSI é aberto por V4L2; formato e resolução disponíveis são verificados antes do início.
Codificação
ffmpeg usa H.264 high profile, nível 4.1, yuv420p e opções de baixa latência; seleciona codificador por hardware quando disponível.
Publicação
O fluxo codificado é publicado em MediaMTX/RTSP e torna-se fonte dos transportes seguintes.
LAN
WHEP fornece WebRTC diretamente ao navegador local.
Remoto
MQTT transporta sinalização SDP; depois os dados multimédia seguem por WebRTC P2P ou por retransmissor quando necessário.
Rádio
wfb_tx envia H.264 por WFB-ng; Ground Agent recebe e republica localmente.
As opções nobuffer, low_delay e pequeno tamanho de sondagem reduzem a fila, mas a latência real depende de captura, codificador, débito, FEC, rádio, rede e descodificação no navegador. KairOS publicará medições por perfis concretos, não um número universal.
MQTT para tempo real, Convex para estado e fila de comandos
O agente KairOS previsto publica telemetria em MQTT a cerca de 2 Hz. A ponte MQTT-to-Convex agrega o estado com espera de estabilização de cerca de três segundos por dispositivo e o navegador recebe consultas reativas. Os comandos são escritos em Convex, o agente recolhe o item pendente por sondagem, converte-o em MAVLink e devolve 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 → BrowserO nó de campo converte receção de rádio em interfaces locais
| Cliente | Via |
|---|---|
| Portátil | Ponto de acesso Wi-Fi, Ethernet ou partilha USB CDC-NCM |
| Telefone / tablet | Navegador na mesma rede local ou linha Android KairOS |
| Monitor de campo | HDMI + quiosque Chromium |
| Mission Control | Perfil de estação terrestre com fontes de vídeo e telemetria |
O literal do perfil é ground-station. Partilha a base de código com Drone Agent, mas ativa outros serviços: receção em vez de codificação a bordo, ponto de acesso/partilha/quiosque em vez de integração centrada no FC.
Os repositórios de estado separam veículo, telemetria, missão e transporte
| Repositório de estado | Responsabilidade |
|---|---|
| drone-manager | Nós, caminhos de ligação e veículo ativo |
| telemetry-store | Estado em direto e buffer circular de 300 amostras |
| mission-store | Pontos de rota, padrões, validação e estado de carregamento |
| video-store | Fontes, transporte, reprodução e erros |
| settings-store | Persistência IndexedDB e migrações |
| ground-station-store | Recetores, caminho de retransmissão, fontes e E/S de campo |
Armar é uma cadeia confirmada, não uma mudança local
Intenção do operador
Mission Control chama protocol.arm() após confirmação explícita.
Protocolo
É criado MAV_CMD_COMPONENT_ARM_DISARM, comando #400.
Transporte
A trama segue por WebSocket/LAN ou Convex/nuvem até ao agente.
Série
O agente transmite o comando ao FC e não se apresenta como árbitro das verificações de pré-armamento.
Validação do FC
O firmware verifica sensores, GPS, bateria, interruptor de segurança, EKF e failsafes configurados.
Confirmação do estado
O bit 7 de HEARTBEAT base_mode e ACK regressam por IPC/MQTT; a interface mostra ARMED apenas após confirmação.

