Учебник 1 — Моя первая орбита: где находятся спутники GPS
Kind: orbit · Сценарий: scenarios/orbit-sgp4-gps.toml (учебная копия: scenarios/orbit.toml) · Сложность: начальная · ~15 мин
К концу вы распространите по орбите реальную действующую орбитальную группировку GPS, прочитаете её доступность и геометрию и экспортируете таблицу того, где на самом деле находится каждый спутник в пространстве, — и будете знать, что эта таблица проверена по внешнему эталону, а не сама по себе.
Что это за сценарий#
Спутники GPS (Global Positioning System) сообщают пользователю, где он находится и который час. Прежде всего нужно знать, где находятся спутники и сколько из них пользователь видит. Это геометрия, а геометрия задаёт нижнюю границу того, насколько точно можно определить положение (геометрический фактор DOP, ухудшение точности). Этот учебник:
- берёт подлинный снимок Celestrak
gps-opsорбитальной группировки GPS (2021-07-28, 30 спутников, настоящие двухстрочные элементы, TLE), - распространяет по орбите каждый спутник с помощью проверенной модели SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4),
- на каждом шаге по времени определяет, какие спутники видит пользователь на низкой околоземной орбите (линия прямой видимости, затмение Землёй и маска возвышения 5°),
- превращает эту геометрию в PDOP (геометрический фактор положения) и точность положения и
- экспортирует фактические геоцентрические, связанные с Землёй (ECEF) положения спутников в файл SP3 (Standard Product 3, формат прецизионных орбит Международной службы GNSS, IGS; GNSS — глобальная навигационная спутниковая система).
Основная цепочка такова: TLE → распространение SGP4 → ECEF на эпоху → видимость → число видимых спутников → PDOP → сигма положения = PDOP · σ_UERE, где σ_UERE — эквивалентная ошибка дальности пользователя (ошибка измерения дальности 1-σ на спутник).
Запустите#
cargo run -- scenarios/orbit-sgp4-gps.toml
Python:
import json, kshana
result = json.loads(kshana.run(open("scenarios/orbit-sgp4-gps.toml").read()))
print(result["geometry"]["best_pdop"], result["geometry"]["best_position_sigma_m"])
Или откройте Studio в браузере и выберите сценарий орбиты.
Прочитайте сводку в одну строку#
Детерминированный прогон (начальное значение (seed) = 17) печатает:
scenario 4c51512369a6 | 345/361 samples GNSS-nominal | best PDOP 1.07 pos 1.07m | quantum holdover 0s p95 2.59e-5ns integrity 1.000 security n/a (no attack) | classical holdover 0s p95 6.7ns integrity 1.000 security n/a (no attack)
Поле за полем:
scenario 4c51512369a6— 12-символьный хеш сценария. Он служит отпечатком точных входных данных (начальное значение, пороги, параметры модели, блок TLE). Измените любой вход — и он изменится; сохраните их прежними — и вы воспроизведёте прогон бит в бит. Тот же хеш проставляется в нижнем колонтитуле графика и в файле результата JSON (JavaScript Object Notation).345/361 samples GNSS-nominal— из 361 шагов по времени у пользователя пригодное решение есть на 345 из них (95,6 %). Прогон — это пролёт длительностью 12 ч (43 200 с) с шагом 120 с.best PDOP 1.07— лучший (наименьший) геометрический фактор положения за пролёт. PDOP около 1 означает отличную геометрию; чем ниже, тем лучше.pos 1.07m— лучшая точность положения: сигма положения = PDOP · σ_UERE. В этом сценарииsigma_uere_m = 1.0, поэтому два числа здесь численно равны, но правило — PDOP × UERE, а не «положение = PDOP». При UERE 3 м сигма положения составила бы около 3,2 м. (См. подводный камень в конце.)- Показатели часов (
holdover,p95,integrity,security) приходят вместе, потому что пакет орбиты также несёт часы на протяжении пролёта; они — тема учебника 2, а не этого. (securityчитается какn/a (no attack), потому что атака не настроена.)
Блок геометрии в JSON содержит исходные числа:
"geometry": {
"samples_total": 361,
"samples_with_fix": 345,
"sigma_uere_m": 1.0,
"best_pdop": 1.0713624151805556,
"median_pdop": 2.318376881311817,
"best_position_sigma_m": 1.0713624151805556,
"median_position_sigma_m": 2.318376881311817
}
Где находятся спутники? (результат)#
Геометрия хороша потому что спутники действительно находятся в оболочке GPS. Докажите это — экспортируйте их связанные с Землёй положения:
cargo run -- scenarios/orbit-sgp4-gps.toml --export-sp3 gps.sp3
Первые три спутника на первом шаге выборки, ECEF в км (файл SP3 содержит четвёртый столбец, часовой, в котором записан маркер «нет значения» 999999,999999):
PG01 9771.575585 24612.128830 0.003744 999999.999999
PG02 20449.643959 -11875.958365 -12379.457079 999999.999999
PG03 26467.367408 45.510223 4010.411755 999999.999999
Возьмём геоцентрический радиус PG01:
|r(PG01)| = sqrt(9771.575585^2 + 24612.128830^2 + 0.003744^2) = 26480.9 km
Не циклический оракул: действительно ли это орбита GPS?#
Учебное пособие, которое проверяет движок по нему самому, ничего не доказывает. Вот внешняя, нециклическая опора для каждого утверждения выше.
1. Спутники находятся на реальной оболочке средней околоземной орбиты (MEO) GPS. Номинальная большая полуось GPS составляет a = 26 560 км, высота ≈ 20 180 км над средним радиусом Земли 6 378 км (IS-GPS-200, интерфейсная спецификация GPS; стандарт характеристик стандартной службы позиционирования GPS (SPS), Министерство обороны США (DoD); Misra & Enge, Global Positioning System, 2-е изд.). Мгновенный радиус PG01 26 480,9 км отличается от a в пределах нескольких сотен км — именно это даёт реальный эксцентриситет GPS (~0,005–0,02). Тест tests/tutorials.rs::tutorial1_satellites_are_in_the_gps_meo_shell проверяет 26000 km < |r(PG01)| < 27200 km относительно этого опубликованного значения a, которое внешнее по отношению к Kshana.
2. Длительность прохода равна одному обороту GPS. Третий закон Кеплера даёт период T = 2π√(a³/μ) при a = 26,560 km и μ = 398,600.4418 km³/s² (Всемирная геодезическая система 1984, WGS-84; технический отчёт Национального агентства по снимкам и картографии NIMA TR8350.2): T = 43,078 s = 11.967 h, половина звёздных суток. Длительность сценария 43 200 с («~один оборот GPS») совпадает с этим значением с точностью до 0,3 %, а трасса GPS на поверхности повторяется каждые звёздные сутки (два оборота) согласно IS-GPS-200.
3. Распространённые положения проверены, а не просто согласованы между собой. Пропагатор SGP4/SDP4, который выдал эту таблицу ECEF, согласуется со всеми 666 проверочными векторами AIAA (Американский институт аэронавтики и астронавтики) 2006-6753 с наихудшим отклонением 4,12 мм (tests/sgp4_verification.rs, docs/SGP4-VALIDATION.md) и совпадает с независимым крейтом sgp4 с точностью до долей микрометра. Таким образом, экспортированная вами таблица сверена с внешней эталонной реализацией, а не с собственной арифметикой Kshana.
Замечание о датах в SP3. В заголовке эпох SP3 указана условная календарная дата (2000-01-01); на самом деле распространение идёт от собственной эпохи каждого TLE (2021). Читайте таблицу как «положения ECEF на первом шаге выборки», а не «на 1 января 2000 года».
Что закрепляет тест#
tests/tutorials.rs превращает каждое число выше в контракт CI:
tutorial1_orbit_headline_holds—best_pdop ≈ 1.071,best_position_sigma_m == best_pdop(посколькуsigma_uere_m = 1.0),samples_total == 361, а сводка содержит345/361.tutorial1_satellites_are_in_the_gps_meo_shell— радиус PG01 лежит в полосе оболочки GPS, проверено относительно опубликованного значенияa = 26,560 km.
Если движок когда-нибудь перестанет выдавать реальную оболочку GPS, сборка станет красной.
Подводные камни и единицы#
- Сигма положения равна PDOP × UERE, а не PDOP. Они равны только потому, что здесь
sigma_uere_m = 1.0. Измените UERE — и они разойдутся. - Показатели времени выражены в наносекундах, показатель положения — в метрах. Не смешивайте их.
holdover_sквантуется по сетке (нижняя граница на шаге сетки времени). В этом проходе пользователь практически всегда находится в режиме решения, поэтому holdover равен 0 с (нет перерыва, который нужно переждать на собственных силах) — это хороший случай.
Что дальше#
- Увеличьте или уменьшите маску возвышения (
mask_deg) и посмотрите, как меняется доступность — это упражнение уровня Tier-2. - Подставьте свежий снимок TLE с помощью
scripts/fetch_tles.sh(Tier-2 «использовать свежие данные»). - Перейдите к Учебному пособию 2 — Holdover часов, где сигнал ГНСС отнимается, и бортовые часы должны продержаться самостоятельно.