Aller au contenu

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 :

export PATH="$HOME/.local/bin:$PATH"

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

cd ~/Project/bascanada/my_fleet
make web          # = make plane + make mavlink2rest + make cockpit

Au premier lancement de Cockpit :

  1. Cliquer Settings (engrenage).
  2. Section General dans la sidebar.
  3. Chercher le champ "MAVLink2Rest WebSocket URI" (champ dédié, accepte les ws://).
  4. Le champ "Vehicle Address" juste à côté rejette les ws:// — ne pas confondre.
  5. Coller : ws://127.0.0.1:8088/v1/ws/mavlink
  6. Save / Apply. Cockpit détecte le mavtype via 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

make web-down       # arrête SITL + mavlink2rest (Cockpit reste ouvert)
make cockpit-down   # ferme Cockpit

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 :

http://127.0.0.1:8088/docs

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 web lance Plane SITL + mavlink2rest + Cockpit en une commande
  • curl http://127.0.0.1:8088/v1/mavlink/vehicles/1/components/1/messages/HEARTBEAT retourne JSON propre avec mavtype=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 web dé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.md pour tracker les PRs ouvertes