Машинный перевод, не проверенный носителем языка. Эталоном служит английская версия.

СценарииПравить на 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 (Американский институт аэронавтики и астронавтики) 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 (ГЛОНАСС, российская глобальная навигационная спутниковая система), 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 }).