Cockpit + mavlink2rest — web GCS local¶
Stack web-based pour la station de base, en remplacement de QGC quand on veut un dashboard moderne, multi-véhicule, et un command prompt MAVLink directement dans le navigateur (Cockpit).
Décision 2026-05-10 : OSS first. On utilise Cockpit (Blue Robotics, MIT) + mavlink2rest (équipe MAVLink officielle, MIT) au lieu d'écrire un dashboard custom. Le custom code (
software/fleet-base) garde son rôle de règles cross-vehicle seulement.
Architecture¶
┌──────────────────┐
│ SITL Plane:5760 │ ─┐
│ SITL Rover:5770 │ ─┼─ tcpout ─▶ mavlink2rest ─── REST :8088 ─────▶ Cockpit
└──────────────────┘ │ (binaire Rust) (Electron app)
│ │
│ └── ws://…/ws/mavlink (live)
│
└────────────── tcpout ──▶ fleet-base (règles)
- mavlink2rest : connecte un flux MAVLink (TCP/UDP/serial), expose REST
/v1/mavlink/...+ WebSocket pour les clients. - Cockpit : GCS web Vue.js qui consomme ws://localhost:8088/ws/mavlink. Customisable, widgets, command prompt MAVLink, missions, joystick, vidéo.
- fleet-base : indépendant — reste connecté direct au SITL pour exécuter les règles de coordination (RTL → HOLD, etc.).
Install¶
Versions validées 2026-05-10 sur macOS arm64 :
| Outil | Version | Path |
|---|---|---|
| mavlink2rest | 1.0.2 | ~/.local/bin/mavlink2rest (binaire 37 MB, arm64 natif) |
| Cockpit | 1.17.0 | /Applications/Cockpit.app (Electron, signé Developer ID) |
mavlink2rest¶
Binaire pré-compilé sur Apple Silicon :
mkdir -p ~/.local/bin
curl -L -o ~/.local/bin/mavlink2rest \
https://github.com/mavlink/mavlink2rest/releases/latest/download/mavlink2rest-aarch64-apple-darwin
chmod +x ~/.local/bin/mavlink2rest
mavlink2rest --version
Le Makefile racine inclut ~/.local/bin dans son PATH. Pour ton shell interactif, ajouter à ~/.zshrc :
Cockpit¶
⚠️ Privilégier le .zip au .dmg — le DMG sert mal sur certaines connexions et peut arriver corrompu :
curl -L -o /tmp/Cockpit.zip \
https://github.com/bluerobotics/cockpit/releases/latest/download/Cockpit-mac-arm64-1.17.0.zip
unzip -q /tmp/Cockpit.zip -d /tmp/cockpit-extracted
cp -R /tmp/cockpit-extracted/Cockpit.app /Applications/
rm -rf /tmp/cockpit-extracted /tmp/Cockpit.zip
Cockpit est notarisé Apple Developer ID — Gatekeeper l'accepte sans manipulation.
Workflow quotidien¶
Au premier lancement de Cockpit :
- Cliquer Settings (engrenage).
- Section General dans la sidebar.
- Chercher le champ "MAVLink2Rest WebSocket URI" (champ dédié, accepte les
ws://). - Le champ "Vehicle Address" juste à côté rejette les
ws://— ne pas confondre. - Coller :
ws://127.0.0.1:8088/v1/ws/mavlink - Save / Apply. Cockpit détecte le
mavtypevia heartbeat et affiche l'avion.
Cockpit 1.17 est conçu pour BlueOS où mavlink2rest est mounté sous
/mavlink2rest/.... Notre setup standalone expose directement/v1/ws/mavlink— d'où l'URL custom à coller.
Cockpit garde la config — pas besoin de refaire à chaque session.
Tout arrêter proprement¶
Ce que Cockpit fournit gratuitement¶
- Dashboard multi-véhicule temps réel (mode, armé, batterie, GPS, altitude)
- Carte avec position du véhicule
- Command prompt MAVLink (envoie n'importe quel message arbitraire — set mode, arm, etc.)
- Mission planner (waypoints, patterns de survey)
- Joystick mapping (Xbox/PS/Boxer via USB ou BT)
- Vidéo (WebRTC ou stream) — pas pertinent en SITL
- Widgets DIY pour ajouter ton propre indicateur
Ce que fleet-base garde¶
- Règles cross-vehicle (Cockpit ne fait pas ça — il affiche, il ne coordonne pas)
- Logique métier custom : photo-on-demand orchestration, sentinel triggers, alertes
- Tests / CI scriptés (pas besoin de GUI pour valider une règle)
Cockpit et fleet-base sont complémentaires, pas concurrents. Les deux tournent en parallèle, les deux lisent du SITL (l'un via mavlink2rest, l'autre direct), aucun conflit.
Endpoints REST utiles¶
# Lister les véhicules vus
curl http://127.0.0.1:8088/v1/mavlink/vehicles
# Dernier HEARTBEAT du véhicule 1
curl http://127.0.0.1:8088/v1/mavlink/vehicles/1/components/1/messages/HEARTBEAT | jq
# Une feuille très précise — type de véhicule
curl http://127.0.0.1:8088/v1/mavlink/vehicles/1/components/1/messages/HEARTBEAT/message/mavtype/type
# → "MAV_TYPE_FIXED_WING"
POST pour envoyer un message MAVLink (set mode, arm, etc.) — voir la doc Swagger :
fleet-base pourrait passer par cette interface REST plutôt que par sa connection TCP directe — à évaluer plus tard si on veut centraliser.
Validation 2026-05-10¶
- ✅
make weblance Plane SITL + mavlink2rest + Cockpit en une commande - ✅
curl http://127.0.0.1:8088/v1/mavlink/vehicles/1/components/1/messages/HEARTBEATretourne JSON propre avecmavtype=MAV_TYPE_FIXED_WING, mode courant, system status - ✅ Cockpit reconnaît le véhicule via ws://127.0.0.1:8088/v1/ws/mavlink
- ✅ Idempotent : relancer
make webdétecte chaque service déjà actif et passe
Quand contribuer upstream¶
- Bug dans Cockpit pendant l'usage : ouvrir issue sur https://github.com/bluerobotics/cockpit
- Feature manquante (ex : widget custom pour multi-vehicle coordination) : PR welcome
- Bug dans mavlink2rest : https://github.com/mavlink/mavlink2rest
- Garder un fichier
docs/dev/upstream-contributions.mdpour tracker les PRs ouvertes