Echte constellatie-TLE's gebruiken
Het meegeleverde scenarios/orbit-sgp4-gps.toml bevat al echte TLE's (two-line element sets): de Celestrak-snapshot gps-ops van de operationele GPS-constellatie (Global Positioning System) zoals gecatalogiseerd op 2021-07-28, 30 satellieten, met strict_checksum = true. Elke satelliet wordt gepropageerd met SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4), dat is getoetst aan de officiële vectoren van AIAA (American Institute of Aeronautics and Astronautics) 2006-6753. Dezelfde snapshot is als tests/fixtures/celestrak/gps-ops_2021-07-28.txt vastgelegd, en scripts/fetch_tles.sh haalt een verse op. Lees sectie 3 voordat u een geometriegetal eruit aanhaalt: dat scenario propageert elke satelliet vanaf zijn eigen epoche.
Voor een synthetisch, op zichzelf staand voorbeeld geeft scenarios/orbit-real-tle.toml zes GPS-achtige satellieten als kale line-2-records, gepropageerd als analytische Kepler-elementen, en elk scenario orbit zonder een blok tle bouwt een Walker-constellatie.
Om de actuele GPS-constellatie (of een andere) te bestuderen, plaatst u een verse snapshot.
1. Een actuele snapshot downloaden#
Celestrak herdistribueert de elementensets uit de NORAD-catalogus (North American Aerospace Defense Command), minstens dagelijks ververst. Voor GPS:
curl -o gps-ops.txt "https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle"
Andere nuttige groepen: galileo, glo-ops (GLONASS, het Russische Global Navigation Satellite System), beidou, stations (het ISS, International Space Station, en andere bemande stations).
Het bestand is een reeks records van drie regels (naam, regel 1, regel 2). De parser van Kshana negeert naamregels, dus u kunt het bestand ongewijzigd plakken.
2. In een scenario plaatsen#
Stel in elk baanscenario het blok tle van de constellatie in op de inhoud van de snapshot:
[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 is het nummer van de pseudorandom-noise-code die een GPS-satelliet uitzendt.)
Een paar van regel 1 + regel 2 wordt gepropageerd met SGP4/SDP4 (weerstands- en diepe-ruimtetermen); een kale regel 2 wordt behandeld als analytische gemiddelde Kepler-elementen. De twee mogen worden gemengd.
strict_checksum = true weigert elke regel waarvan de modulo-10-checksum in kolom 69 onjuist is — een goede integriteitscontrole op een vers gedownload bestand. De standaardwaarde is false omdat de synthetische onderwijsscenario's plaatshouderchecksums gebruiken.
3. Opmerkingen over epochen — lees dit voordat u een geometriegetal aanhaalt#
SGP4 propageert elke satelliet vanaf zijn eigen TLE-epoche, en parse_propagators (in src/tle.rs) geeft alleen propagators terug, dus de scenariotijd t wordt als tsince = t op elke satelliet afzonderlijk toegepast. Dat is alleen de juiste conventie als alle elementensets in het bestand dezelfde epoche delen.
Een groepsbestand van Celestrak biedt u dat niet. Het bestand wordt op één moment gedownload, maar de elementenset van elke satelliet wordt op zijn eigen cadans ververst, dus de epochen erin zijn over dagen gespreid. Gemeten aan de sets die in deze repository zijn vastgelegd (regel 1, kolommen 19–32):
| fixture | sets | spreiding van epochen |
|---|---|---|
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 is 5,9 GPS-omlopen. Als ze ongewijzigd worden gepropageerd, is de fasering in het baanvlak door elkaar gehaald: de satellieten zitten op de juiste hoogten en inclinaties, maar niet waar ze op één bepaalde dag waren, dus de zichtbare set, de DOP (dilution of precision) en elke daaruit berekende beschikbaarheid beschrijven een constellatie die nooit heeft bestaan. Niets in de parser meet deze spreiding voor u, en de typen orbit en integrity lijnen epochen niet uit: een TLE-blok in een scenario wordt altijd per satelliet-epoche gepropageerd.
Doe in plaats daarvan dit. Bewaar de epoche naast de propagator, kies één referentiemoment en verschuif de tsince van elke satelliet daarnaartoe. Tle::epoch_days_1950 is openbaar, dus de parselus is kort; tests/igs_real_data.rs (real_gps_tle_snapshot) is het uitgewerkte voorbeeld in deze boom:
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 is het frame met ware evenaar en gemiddelde equinox waarin SGP4 werkt; tests/igs_real_data.rs roteert het met teme_to_ecef naar aardvaste coördinaten.
Als u niet uitlijnt, zeg dat dan wanneer u het getal rapporteert: het is een uitspraak over baan-schillen, niet over een echte hemel.
Hoeveel dit uitmaakt is gemeten in tests/araim_dual_real_data.rs, dat dezelfde verschuivingen toepast (referentiemoment: de laatste epoche in de gecombineerde GPS- en Galileo-fixtures, 2026-06-07T07:21:04 UTC (Coordinated Universal Time)) via een ARAIM-beschikbaarheidsrun (advanced receiver autonomous integrity monitoring) van 24 h met twee constellaties. Onder een VAL (vertical alert limit) van 12 m geeft de uitgelijnde hemel voor alleen GPS 0,993, voor gepoold GPS+Galileo 1,000 en voor de tegen constellatiefouten robuuste dubbele 0,990; de niet-uitgelijnde conventie per satelliet-epoche geeft 0,208, 0,671 en 0,031 voor dezelfde invoer — een andere conclusie, geen kleine fout.
Zie ook#
README.md— de baanscenario's.SCENARIOS.md— de velden van het typeorbit; de typenintegrity,gnss-sim,jammingenconstellation-designnemen dezelfde tabelconstellation, enephemerisneemt ééntle.INTEGRITY.md— de ARAIM-engine die de test met echte hemel aandrijft.src/tle.rs— de parser (parse_propagators,ParseOpts { strict_checksum }).