Setup macOS — prérequis système¶
Préparation du MacBook M1 Pro pour développer ArduPilot, MAVProxy, et la glue logicielle. À faire une seule fois au début.
Validé le 2026-05-10 sur macOS Tahoe (Darwin 25.x), MacBook M1 Pro. Toute la stack tient en ~3.3 GB.
Vue d'ensemble¶
L'idée : on s'appuie au maximum sur le script officiel install-prereqs-mac.sh d'ArduPilot. Il installe pyenv, Python 3.10, la toolchain ARM, et tous les paquets Python (MAVProxy, pymavlink, dronecan, wxPython…). On gère manuellement seulement ce qui n'est pas couvert : Homebrew, le clone du repo, QGC, et Rust.
1. Homebrew¶
Sur Apple Silicon, Homebrew vit dans /opt/homebrew. Vérifier :
Si absent :
Suivre l'instruction de fin pour ajouter /opt/homebrew/bin au PATH (~/.zshrc).
2. Xcode Command Line Tools + git¶
git est inclus dans les CLT.
3. Cloner ArduPilot¶
mkdir -p ~/Project/bascanada
cd ~/Project/bascanada
git clone --recurse-submodules https://github.com/ArduPilot/ardupilot.git
Compter ~5–10 min selon le débit (le repo + submodules pèse ~1.8 GB).
4. Lancer le script de prérequis¶
Le -y accepte automatiquement tous les prompts y/n du script. Le script demande ton password sudo (pour écrire la toolchain ARM dans /opt). Compter ~10–20 min (download + compilation wxPython sur M1).
Ce que le script installe¶
| Catégorie | Paquets / artefacts | Emplacement |
|---|---|---|
| Brew formulas | gawk, coreutils, wget, ccache |
/opt/homebrew |
| pyenv | géré via le script (clone Git) | ~/.pyenv |
| Python | 3.10.18 (pinné par ArduPilot) | ~/.pyenv/versions/3.10.18 |
| Pip packages | pymavlink, MAVProxy, dronecan, pexpect, geocoder, wxPython, intelhex, gnureadline, lxml, matplotlib, empy, flake8, junitparser, setuptools, wheel |
dans le Python pyenv |
| Toolchain ARM | gcc-arm-none-eabi-10-2020-q4-major (~692 MB) |
/opt/gcc-arm-none-eabi-10-2020-q4-major |
| ccache wrappers | symlinks arm-none-eabi-gcc/g++ |
/opt/homebrew/opt/ccache/libexec/ |
Lignes ajoutées à ~/.zshrc¶
Le script ajoute (entre autres) :
export PATH=/opt/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH
export PATH=/Users/wq/Project/bascanada/ardupilot/Tools/autotest:$PATH
source /Users/wq/Project/bascanada/ardupilot/Tools/completion/completion.zsh
export PATH=/opt/homebrew/opt/ccache/libexec:$PATH
Important : ces lignes ne sont actives qu'au prochain shell. Ouvrir un nouveau terminal ou faire
source ~/.zshrcavant de continuer.
Note sur la version Python¶
Le script fait pyenv global 3.10.18. Si tu veux garder un autre Python comme global de ton système, isole ArduPilot avec un .python-version dans le repo :
cd ~/Project/bascanada/ardupilot
echo "3.10.18" > .python-version
pyenv global system # ou ta version préférée
Mais 3.10.18 partout marche très bien et c'est le plus simple.
5. QGroundControl¶
Pas de Homebrew — DMG officiel :
curl -L -o /tmp/QGroundControl.dmg "https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.dmg"
hdiutil attach /tmp/QGroundControl.dmg -nobrowse
cp -R /Volumes/QGroundControl/QGroundControl.app /Applications/
hdiutil detach /Volumes/QGroundControl
Le DMG est notarisé Apple Developer ID (vérifié 2026-05-10), donc Gatekeeper l'accepte sans manip. Pour valider :
spctl --assess --verbose /Applications/QGroundControl.app
# attendu : accepted, source=Notarized Developer ID
6. FlightGear (visualiseur 3D, optionnel mais recommandé)¶
FlightGear sert de fenêtre 3D synchronisée sur SITL — utile pour s'entraîner visuellement et faire des démos. Deux étapes : la cask Homebrew installe l'app, mais FGDATA (~1.88 GB de modèles + scenery de base) doit être bootstrap à part.
6.a — Installer l'app¶
Compter ~270 MB. La cask v2026 pointe sur FlightGear 2024.1.5 (binaire universal x86_64 + arm64). L'app s'installe dans /Applications/FlightGear.app.
Sur macOS le binaire fgfs (Linux) est packagé sous le nom FlightGear dans le .app :
ls /Applications/FlightGear.app/Contents/MacOS/FlightGear
file /Applications/FlightGear.app/Contents/MacOS/FlightGear
# Mach-O universal binary with 2 architectures: [x86_64] [arm64]
Note :
FlightGear --versionne retourne rien visible depuis un terminal sur macOS (les bundles.appdétachent leur stdout). On valide plutôt par le test SITL.
6.b — Bootstrap FGDATA (1.88 GB)¶
La cask ne contient PAS les ~1.88 GB de modèles, sons, textures, base d'aéroports, etc. nécessaires pour que FG démarre. Le launcher GUI les télécharge au premier run, mais on préfère le faire en script :
# 1. Télécharger l'archive officielle (1.88 GB compressé)
curl -L -o /tmp/fgdata.txz \
"https://sourceforge.net/projects/flightgear/files/release-2024.1/FlightGear-2024.1.5-data.txz/download"
# 2. Extraire dans la zone canonique macOS (~2.6 GB décompressé)
mkdir -p "$HOME/Library/Application Support/FlightGear"
tar -xJf /tmp/fgdata.txz -C "$HOME/Library/Application Support/FlightGear"
# Le tarball top-dir = "fgdata_2024_1/" — on renomme en "fgdata"
mv "$HOME/Library/Application Support/FlightGear/fgdata_2024_1" \
"$HOME/Library/Application Support/FlightGear/fgdata"
rm /tmp/fgdata.txz
# 3. Vérifier la structure
ls "$HOME/Library/Application Support/FlightGear/fgdata" | head
# attendu : AI ATC Aircraft Airports Astro Compositor Docs Effects Engines ...
# 4. Workaround "espace dans le path" — symlink dans ~/.fgfs/fgdata
# (FG ou son loader Qt s'embrouille parfois avec --fg-root contenant un
# espace blanc, ce qui fait que le process reste à RSS=30KB et n'ouvre
# jamais sa fenêtre. Symlinker vers un chemin "propre" règle ça.)
mkdir -p ~/.fgfs
ln -snf "$HOME/Library/Application Support/FlightGear/fgdata" ~/.fgfs/fgdata
Le Makefile racine pointe FG sur ce répertoire via --fg-root. Pas besoin de l'ajouter à un PATH ou à ~/.zshrc.
Source officielle : https://www.flightgear.org/download/ → onglet "Base package" pour ta version.
6.c — Test rapide¶
cd ~/Project/bascanada/my_fleet
make fg # plane SITL @ CYHU + FlightGear 3D
make fg-down # ferme FG
make down # arrête SITL
La scenery se télécharge automatiquement au premier vol via TerraSync (~100-300 MB pour la Rive-Sud de Montréal, tile w074n45).
Note : FG n'est pas requis pour la chaîne SITL → Cockpit/QGC. C'est strictement un viewer 3D additionnel. Voir
flightgear.mdpour le détail d'intégration.
7. Rust (optionnel, Phase 4)¶
Pour la glue logicielle si tu pars sur Rust :
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# choisir 1) default
source $HOME/.cargo/env
rustc --version
8. Vérification finale¶
Ouvrir un nouveau terminal (pour que ~/.zshrc soit relu) et exécuter :
which brew # /opt/homebrew/bin/brew
python3 --version # 3.10.18
which python3 # ~/.pyenv/shims/python3
arm-none-eabi-gcc --version # 10.2.1
mavproxy.py --version # MAVProxy is a modular ground station...
sim_vehicle.py --help | head -1
ls /Applications/QGroundControl.app
python3 -c "import pymavlink, dronecan, pexpect; print('imports OK')"
# Optionnel — si FG installé :
test -x /Applications/FlightGear.app/Contents/MacOS/FlightGear && echo "FG OK"
Si tout répond, tu es prêt pour sitl.md.
Pièges Apple Silicon connus¶
| Symptôme | Cause | Solution |
|---|---|---|
arm-none-eabi-gcc: command not found après le script |
PATH pas relu | Nouveau terminal, ou source ~/.zshrc |
python3 retourne 3.14 (Homebrew) au lieu de 3.10 |
pyenv shims pas en tête de PATH | Vérifier eval "$(pyenv init -)" dans ~/.zshrc avant les autres exports PATH |
Le script échoue sur wxPython |
Compilation lente, parfois timeout réseau | Relancer le script — il reprend où il s'est arrêté |
sudo demande le password en boucle |
Timeout de cache sudo (~5 min) | Normal pour un script long, retape simplement |
| QGC ne s'ouvre pas — "endommagé" | Quarantaine sur DMG non-officiel | N'arrive pas avec le DMG notarisé officiel ; si oui, vérifier la source |
| Plus de place sur disque | Compte ~3.3 GB total | Vérifier avec du -sh ~/.pyenv ~/Project/bascanada/ardupilot /opt/gcc-arm-none-eabi-* |
État disque (référence)¶
| Composant | Taille |
|---|---|
| ArduPilot repo + submodules | ~1.8 GB |
| pyenv + Python 3.10.18 + pip packages | ~800 MB |
Toolchain ARM dans /opt |
~700 MB |
| QGroundControl.app | ~330 MB |
| FlightGear.app + scenery (optionnel) | ~3 GB (app ~2 GB + scenery cache ~0.5-1 GB) |
| Total sans FG | ~3.6 GB |
| Total avec FG | ~6.6 GB |