Niveau 7 — Multi-véhicule plane + rover¶
Objectif : opérer simultanément un avion et un rover dans le même Cockpit, comprendre les défis de coordination, préparer le terrain pour fleet-base.
Durée : 1 h.
Prérequis : niveau 6 (tu maîtrises un véhicule à la fois).
1. Lancer plane + rover¶
Ça lance Plane SITL sur TCP 5760 et Rover SITL sur TCP 5770.
Maintenant mavlink2rest ne tape qu'un seul des deux par défaut. Il faut lui en dire deux :
# Kill l'instance actuelle
make mavlink2rest-down
# Relancer mavlink2rest avec deux connexions
~/.local/bin/mavlink2rest \
--connect tcpout:127.0.0.1:5760 \
--connect tcpout:127.0.0.1:5770 \
--server 0.0.0.0:8088 >/tmp/mavlink2rest.log 2>&1 &
Limitation : mavlink2rest dans sa version 1.0.2 ne supporte qu'une seule connexion
--connect. Pour deux véhicules il faut : - Soit lancer deux instances de mavlink2rest sur deux ports (8088 et 8089) - Soit utiliser MAVProxy comme hub qui agrège les deux et les expose en un seul endpoint, et mavlink2rest connecte sur cet endpoint - Soit attendre/contribuer une feature upstream pour multi-connectVoir la TODO en bas pour le choix d'architecture multi-véhicule.
Workaround : deux mavlink2rest¶
# Plane sur 8088
~/.local/bin/mavlink2rest --connect tcpout:127.0.0.1:5760 --server 0.0.0.0:8088 >/tmp/m2r-plane.log 2>&1 &
# Rover sur 8089
~/.local/bin/mavlink2rest --connect tcpout:127.0.0.1:5770 --server 0.0.0.0:8089 >/tmp/m2r-rover.log 2>&1 &
Dans Cockpit, ajoute deux véhicules :
- URI 1 : ws://127.0.0.1:8088/v1/ws/mavlink → Plane
- URI 2 : ws://127.0.0.1:8089/v1/ws/mavlink → Rover
Cockpit te permet de switcher entre véhicules dans son sélecteur en haut.
2. Naviguer entre véhicules dans Cockpit¶
- Sélecteur véhicule (haut ou sidebar Cockpit) : liste les véhicules connectés
- Clique → la vue change pour le véhicule sélectionné
- La carte affiche les deux véhicules en même temps, même si seule la télémétrie d'un seul est en focus
- Le command prompt MAVLink s'adresse au véhicule sélectionné
Exercice¶
- Sélectionne le Plane, mets-le en TAKEOFF → laisse monter
- Switch sur le Rover, mets-le en MANUAL ou GUIDED → tu peux le commander
- Switch back sur Plane, change mode → LOITER
- Observe les deux trajectoires sur la carte
3. Différences ArduRover vs ArduPlane¶
Le rover SITL utilise ArduRover (firmware différent). Sa logique :
| ArduPlane (avion) | ArduRover (rover) |
|---|---|
| Modes : MANUAL, FBWA, AUTO, RTL, LOITER, etc. | Modes : MANUAL, ACRO, STEERING, HOLD, AUTO, RTL, GUIDED, etc. |
| Altitude est critique (sinon il chute) | Altitude = 0 (au sol) — irrelevant |
| Vitesse min = stall | Vitesse min = arrêt complet possible |
| Décollage / atterrissage | Pas de TAKEOFF / LAND — démarre/s'arrête au sol |
| WP altitude utilisée | WP altitude ignorée |
Si tu connais bien ArduPlane, ArduRover est plus simple à appréhender (pas de risque de stall ou de crash en piqué).
4. Patterns multi-véhicule à observer¶
A — Coordination passive¶
Le rover roule, l'avion fait une mission de surveillance au-dessus. Pas d'interaction logique entre les deux — chacun fait son boulot. Visible dans Cockpit comme deux trajectoires indépendantes.
B — Avion comme relais (futur Phase 4)¶
Quand le rover est trop loin de la station de base (LoRa hors portée), l'avion en orbite haute peut relayer le MAVLink du rover vers la base. ArduPilot supporte ça via le paramètre MAV_PROXY ou via un MAVProxy embarqué sur l'avion. Pas dans le scope SITL pour l'instant — on simulera ça plus tard quand le hardware sera là.
C — Règle réactive (où entre fleet-base)¶
Ex: l'avion bascule en RTL → fleet-base détecte → envoie MAV_CMD_DO_SET_MODE au rover pour le mettre en HOLD.
C'est précisément la première règle qu'on va écrire dans coordinator.rs après cette formation.
5. Limitations actuelles à connaître¶
a) SYSID collision¶
Par défaut, plane et rover ont tous les deux SYSID_THISMAV = 1. Cockpit les distingue par lien (deux mavlink2rest distincts), donc pas de pb. Mais si tu les agrèges dans un seul mavlink2rest, ils se marchent dessus.
Solution : configurer SYSID_THISMAV = 2 (ou plus) sur le rover via Cockpit Parameters → Save → Reload.
b) Pas d'override de l'avion par le rover¶
Cockpit pilote un véhicule à la fois (focus). Pour des commandes "send to both", il faudra un script ou attendre une feature Cockpit. C'est exactement où fleet-base va briller.
c) Mavlink2rest single-connect¶
Comme évoqué section 1. Décision d'architecture à prendre :
- A : Deux mavlink2rest, deux ports. Simple, marche. Doc-friendly.
- B : MAVProxy hub, un mavlink2rest. Plus propre, plus complexe.
- C : Contribuer un
--connectmulti à mavlink2rest upstream. Cohérent avec notre stratégie OSS-first.
Pour l'instant : option A. Si on fait du multi-véhicule à long terme, on évaluera B ou C.
6. Préparation pour fleet-base¶
Maintenant que tu maîtrises les deux véhicules manuellement, tu vois clairement les cas où une règle automatique simplifierait ta vie :
Premier rule candidate — "plane RTL → rover HOLD"¶
Scenario : tu opères un rover qui inspecte un sentier forestier, avec l'avion en surveillance à 100 m d'altitude. Si l'avion entre en RTL (urgence — batterie, lien perdu), tu veux que le rover s'arrête immédiatement parce que la couverture aérienne n'est plus là.
Sans fleet-base : tu dois manuellement switcher dans Cockpit, mode → HOLD sur le rover. Tu peux oublier en stress.
Avec fleet-base : ça se fait tout seul, et tu peux te concentrer sur l'avion.
Autres rules à prévoir¶
- rover idle > 5 min ET plane armed → plane mode → RTL (économie batterie aérienne si rien à observer)
- plane bas batterie ET rover OK → notification "rentre le rover, l'avion doit atterrir"
- rover entre dans zone interdite (geofence dynamique partagée) → tous deux en HOLD/LOITER
C'est ça qu'on va coder dans software/fleet-base/src/coordinator.rs quand tu seras prêt·e.
7. Avant de passer à la phase code¶
- Tu as opéré plane + rover simultanément au moins 3 fois
- Tu as fait switcher Cockpit entre les deux véhicules
- Tu comprends pourquoi
SYSID_THISMAVdoit être unique par véhicule - Tu peux articuler à voix haute au moins 2 règles cross-vehicle utiles
- Tu connais les limites actuelles (mavlink2rest mono-connect, etc.)
Récapitulatif global de la formation¶
Tu as maintenant :
- Compris le SITL et Cockpit (niveau 1)
- Maîtrisé les modes de vol (niveau 2)
- Piloté à la manette (niveau 3)
- Programmé des missions automatiques (niveau 4)
- Géré les failsafes (niveau 5)
- Configuré les paramètres + AUTOTUNE (niveau 6)
- Opéré plusieurs véhicules (niveau 7)
Tu peux maintenant écrire du code custom en sachant ce qu'il observe et commande.
Prochaine étape : retour dans le code. On attaque ../glue.md et la première règle du coordinator.rs.
TODO infra à traiter après formation¶
- Mettre à jour
Makefilepour supportermake multiavec deux mavlink2rest automatiquement - Ouvrir une issue upstream sur mavlink2rest pour
--connectmulti (cohérent avec stratégie OSS-first) -
Créer→ fait (voirfleet-params/et y mettreswordfish-baseline.parmfleet-params/swordfish-h743-baseline.parm) - Documenter le pattern SYSID_THISMAV dans
docs/dev/sitl.md