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

Начало работыПравить на GitHubИсточник: docs/tutorials/01-first-orbit.md

Учебник 1 — Моя первая орбита: где находятся спутники GPS

Kind: orbit · Сценарий: scenarios/orbit-sgp4-gps.toml (учебная копия: scenarios/orbit.toml) · Сложность: начальная · ~15 мин

К концу вы распространите по орбите реальную действующую орбитальную группировку GPS, прочитаете её доступность и геометрию и экспортируете таблицу того, где на самом деле находится каждый спутник в пространстве, — и будете знать, что эта таблица проверена по внешнему эталону, а не сама по себе.

Что это за сценарий#

Спутники GPS (Global Positioning System) сообщают пользователю, где он находится и который час. Прежде всего нужно знать, где находятся спутники и сколько из них пользователь видит. Это геометрия, а геометрия задаёт нижнюю границу того, насколько точно можно определить положение (геометрический фактор DOP, ухудшение точности). Этот учебник:

  1. берёт подлинный снимок Celestrak gps-ops орбитальной группировки GPS (2021-07-28, 30 спутников, настоящие двухстрочные элементы, TLE),
  2. распространяет по орбите каждый спутник с помощью проверенной модели SGP4/SDP4 (Simplified General Perturbations 4 / Simplified Deep-space Perturbations 4),
  3. на каждом шаге по времени определяет, какие спутники видит пользователь на низкой околоземной орбите (линия прямой видимости, затмение Землёй и маска возвышения 5°),
  4. превращает эту геометрию в PDOP (геометрический фактор положения) и точность положения и
  5. экспортирует фактические геоцентрические, связанные с Землёй (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 часов, где сигнал ГНСС отнимается, и бортовые часы должны продержаться самостоятельно.