Машинний переклад, не перевірений носієм мови. Еталоном є англійська версія.

СценаріїРедагувати на GitHubДжерело: docs/REAL_TLE_GUIDE.md

Використання реальних 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 }).