Brug af TLE'er for virkelige konstellationer
Den medfølgende scenarios/orbit-sgp4-gps.toml bærer allerede virkelige TLE'er (two-line element sets): Celestrak-snapshottet gps-ops af den operative GPS-konstellation (Global Positioning System), katalogiseret 2021-07-28, 30 satellitter, med strict_checksum = true. Hver satellit propageres med SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4), som er valideret mod de officielle AIAA-vektorer (American Institute of Aeronautics and Astronautics) 2006-6753. Det samme snapshot ligger som kopi i tests/fixtures/celestrak/gps-ops_2021-07-28.txt, og scripts/fetch_tles.sh henter et nyt. Læs afsnit 3, før du citerer et geometrital herfra: det scenarie propagerer hver satellit fra sin egen epoke.
Til et syntetisk, selvstændigt eksempel giver scenarios/orbit-real-tle.toml seks GPS-lignende satellitter som rene linje-2-poster, propageret som analytiske keplerelementer, og hvert orbit-scenarie uden en tle-blok bygger en Walker-konstellation.
For at studere den aktuelle GPS-konstellation (eller en anden) lægger du et nyt snapshot ind.
1. Hent et aktuelt snapshot#
Celestrak videredistribuerer elementsættene i NORAD-kataloget (North American Aerospace Defense Command), opdateret mindst dagligt. For GPS:
curl -o gps-ops.txt "https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle"
Andre nyttige grupper: galileo, glo-ops (GLONASS, Ruslands Global Navigation Satellite System), beidou, stations (ISS, International Space Station, og andre bemandede stationer).
Filen er en række poster på tre linjer (navn, linje 1, linje 2). Kshanas parser ignorerer navnelinjer, så du kan indsætte filen, som den er.
2. Læg det ind i et scenarie#
I ethvert kredsløbsscenarie sætter du konstellationens tle-blok til snapshottets indhold:
[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 er det pseudorandom-noise-kodenummer, en GPS-satellit sender.)
Et par af linje 1 + linje 2 propageres med SGP4/SDP4 (led for modstand og dybt rum); en ren linje 2 behandles som analytiske kepler-middelelementer. De to kan blandes.
strict_checksum = true afviser enhver linje, hvis kontrolsum modulo 10 i kolonne 69 er forkert — en god integritetskontrol af en frisk hentet fil. Standardværdien er false, fordi de syntetiske undervisningsscenarier bruger pladsholder-kontrolsummer.
3. Noter om epoker — læs dette, før du citerer et geometrital#
SGP4 propagerer hver satellit fra dens egen TLE-epoke, og parse_propagators (i src/tle.rs) returnerer kun propagatorer, så scenarietiden t anvendes som tsince = t på hver satellit uafhængigt. Det er kun den rigtige konvention, hvis alle elementsæt i filen har samme epoke.
En Celestrak-gruppefil giver dig ikke det. Filen hentes på ét tidspunkt, men hvert satellitelementsæt opdateres i sin egen takt, så epokerne i den er spredt over dage. Målt på de sæt, der ligger som kopi i dette repositorium (linje 1, kolonne 19–32):
| fixture | sæt | spredning af epoker |
|---|---|---|
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 er 5,9 GPS-omløb. Propageret, som det er, er faserne i banens plan blandet sammen: satellitterne er i de rigtige højder og hældninger, men ikke dér, hvor de var på nogen enkelt dag, så den synlige mængde, DOP (dilution of precision) og enhver tilgængelighed beregnet ud fra dem beskriver en konstellation, der aldrig har eksisteret. Intet i parseren måler denne spredning for dig, og typerne orbit og integrity afstemmer ikke epoker: en TLE-blok i et scenarie propageres altid pr. satellitepoke.
Gør i stedet dette. Behold epoken sammen med propagatoren, vælg ét referencetidspunkt, og forskyd hver satellits tsince til det. Tle::epoch_days_1950 er offentlig, så parsersløjfen er kort; tests/igs_real_data.rs (real_gps_tle_snapshot) er det gennemregnede eksempel i dette træ:
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 er det referencesystem med sand ækvator og middelækvinoktium, som SGP4 arbejder i; tests/igs_real_data.rs roterer det til koordinater fastlåst til Jorden med teme_to_ecef.
Hvis du ikke afstemmer, så sig det, når du rapporterer tallet: det er en udtalelse om baneskaller, ikke om en virkelig himmel.
Hvor meget det betyder, er målt i tests/araim_dual_real_data.rs, som anvender de samme forskydninger (referencetidspunkt: den seneste epoke i de kombinerede GPS- og Galileo-fixtures, 2026-06-07T07:21:04 UTC (Coordinated Universal Time)) gennem en tilgængelighedskørsel med to konstellationer i ARAIM (advanced receiver autonomous integrity monitoring) over 24 h. Under en VAL (vertical alert limit) på 12 m giver den afstemte himmel 0,993 for kun GPS, 1,000 for samlet GPS+Galileo og 0,990 for dobbelt, robust over for fejl i en konstellation; konventionen med pr. satellitepoke uden afstemning giver 0,208, 0,671 og 0,031 for de samme input — en anden konklusion, ikke en lille fejl.
Se også#
README.md— kredsløbsscenarierne.SCENARIOS.md— felterne for typenorbit; typerneintegrity,gnss-sim,jammingogconstellation-designtager den sammeconstellation-tabel, ogephemeristager en enkelttle.INTEGRITY.md— ARAIM-motoren, som testen med virkelig himmel driver.src/tle.rs— parseren (parse_propagators,ParseOpts { strict_checksum }).