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

ОрбитыПравить на GitHubИсточник: docs/SGP4-VALIDATION.md

Валидация SGP4/SDP4 по эталону сообщества

Орбитальный пропагатор Kshana проверен по каноническому эталону сообщества для SGP4/SDP4 (SGP4: Simplified General Perturbations 4; SDP4: Simplified Deep-space Perturbations 4): проверочным векторам, опубликованным вместе с Vallado et al., "Revisiting Spacetrack Report #3" (AIAA (American Institute of Aeronautics and Astronautics) 2006-6753), распространяемым как SGP4-VER.TLE (тестовые TLE (двухстрочные наборы элементов)) и tcppver.out (ожидаемое состояние TEME (истинный экватор, среднее равноденствие) в каждый момент). Это тот же эталон, по которому проверяются общедоступные реализации на C++/Python/MATLAB, поэтому согласие здесь — это согласие с фактическим стандартом.

Результат#

Величина Значение
Сравнённые эталонные состояния 666 (все строки в tcppver.out, зафиксированы в тесте)
Наибольшая ошибка положения 4,12 мм (4.120e-6 км, спутник 23333; < допуска 2e-5 км)
Наибольшая ошибка скорости 1.85e-9 км/с (спутник 23333; < допуска 1e-6 км/с)
Охваченные случаи SGP4 для околоземных орбит, SDP4 для дальнего космоса (лунно-солнечные возмущения + резонанс 12 ч/24 ч) и намеренные случаи с кодами ошибок

Случаи дальнего космоса и резонансные важны именно для этого проекта: спутники GNSS (глобальная навигационная спутниковая система) находятся на орбитах ~12 ч, которые относятся к дальнему космосу и резонансны и которые модель «две точки + вековой J2» воспроизвести не может, а SGP4/SDP4 — может.

Метод#

  • Реализация (src/sgp4.rs) — порт общедоступного алгоритма Vallado на Rust без зависимостей; эпохи считаются в сутках с 1950 года, используется режим improved (а не afspc), а гравитационные константы WGS-72 (WGS: Всемирная геодезическая система) применяются так, как указывает эталон.
  • Тест (tests/sgp4_verification.rs) разбирает включённые в репозиторий эталонные файлы SGP4-VER.TLE и tcppver.out (tests/fixtures/sgp4/), распространяет каждый тестовый спутник на каждый эталонный момент и проверяет, что положение и скорость TEME совпадают в пределах указанных выше допусков. Число сравниваемых строк закреплено ровно на 666, чтобы сбой в эталонных данных или в поведении пропуска не мог незаметно уменьшить охват.

Воспроизвести#

cargo test --test sgp4_verification -- --nocapture

Тест выводит число сравнённых строк и наибольшие ошибки положения и скорости. Эталонные файлы включены в репозиторий, поэтому проверка полностью автономна и детерминирована.

Независимая перекрёстная проверка с крейтом sgp4#

Совпадение с опубликованным эталоном доказывает правильность относительно таблицы. Чтобы доказать также правильность относительно независимой реализации, tests/sgp4_crate_comparison.rs запускает широко используемую независимую библиотеку SGP4 на Rust — крейт sgp4 (neuromorphicsystems/sgp4, версия 2,4) — на тех же 666 векторах AIAA и сравнивает два кода напрямую. Оба работают с гравитационной моделью WGS72 (Всемирная геодезическая система 1972), в которой определены векторы (по умолчанию from_elements крейта использует WGS84 (Всемирная геодезическая система 1984), которая отличается от эталона WGS72 примерно на километры — это выбор модели, о котором честно сообщается, а не ошибка).

Режим kshana ↔ эталон крейт ↔ эталон kshana ↔ крейт
околоземные орбиты (LEO/MEO (LEO: низкая околоземная орбита; MEO: средняя околоземная орбита)) 7.3e-9 км 7.3e-9 км 4.4e-10 км
дальний космос (нерезонансные) 4.1e-6 км 2.1e-7 км 4.1e-6 км
резонанс дальнего космоса (½ суток) 8.1e-9 км 7.7e-9 км 2.2e-9 км
резонанс дальнего космоса (1 сутки) 8.2e-9 км 7.8e-9 км 2.2e-9 км

Две независимые реализации согласуются с субмикронной точностью на околоземных и резонансных орбитах и с 4,12 мм в наихудшем случае по всем режимам — те же 4,12 мм, что и собственное отклонение Kshana от эталона, то есть расхождение и есть этот единственный случай дальнего космоса, а крейт находится между Kshana и таблицей. Полная таблица (с числом строк по каждому режиму и четырьмя патологическими случаями, которые крейт отклоняет при создании) хранится в tests/fixtures/sgp4_comparison.md и формируется заново командой KSHANA_REGEN_FIXTURES=1 cargo test --test sgp4_crate_comparison.

Статус «публикации» этого результата#

Сама перекрёстная проверка завершена и находится в дереве исходного кода. Отправка результата во внешние места (каталог сообщества, краткая заметка, запись с архивированием по DOI (DOI: цифровой идентификатор объекта)) — действие сопровождающих, отслеживаемое отдельно в дорожной карте; этот документ — запись в репозитории, на которую такие отправки будут указывать.