Použití skutečných TLE konstelací
Přibalený scenarios/orbit-sgp4-gps.toml již nese skutečné TLE (dvouřádkové sady elementů): snímek Celestraku gps-ops provozní konstelace GPS (Global Positioning System) katalogizované 2021-07-28, 30 družic, s strict_checksum = true. Každá družice je propagována pomocí SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4), která je ověřena proti oficiálním vektorům AIAA (American Institute of Aeronautics and Astronautics) 2006-6753. Týž snímek je vendorován jako tests/fixtures/celestrak/gps-ops_2021-07-28.txt a scripts/fetch_tles.sh stahuje čerstvý. Než z něj budete citovat číslo geometrie, přečtěte si oddíl 3: tento scénář propaguje každou družici od její vlastní epochy.
Pro syntetický, samostatný příklad dává scenarios/orbit-real-tle.toml šest družic podobných GPS jako holé záznamy řádku 2, propagované jako analytické keplerovské elementy, a každý scénář orbit bez bloku tle sestaví konstelaci Walker.
Chcete-li studovat aktuální konstelaci GPS (nebo jakoukoli jinou), vložte čerstvý snímek.
1. Stáhněte aktuální snímek#
Celestrak redistribuuje sady elementů z katalogu NORAD (North American Aerospace Defense Command), obnovované nejméně denně. Pro GPS:
curl -o gps-ops.txt "https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle"
Další užitečné skupiny: galileo, glo-ops (GLONASS, ruský Global Navigation Satellite System), beidou, stations (ISS, Mezinárodní kosmická stanice, a další stanice s posádkou).
Soubor je posloupnost třířádkových záznamů (jméno, řádek 1, řádek 2). Parser Kshany řádky se jmény ignoruje, takže soubor můžete vložit tak, jak je.
2. Vložte jej do scénáře#
V libovolném scénáři oběžné dráhy nastavte blok tle konstelace na obsah snímku:
[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 je číslo kódu pseudonáhodného šumu, který družice GPS vysílá.)
Dvojice řádek 1 + řádek 2 je propagována pomocí SGP4/SDP4 (členy odporu a hlubokého vesmíru); holý řádek 2 se bere jako analytické střední keplerovské elementy. Lze je míchat.
strict_checksum = true odmítne každý řádek, jehož kontrolní součet modulo 10 ve sloupci 69 je chybný — dobrá kontrola integrity čerstvě staženého souboru. Výchozí hodnota je false, protože syntetické výukové scénáře používají zástupné kontrolní součty.
3. Poznámky k epochám — přečtěte si před citováním čísla geometrie#
SGP4 propaguje každou družici od její vlastní epochy TLE a parse_propagators (v src/tle.rs) vrací pouze propagátory, takže čas scénáře t se na každou družici uplatňuje nezávisle jako tsince = t. To je správná konvence jen tehdy, když všechny sady elementů v souboru sdílejí epochu.
Skupinový soubor Celestraku vám to nedává. Soubor je stažen v jednom okamžiku, ale sada elementů každé družice se obnovuje vlastním tempem, takže epochy v něm jsou rozloženy na dny. Změřeno na sadách vendorovaných v tomto repozitáři (řádek 1, sloupce 19–32):
| fixture | sady | rozptyl epoch |
|---|---|---|
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 je 5,9 oběhu GPS. Při propagaci tak, jak je, je fázování v rovině zpřeházené: družice jsou ve správných výškách a sklonech, ale nejsou tam, kde byly v kterýkoli jeden den, takže viditelná množina, faktor DOP (zhoršení přesnosti) a z nich vypočtená dostupnost popisují konstelaci, která nikdy neexistovala. Nic v parseru tento rozptyl neměří a druhy orbit a integrity epochy nesjednocují: blok TLE ve scénáři se vždy propaguje s epochou každé družice zvlášť.
Udělejte raději toto. Uchovejte epochu vedle propagátoru, vyberte jeden referenční okamžik a posuňte k němu tsince každé družice. Tle::epoch_days_1950 je veřejné, takže smyčka zpracování je krátká; tests/igs_real_data.rs (real_gps_tle_snapshot) je řešený příklad v tomto stromu:
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 je soustava pravého rovníku a středního jarního bodu, ve které SGP4 pracuje; tests/igs_real_data.rs ji pomocí teme_to_ecef otáčí do souřadnic pevných vůči Zemi.
Pokud epochy nesjednotíte, uveďte to při vykazování čísla: je to výrok o orbitálních slupkách, nikoli o skutečné obloze.
Jak moc na tom záleží, je změřeno v tests/araim_dual_real_data.rs, které uplatňuje tytéž posuny (referenční okamžik: nejnovější epocha v kombinovaných fixture GPS + Galileo, 2026-06-07T07:21:04 UTC (koordinovaný světový čas)) během 24 h běhu dostupnosti dvoukonstelačního ARAIM (pokročilé autonomní monitorování integrity v přijímači). Při VAL (vertikální mez výstrahy) 12 m dává zarovnaná obloha pro samotné GPS 0,993, pro sloučené GPS+Galileo 1,000 a pro dvojí konstelaci odolnou proti poruše konstelace 0,990; nezarovnaná konvence s epochou každé družice zvlášť dává pro tytéž vstupy 0,208, 0,671 a 0,031 — jiný závěr, nikoli malou chybu.
Viz také#
README.md— scénáře oběžných drah.SCENARIOS.md— pole druhuorbit; druhyintegrity,gnss-sim,jammingaconstellation-designberou stejnou tabulkuconstellationaephemerisbere jedinétle.INTEGRITY.md— engine ARAIM, který test se skutečnou oblohou řídí.src/tle.rs— parser (parse_propagators,ParseOpts { strict_checksum }).