Використання реальних TLE орбітальних угруповань
Вбудований scenarios/orbit-sgp4-gps.toml уже містить реальні TLE (двострокові набори елементів): знімок Celestrak gps-ops чинного орбітального угруповання GPS (Global Positioning System), каталогізований 2021-07-28, 30 супутників, із strict_checksum = true. Кожен супутник поширюється за SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4), який перевірено за офіційними векторами AIAA (American Institute of Aeronautics and Astronautics) 2006-6753. Той самий знімок включено до репозиторію як tests/fixtures/celestrak/gps-ops_2021-07-28.txt, а scripts/fetch_tles.sh завантажує свіжий. Прочитайте розділ 3, перш ніж цитувати з нього число геометрії: цей сценарій поширює кожен супутник від його власної епохи.
Для синтетичного, самодостатнього прикладу scenarios/orbit-real-tle.toml дає шість супутників, подібних до GPS, як голі записи рядка 2, що поширюються як аналітичні кеплерові елементи, а кожен сценарій orbit без блока tle будує сузір'я Волкера.
Щоб вивчати поточне орбітальне угруповання GPS (або будь-яке інше), підставте свіжий знімок.
1. Завантажте поточний знімок#
Celestrak перерозповсюджує набори елементів каталогу NORAD (Командування протиповітряної оборони Північної Америки), що оновлюються щонайменше щодня. Для GPS:
curl -o gps-ops.txt "https://celestrak.org/NORAD/elements/gp.php?GROUP=gps-ops&FORMAT=tle"
Інші корисні групи: galileo, glo-ops (ГЛОНАСС, російська Global Navigation Satellite System), beidou, stations (МКС, Міжнародна космічна станція, та інші станції з екіпажем).
Файл — це послідовність трирядкових записів (назва, рядок 1, рядок 2). Аналізатор Kshana ігнорує рядки назв, тож файл можна вставляти як є.
2. Підставте його в сценарій#
У будь-якому орбітальному сценарії задайте блок tle орбітального угруповання як вміст знімка:
[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 — це номер псевдовипадкового шумового коду, який передає супутник GPS.)
Пара рядок 1 + рядок 2 поширюється за SGP4/SDP4 (члени опору та далекого космосу); голий рядок 2 трактується як аналітичні кеплерові середні елементи. Їх можна змішувати.
strict_checksum = true відхиляє будь-який рядок, у якого неправильна контрольна сума за модулем 10 у стовпці 69, — добра перевірка цілісності щойно завантаженого файла. За замовчуванням стоїть false, бо синтетичні навчальні сценарії використовують контрольні суми-заповнювачі.
3. Примітки про епохи — прочитайте це, перш ніж цитувати число геометрії#
SGP4 поширює кожен супутник від його власної епохи TLE, а parse_propagators (у src/tle.rs) повертає лише пропагатори, тож час сценарію t застосовується як tsince = t до кожного супутника незалежно. Це правильна умова лише тоді, коли всі набори елементів у файлі мають спільну епоху.
Груповий файл Celestrak цього не забезпечує. Файл завантажується в один момент, але набір елементів кожного супутника оновлюється з власною періодичністю, тож епохи в ньому розкидані на кілька діб. Виміряно на наборах, включених до цього репозиторію (рядок 1, стовпці 19–32):
| еталонний набір | набори | розкид епох |
|---|---|---|
tests/fixtures/celestrak/gps-ops_2026-06-07.txt |
32 | 70,6 год |
tests/fixtures/celestrak/gps-ops_2021-07-28.txt |
30 | 76,4 год |
tests/fixtures/celestrak/galileo_2026-06-07.txt |
33 | 335,7 год |
70,6 год — це 5,9 обертів GPS. Якщо поширювати як є, фазування в площині спотворюється: супутники перебувають на правильних висотах і нахилах, але не там, де вони були в якийсь один день, тож видимий набір, DOP (погіршення точності) і будь-яка обчислена з них доступність описують угруповання, якого ніколи не існувало. Ніщо в аналізаторі не вимірює цей розкид за вас, а типи orbit і integrity не вирівнюють епохи: блок TLE у сценарії завжди поширюється за епохою кожного супутника.
Зробіть натомість так. Зберігайте епоху разом із пропагатором, оберіть один опорний момент і зсувайте tsince кожного супутника до нього. Tle::epoch_days_1950 є публічним, тож цикл розбору короткий; tests/igs_real_data.rs (real_gps_tle_snapshot) — розв'язаний приклад у цьому дереві:
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 — це система відліку істинного екватора та середнього рівнодення, в якій працює SGP4; tests/igs_real_data.rs перетворює її на земні координати за допомогою teme_to_ecef.
Якщо ви не вирівнюєте, скажіть про це, коли повідомляєте число: воно говорить про орбітальні оболонки, а не про реальне небо.
Наскільки це важливо, виміряно в tests/araim_dual_real_data.rs, який застосовує ті самі зсуви (опорний момент: остання епоха в об'єднаних зразках GPS + Galileo, 2026-06-07T07:21:04 UTC (всесвітній координований час)) у прогоні доступності на 24 год ARAIM (розширений автономний контроль цілісності приймачем) із двома угрупованнями. За VAL (вертикальна межа сповіщення) 12 м вирівняне небо дає для лише GPS 0,993, для об'єднаних GPS+Galileo 1,000 та для двоугруповання, стійкого до збоїв угруповання, 0,990; невирівняна умова епохи кожного супутника дає 0,208, 0,671 і 0,031 за тих самих вхідних даних — інший висновок, а не мала похибка.
Див. також#
README.md— орбітальні сценарії.SCENARIOS.md— поля типуorbit; типиintegrity,gnss-sim,jammingіconstellation-designберуть ту саму таблицюconstellation, аephemerisбере одинtle.INTEGRITY.md— рушій ARAIM, який використовує тест на реальному небі.src/tle.rs— аналізатор (parse_propagators,ParseOpts { strict_checksum }).