Валидация 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: цифровой идентификатор объекта)) — действие сопровождающих, отслеживаемое отдельно в дорожной карте; этот документ — запись в репозитории, на которую такие отправки будут указывать.