Utiliser de véritables TLE de constellations
Le fichier fourni scenarios/orbit-sgp4-gps.toml porte déjà de véritables TLE (jeux d'éléments à deux lignes) : l'instantané gps-ops de Celestrak de la constellation GPS (Global Positioning System) opérationnelle cataloguée le 2021-07-28, 30 satellites, avec strict_checksum = true. Chaque satellite est propagé avec SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4), validé par rapport aux vecteurs officiels d'AIAA (American Institute of Aeronautics and Astronautics) 2006-6753. Le même instantané est versionné sous tests/fixtures/celestrak/gps-ops_2021-07-28.txt, et scripts/fetch_tles.sh en récupère un nouveau. Lisez la section 3 avant de citer un chiffre de géométrie qui en provient : ce scénario propage chaque satellite à partir de sa propre époque.
Pour un exemple synthétique et autonome, scenarios/orbit-real-tle.toml donne six satellites de type GPS sous forme de simples enregistrements de ligne 2, propagés comme éléments képlériens analytiques, et tout scénario orbit sans bloc tle construit une constellation de Walker.
Pour étudier la constellation GPS actuelle (ou toute autre), déposez un instantané récent.
1. Télécharger un instantané récent#
Celestrak redistribue les jeux d'éléments du catalogue du NORAD (North American Aerospace Defense Command), actualisés au moins une fois par jour. Pour le GPS :
curl -o gps-ops.txt "https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle"
Autres groupes utiles : galileo, glo-ops (GLONASS, le Global Navigation Satellite System russe), beidou, stations (l'ISS, Station spatiale internationale, et d'autres stations habitées).
Le fichier est une suite d'enregistrements de trois lignes (nom, ligne 1, ligne 2). L'analyseur de Kshana ignore les lignes de nom, de sorte que vous pouvez coller le fichier tel quel.
2. L'intégrer à un scénario#
Dans tout scénario d'orbite, réglez le bloc tle de la constellation sur le contenu de l'instantané :
[constellation]
# Paste the Celestrak gps-ops block here (name/line1/line2 triples). Two real records
# from tests/fixtures/celestrak/gps-ops_2026-06-07.txt are shown; a real block has ~30.
strict_checksum = true # real Celestrak TLEs carry valid checksums; enforce them
tle = """
GPS BIIR-5 (PRN 22)
1 26407U 00040A 26158.26673196 .00000043 00000+0 00000+0 0 9990
2 26407 54.8526 215.5566 0121168 302.4173 18.5084 2.00557626189748
GPS BIIR-8 (PRN 16)
1 27663U 03005A 26157.61055816 .00000039 00000+0 00000+0 0 9995
2 27663 54.8837 215.3893 0147927 53.0597 289.9583 2.00561160171094
"""
(PRN est le numéro de code de bruit pseudo-aléatoire qu'émet un satellite GPS.)
Une paire ligne 1 + ligne 2 est propagée avec SGP4/SDP4 (termes de traînée et d'espace lointain) ; une simple ligne 2 est traitée comme des éléments moyens képlériens analytiques. Les deux peuvent être mêlés.
strict_checksum = true rejette toute ligne dont la somme de contrôle modulo 10 de la colonne 69 est erronée — un bon contrôle d'intégrité sur un fichier fraîchement téléchargé. Il vaut par défaut false parce que les scénarios pédagogiques synthétiques utilisent des sommes de contrôle fictives.
3. Remarques sur les époques — à lire avant de citer un chiffre de géométrie#
SGP4 propage chaque satellite à partir de sa propre époque TLE, et parse_propagators (dans src/tle.rs) ne renvoie que des propagateurs, de sorte que le temps de scénario t est appliqué comme tsince = t à chaque satellite indépendamment. Ce n'est la bonne convention que si tous les jeux d'éléments du fichier partagent une même époque.
Un fichier de groupe Celestrak ne vous donne pas cela. Le fichier est téléchargé à un instant donné, mais le jeu d'éléments de chaque satellite est actualisé à son propre rythme, de sorte que les époques qu'il contient s'étalent sur plusieurs jours. Mesuré sur les jeux versionnés dans ce dépôt (ligne 1, colonnes 19–32) :
| jeu de test | jeux | étalement des époques |
|---|---|---|
tests/fixtures/celestrak/gps-ops_2026-06-07.txt |
32 | 70,6 h |
tests/fixtures/celestrak/gps-ops_2021-07-28.txt |
30 | 76,4 h |
tests/fixtures/celestrak/galileo_2026-06-07.txt |
33 | 335,7 h |
70,6 h correspondent à 5,9 révolutions GPS. Propagé tel quel, le phasage dans le plan est brouillé : les satellites sont aux bonnes altitudes et inclinaisons, mais pas là où ils se trouvaient un jour donné, de sorte que l'ensemble visible, le DOP (dilution de précision) et toute disponibilité calculée à partir d'eux décrivent une constellation qui n'a jamais existé. Rien dans l'analyseur ne mesure cet étalement à votre place, et les types de scénario orbit et integrity n'alignent pas les époques : un bloc TLE dans un scénario est toujours propagé à l'époque propre de chaque satellite.
Faites plutôt ainsi. Conservez l'époque à côté du propagateur, choisissez un instant de référence unique et décalez le tsince de chaque satellite vers lui. Tle::epoch_days_1950 est public, de sorte que la boucle d'analyse est courte ; tests/igs_real_data.rs (real_gps_tle_snapshot) est l'exemple résolu de cette arborescence :
use kshana::orbit::Propagator;
use kshana::sgp4::wgs72;
use kshana::tle::parse_tle;
/// TEME position (m) of one satellite at `t` seconds after the common reference
/// instant `t_ref_jd` (a Julian date), not after its own TLE epoch.
fn aligned_teme_m(line1: &str, line2: &str, t_ref_jd: f64, t: f64) -> Result<[f64; 3], String> {
let tle = parse_tle(line1, line2)?;
let jd_epoch = 2_433_281.5 + tle.epoch_days_1950;
let prop = Propagator::Sgp4(Box::new(tle.to_sgp4(wgs72(), false)));
let tsince_s = (t_ref_jd - jd_epoch) * 86_400.0 + t;
Ok(prop.position_eci(tsince_s))
}
TEME est le référentiel à équateur vrai et équinoxe moyen dans lequel SGP4 travaille ; tests/igs_real_data.rs le fait passer en coordonnées terrestres avec teme_to_ecef.
Si vous n'alignez pas, dites-le quand vous rapportez le chiffre : il décrit des couches orbitales, non un ciel réel.
L'importance de cela est mesurée dans tests/araim_dual_real_data.rs, qui applique les mêmes décalages (instant de référence : la dernière époque des jeux de test combinés GPS + Galileo, 2026-06-07T07:21:04 UTC (temps universel coordonné)) à travers une exécution de disponibilité ARAIM (surveillance autonome avancée de l'intégrité par le récepteur) à double constellation sur 24 h. Sous une VAL (limite d'alerte verticale) de 12 m, le ciel aligné donne 0,993 pour le GPS seul, 1,000 pour GPS+Galileo mis en commun et 0,990 pour le double robuste aux pannes de constellation ; la convention non alignée à l'époque propre de chaque satellite donne 0,208, 0,671 et 0,031 pour les mêmes entrées — une conclusion différente, non une petite erreur.
Voir aussi#
README.md— les scénarios d'orbite.SCENARIOS.md— les champs du type de scénarioorbit; les types de scénariointegrity,gnss-sim,jammingetconstellation-designprennent la même tableconstellation, etephemerisprend un seultle.INTEGRITY.md— le moteur ARAIM que pilote l'essai sur ciel réel.src/tle.rs— l'analyseur (parse_propagators,ParseOpts { strict_checksum }).