Pourquoi ce projet
Plus jeune, j’étais passionné par l’espace. Les étoiles, les fusées, les satellites : tout ce qui touchait de près ou de loin à ce domaine m’attirait. Avec les années, cette passion s’est peu à peu estompée, sans que je décide vraiment de la laisser de côté.
J’ai voulu la retrouver, et pour cela, plutôt que de simplement regarder des documentaires, me lancer dans un vrai projet spatial. L’idée de travailler un jour dans ce domaine y est pour beaucoup : ce simulateur est ma façon de m’en rapprocher concrètement, en apprenant la mécanique orbitale et en construisant quelque chose avec.
Je voulais un simulateur où le mouvement est réellement calculé à partir des paramètres orbitaux, pas dessiné à la main. Je voulais aussi qu’il reste agréable à utiliser : on doit pouvoir créer un satellite, le sélectionner, tourner autour en 3D et lire ses données sans avoir lu un manuel d’astrodynamique.
Côté code, j’ai séparé le projet en modules indépendants (physique, données, simulation, visualisation, tests) pour pouvoir faire évoluer chaque partie sans casser les autres. J’ai travaillé en TDD du début à la fin.
Le moteur orbital
Le moteur repose sur un modèle à deux corps avec le paramètre gravitationnel standard de la Terre. Pour trouver la position d’un satellite à un instant donné, il part de l’anomalie vraie initiale, la convertit en anomalie excentrique puis en anomalie moyenne, la fait avancer avec le temps simulé, résout l’équation de Kepler par la méthode de Newton, puis revient à l’anomalie vraie. De là, il en déduit la position et la vitesse dans le repère inertiel géocentrique.
C’est ce calcul qui donne le bon comportement : le satellite accélère au périgée et ralentit à l’apogée. Le moteur fournit aussi la période, l’énergie orbitale spécifique, les vitesses totale, radiale et tangentielle, les distances au périgée et à l’apogée, ainsi que les vecteurs position et vitesse.
Plusieurs vérifications protègent la cohérence des résultats : excentricité valide, périgée inférieur à l’apogée, altitude minimale pour les satellites personnalisés, et surtout conservation de l’énergie au fil de la simulation.
Ce que fait l’application
Vue 2D. La Terre est au centre, avec les orbites elliptiques, la position des satellites, les marqueurs de périgée et d’apogée, les vecteurs vitesse et des anneaux d’échelle. Les portions d’orbite cachées derrière la Terre passent en pointillés. Le tout est animé par une horloge QTimer.
Vue 3D. On bascule depuis l’interface principale vers une scène en QOpenGLWidget : globe stylisé, orbites dans l’espace, rotation à la souris, zoom à la molette, sélection d’un satellite par clic, suivi et centrage de la caméra. Les parties d’orbite masquées par la Terre sont distinguées des parties visibles. Les vues 2D et 3D partagent les mêmes satellites, la même horloge et la même sélection.
Contrôle du temps. Pause, reprise, accélération, ralentissement et même temps inversé, avec une échelle de -10 000x à +10 000x. On peut ainsi parcourir une orbite entière en quelques secondes ou regarder un mouvement au ralenti.
Fichiers TLE. L’application charge plusieurs satellites depuis un fichier TLE, vérifie le format des lignes et les sommes de contrôle, extrait les paramètres orbitaux et convertit le mouvement moyen en demi-grand axe. Elle peut aussi exporter les satellites de la simulation vers un nouveau fichier TLE. On peut donc mélanger satellites réels et satellites inventés.
Satellites personnalisés. On en crée un à partir de son nom, des altitudes de périgée et d’apogée, de l’inclinaison, de l’ascension droite du nœud ascendant, de l’argument du périgée et de l’anomalie vraie initiale. On peut ensuite le modifier, le supprimer, le sauvegarder en JSON (rechargé au démarrage) ou l’exporter en TLE. Deux satellites ne peuvent pas porter le même nom, et un avertissement l’indique.
Sélection et caméra. On sélectionne un satellite en cliquant dessus ou via la liste déroulante, depuis la 2D comme depuis la 3D. On peut n’afficher que son orbite (ou de nouveau toutes), centrer la caméra dessus, la faire le suivre en continu, ou revenir à la Terre.
Télémétrie. Pour le satellite sélectionné : altitude, distance au centre de la Terre, vitesse instantanée, composantes radiale et tangentielle, période, périgée et apogée, en km et km/s ou en m et m/s.
Bilingue. L’interface est disponible en français et en anglais, avec changement dynamique des boutons, messages et libellés.
Tests et intégration continue
J’ai suivi le cycle classique du TDD : écrire le test, le voir échouer, implémenter, corriger, vérifier qu’il n’y a pas de régression. Les tests couvrent la création et la validation des satellites, les calculs de position et de vitesse, la propagation képlérienne, la conservation de l’énergie, le parsing TLE, l’import/export, la persistance, les contrôles de caméra, la sélection, la bascule 2D/3D, le suivi caméra et l’affichage des segments cachés. La suite compte aujourd’hui 67 tests, tous au vert.
Une pipeline GitHub Actions les lance sur Python 3.8, 3.9, 3.10 et 3.11. Elle installe les dépendances et les bibliothèques graphiques Ubuntu nécessaires à PyQt6, exécute les tests Qt en mode headless, produit les rapports de couverture et les envoie à Codecov. Faire tourner PyQt6 sans écran m’a demandé un peu de débogage, mais cela m’a permis de repérer tôt les incompatibilités entre versions.
Ce que j’en retiens
Ce projet m’a fait travailler la traduction d’un problème physique en algorithmes, la gestion des systèmes de coordonnées et des projections, le développement d’une interface graphique 2D/3D, la manipulation d’un format spécialisé (TLE), la persistance locale, le TDD et la CI multi-version.
Pistes pour la suite
- Texture réaliste de la Terre, éclairage dynamique et ombre portée
- Perturbations orbitales plus complètes, traînée atmosphérique, atmosphère plus fine
- Mise à jour automatique des TLE
- Stations au sol, calculs de visibilité et de couverture, détection des éclipses
- Visualisation des communications entre satellites
- Export de captures ou d’animations
- Modèles 3D de satellites et meilleures performances OpenGL pour les grandes constellations
Si le contexte, les arbitrages ou la mise en production vous intéressent, on peut en parler. Écrire un message
