Навигационное сообщение LEO
Вид сценария leo-navmsg строит передаваемое сообщение с эфемеридами и часами навигационного спутника (позиционирование, навигация и время, PNT) на низкой околоземной орбите (LEO) и отвечает на вопросы разработчика сообщения: на какой срок хватает одного сообщения, что даёт каждый дополнительный параметр, что видит пользователь, когда сообщение меняется посреди пролёта, и сколько бит нужно, чтобы передать его с точностью до сантиметра.
Он не привязан к конкретной системе. Любая орбита, любая несущая и любая из четырёх моделей эфемерид работают вообще без предустановки; именованные предустановки — необязательные данные (см. Presets).
Выведите встроенный пример командой kshana example <name> (одно имя за вызов) и запустите его командой kshana scenarios/<name>.toml: leo-navmsg-fit-interval-trade, leo-navmsg-model-comparison, leo-navmsg-midpass-update и leo-navmsg-encode-decode. Этот вид также является стадией сообщения вида leo-pnt-chain (LEO-PNT.md) и участником кампании leo-focus-data-services, которая объединяет четыре конфигурации сообщения и сообщает длину кадра каждой (146, 154, 159 и 171 байт).
Код: src/leo_navmsg/ — elements.rs (записи и алгоритм пользователя), truth.rs (истинная орбита и часы), fit.rs (подгонка), sisre.rs (ошибка дальности сигнала в космосе), services.rs (ионосфера и всемирное координированное время (UTC)), codec.rs (двоичный формат), text.rs (экспорт в стиле RINEX (Receiver Independent Exchange Format) и в формате значений, разделённых запятыми (CSV)), presets/ (по одному файлу на предустановку), mod.rs (сам вид).
Что содержит сообщение#
| Часть | Содержимое |
|---|---|
| Вспомогательные данные | идентификатор космического аппарата (SVID), номер выпуска данных (IOD), идентификатор диапазона, состояние исправности сигнала (соглашение Galileo: 0 — исправен, 1 — не обслуживается, 2 — расширенная эксплуатация, 3 — на испытаниях) |
| Синхронизация | номер недели, время недели (TOW) передачи и полином часов второго порядка af0 + af1·(t − toc) + af2·(t − toc)² |
| Эфемериды | одна из четырёх моделей ниже |
| Другие службы | широковещательный ионосферный набор Klobuchar, коэффициенты NeQuick-G системы Galileo ai0, ai1, ai2 с пятью флагами бурь и параметры перехода от системного времени к UTC A0, A1, ΔtLS, t0t, WNot, WNLSF, DN, ΔtLSF |
Модели эфемерид#
| Код | Модель | Параметры |
|---|---|---|
kepler16 |
кеплеров набор из документа управления интерфейсом сигнала в пространстве Galileo Open Service (OS SIS ICD): √A, e, i0, Ω0, ω, M0, Δn, Ω̇, i̇, Cuc, Cus, Crc, Crs, Cic, Cis, toe |
16 |
kepler-rac |
то же плюс полиномы поправок вдоль трассы, поперёк трассы и радиальных (RAC) a0…, c0…, r0… по τ = tk / tau_s, коэффициенты в метрах, tau_s — степень двойки не ниже половины интервала подгонки (передаётся), степени задаются rac_degrees (по умолчанию 7, 5, 6) |
по умолчанию 16 + 21, плюс шкала времени |
liu22 |
22-параметрическая модель Liu, Su, Xie, Zhou и Qu (2025, Remote Sensing 17(16):2894, doi 10.3390/rs17162894): 16 параметров плюс ȧ, ṅ, Crs3, Crc3, Crs1, Crc1 |
22 |
ecef-poly |
модель «нулевых часов» ATOMIC (Autonomous Time and Orbit Determination for Microsatellite Constellations): полином в земной системе координат ECEF по каждой оси от τ = (t − t_ref) / 64 s (степень по умолчанию 6), без членов часов, так как часы спутника привязаны к системному времени (InsideGNSS) |
по умолчанию 22 |
Алгоритм пользователя (elements::sat_state) — это последовательность из ICD Galileo (уравнение Кеплера, поправки второй гармоники, земной узел), после которой для kepler-rac применяются три полинома вдоль собственной системы координат кеплеровой орбиты: радиальный — вдоль вычисленного положения, поперёк трассы — вдоль нормали к орбите по исправленным наклонению и узлу, вдоль трассы — дополняющий тройку. Часы добавляют релятивистский член из ICD F·e·√A·sin E; для ecef-poly это общая форма −2 r·v / c², вычисляемая по полиному и его производной.
Члены Liu и др. следуют алгоритму пользователя из статьи (раздел 2,2, формулы 1-7): A = A0 + ȧ·tk, n = √(μ/A0³) + Δn + ṅ·tk (выпуски до 0,30 использовали соглашение гражданской навигации Global Positioning System (GPS) ½·ṅ·tk, поэтому записанное ими ṅ вдвое больше, чем в статье), и Crs1·sin Φ + Crc1·cos Φ + Crs3·sin 3Φ + Crc3·cos 3Φ, добавляемое к радиусу, где Φ — неисправленный аргумент широты. Соглашение о масштабе ṅ перенесено из формулы 1 статьи; сравнение со статьёй на реальных орбитах от него не зависит (множитель ½ при ṅ не меняет ни одной подогнанной величины), поэтому смысл передаваемого значения nDot там не проверен.
Два прочтения принадлежат самой Kshana и названы как таковые:
- Система координат RAC и нормировка
τ = tk / tau_s. Ни один открытый документ не определяет систему координат поправок LEO для широковещательного сообщения. - Часы сообщения с нулевыми часами равны нулю в целом: предполагается, что контур привязки удерживает видимые часы, включая релятивистский член, на системном времени.
Подгонка#
truth.rs интегрирует орбиту методом Рунге — Кутты четвёртого порядка с фиксированным шагом в системе координат, переходящей в земные оси одним поворотом, θ(t) = θ0 + Ω̇e·t, — тем же единственным поворотом, который применяет широковещательный алгоритм пользователя. Гравитация задаётся как двухтельная (gravity_degree = 0), зональные гармоники J2–J6 (от 2 до 6) или поле модели Earth Gravitational Model 2008 (EGM2008) до степени и порядка от 7 до 70, тессеральные члены которой несут короткопериодическую сигнатуру, из-за которой подгонка на LEO затруднена. Сопротивление необязательно (статическая экспоненциальная плотность). Часы либо свободные (смещение, дрейф, скорость дрейфа и белый частотный шум с заданной девиацией Аллана за одну секунду, плюс периодический релятивистский член), либо привязанные (остаток Гаусса — Маркова первого порядка).
fit.rs подгоняет кеплеров набор методом Левенберга — Марквардта по неособым элементам (e·cos ω, e·sin ω, λ0 = M0 + ω): орбита LEO почти круговая, поэтому ω и M0 по отдельности почти неразличимы. Подгонка начинается с оскулирующего состояния в toe со скоростью узла от J2. Слабые априорные значения с нулевым центром ограничивают скорости и гармоники, которые короткая дуга разрешить не может; при весе наблюдений 1 cm они действуют только в этих нулевых направлениях. Подгонка liu22 вместо этого берёт начало и оценщик из раздела 2,3 статьи: она начинается с нулевых членов поправок, без априорных значений (обычный метод наименьших квадратов) и сохраняет предел статьи в 100 итераций. Она останавливается по собственному правилу сходимости параметров Kshana, когда каждый шаг параметра меньше 1e-3 его формального стандартного отклонения; статья же останавливается, когда RMS меняется менее чем на 0,1 mm. Затем полиномы RAC подгоняются к остаткам вдоль трассы, поперёк трассы и радиальным линейным методом наименьших квадратов, а полином часов — к истинным часам за вычетом релятивистского члена, который пользователь добавит обратно.
Вывод, закодированный в значениях по умолчанию: после подгонки кеплерова набора методом наименьших квадратов остаток по построению — это то, что 16 параметров охватить не могут, поэтому он колеблется по всему окну (несколько пересечений нуля в каждой компоненте), а не дрейфует. Полином поправок убирает его только тогда, когда его степень превышает то, что уже охватывает кеплеров набор: вдоль трассы 7, поперёк трассы 5 и радиальная 6 сводят 15-минутный остаток с сантиметров примерно к миллиметру, тогда как меньшие степени поперёк трассы почти ничего не убирают (остаток поперёк трассы нечётен относительно центра окна). Система, которая выводит кеплерову часть иным способом, оставляет остаток другой формы, и нужные ей степени определяются им. Собственные степени поправок предустановки Celeste (они ниже указанных; они есть только в файле предустановки, src/celeste_iod.rs) выполняются здесь на основе наименьших квадратов Kshana, поэтому её члены поперёк трассы в этом движке вносят мало: это утверждение о подгонке Kshana, а не о какой-либо реальной системе. toe и toc — целые секунды, так как их так передаёт двоичный формат.
Каждое сообщение используется в течение периода, центрированного в окне его подгонки (первая таблица сопоставления использует всё окно). Величины ошибки дальности сигнала в космосе (SISRE) измеряют ошибку представления сообщения относительно истины, к которой оно подогнано, как среднеквадратичное значение (RMS) и максимум на интервале. Ошибка определения и прогнозирования орбиты, которую реальный наземный или бортовой сегмент добавляет сверху, не моделируется.
Ошибка дальности сигнала в космосе#
sisre.rs использует глобальное среднее SISRE по Montenbruck, Steigenberger и Hauschild (2018, Advances in Space Research 61(12):3020–3038, doi 10.1016/j.asr.2018.03.041):
SISRE_orb = sqrt( w_R² R² + w_AC² (A² + C²) )
SISRE = sqrt( (w_R R − c·dT)² + w_AC² (A² + C²) )
Веса — это средние по пользователям, равномерно распределённым по видимой шапке Земли, от cos² η и ½ sin² η, где η — угол надира линии визирования у спутника, вычисленный для собственного радиуса орбиты и маски по углу места. При маске 0° вычисление воспроизводит таблицу статьи для средней околоземной орбиты (GPS 0,98 и 1/49, ГЛОНАСС 1/45, Galileo 1/61, BeiDou 1/54) и геостационарной орбиты (0,99 и 1/126): это проверка уровня VALIDATED. На LEO то же усреднение даёт
| Высота | w_R |
1 / w_AC² |
угол надира горизонта |
|---|---|---|---|
| 320 km | 0.384 | 2.35 | 72.2° |
| 510 km | 0.459 | 2.53 | 67.8° |
| 550 km | 0.472 | 2.57 | 67.0° |
| 786 km | 0.536 | 2.81 | 62.9° |
| 1080 km | 0.597 | 3.11 | 58.8° |
| 1336 km | 0.638 | 3.37 | 55.8° |
поэтому пользователь LEO, который видит спутник далеко от надира, ощущает ошибки вдоль трассы и поперёк трассы гораздо сильнее, чем пользователь на средней орбите.
Анализы#
analysis = [...] выбирает любой из четырёх (по умолчанию все).
Сопоставление интервалов подгонки#
[trade] задаёт интервал, интервалы подгонки, периоды обновления и модели. scenarios/leo-navmsg-fit-interval-trade.toml (550 km, 97,6°, EGM2008 до степени 20 и сопротивление, 30 минут сообщений) при периоде использования, равном интервалу подгонки, даёт:
| Модель | Интервал подгонки | SISRE по орбите, RMS | SISRE по орбите, максимум | SISRE с часами, RMS | радиальная / вдоль трассы / поперёк трассы, RMS |
|---|---|---|---|---|---|
kepler16 |
60 s | 0,041 cm | 0,179 cm | 0,069 cm | 0,09 / 0,01 / 0,00 cm |
kepler16 |
120 s | 0,032 cm | 0,160 cm | 0,079 cm | 0,06 / 0,01 / 0,01 cm |
kepler16 |
180 s | 0,093 cm | 0,540 cm | 0,134 cm | 0,18 / 0,06 / 0,00 cm |
kepler16 |
300 s | 0,310 cm | 1,033 cm | 0,329 cm | 0,09 / 0,49 / 0,02 cm |
kepler16 |
450 s | 1,690 cm | 7,542 cm | 1,696 cm | 0,72 / 2,65 / 0,04 cm |
kepler16 |
600 s | 2,875 cm | 10,219 cm | 2,866 cm | 1,72 / 4,42 / 0,26 cm |
kepler16 |
900 s | 9,345 cm | 34,032 cm | 9,349 cm | 6,46 / 14,14 / 0,91 cm |
kepler-rac |
60 s | 0,000 cm | 0,000 cm | 0,057 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
120 s | 0,000 cm | 0,000 cm | 0,074 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
180 s | 0,000 cm | 0,001 cm | 0,090 cm | 0,00 / 0,00 / 0,00 cm |
kepler-rac |
300 s | 0,004 cm | 0,014 cm | 0,106 cm | 0,00 / 0,00 / 0,01 cm |
kepler-rac |
450 s | 0,037 cm | 0,176 cm | 0,127 cm | 0,05 / 0,01 / 0,04 cm |
kepler-rac |
600 s | 0,214 cm | 0,643 cm | 0,229 cm | 0,28 / 0,09 / 0,26 cm |
kepler-rac |
900 s | 1,015 cm | 3,695 cm | 1,062 cm | 1,52 / 0,70 / 0,91 cm |
А при подгонке на 300 s, с разной частотой смены сообщения новым:
| Модель | Период обновления | SISRE по орбите, RMS | SISRE по орбите, максимум |
|---|---|---|---|
kepler16 |
30 с | 0,314 cm | 0,850 cm |
kepler16 |
60 s | 0,288 cm | 0,859 cm |
kepler16 |
150 s | 0,219 cm | 0,830 cm |
kepler16 |
300 s | 0,310 cm | 1,033 cm |
kepler-rac |
30 с | 0,004 cm | 0,009 cm |
kepler-rac |
60 s | 0,004 cm | 0,009 cm |
kepler-rac |
150 s | 0,004 cm | 0,010 cm |
kepler-rac |
300 s | 0,004 cm | 0,014 cm |
16-параметрический кеплеров набор ухудшается с 0,04 cm при 60 s до 9,35 cm при 900 s: один кеплеров набор с двукратными за оборот гармониками не может следовать более высокочастотным гравитационным членам и сопротивлению дуги LEO дольше нескольких минут, а его остаток по методу наименьших квадратов колеблется по всему окну. Полиномы вдоль трассы, поперёк трассы и радиальный (степени 7, 5, 6) поглощают оставшееся: 1,01 cm при 900 s, 0,21 cm при 600 s. На самых коротких интервалах кеплеровы величины составляют доли миллиметра и уже не строго упорядочены (подгонка тогда ограничена обусловленностью, а не моделью).
Сравнение моделей#
scenarios/leo-navmsg-model-comparison.toml запускает четыре модели с интервалами 1, 5 и 10 минут на одной и той же орбите, с числом параметров и числом битов эфемерид и часов в кодировании Kshana:
| Модель | Интервал подгонки | Параметры | Биты эфемерид и часов | SISRE по орбите, RMS | SISRE с часами, RMS |
|---|---|---|---|---|---|
kepler16 |
60 s | 16 | 570 | 0,022 cm | 0,049 cm |
kepler16 |
300 s | 16 | 570 | 0,230 cm | 0,260 cm |
kepler16 |
600 s | 16 | 570 | 3,061 cm | 3,071 cm |
kepler-rac |
60 s | 37 | 1045 | 0,000 cm | 0,044 cm |
kepler-rac |
300 s | 37 | 1045 | 0,005 cm | 0,120 cm |
kepler-rac |
600 s | 37 | 1045 | 0,160 cm | 0,208 cm |
liu22 |
60 s | 22 | 730 | 0,014 cm | 0,046 cm |
liu22 |
300 s | 22 | 730 | 0,074 cm | 0,142 cm |
liu22 |
600 s | 22 | 730 | 0,258 cm | 0,290 cm |
ecef-poly (нулевые часы) |
60 s | 22 | 750 | 0,000 cm | 28,784 cm |
ecef-poly (нулевые часы) |
300 s | 22 | 750 | 0,005 cm | 28,784 cm |
ecef-poly (нулевые часы) |
600 s | 22 | 750 | 0,561 cm | 28,774 cm |
Строка с нулевыми часами оценивается относительно часов, привязанных с остатком 0,24 m (величина ATOMIC), остальные — относительно свободных часов, которые они подгоняют.
Liu и др., 2025: SISRE в зависимости от высоты (MODELLED). Тот же сценарий подгоняет 22-параметрическую модель Kshana на 20-минутных дугах на пяти высотах из статьи, при наклонении каждого спутника:
| Спутник | Высота | Наклонение | Liu и др., 2025 | Kshana (RMS только по орбите) | отношение |
|---|---|---|---|---|---|
| GRACE-A | 320 km | 89.00° | 8,88 cm | 4,25 cm | 0.48 |
| GRACE-C | 475 km | 89.00° | 6,21 cm | 2,87 cm | 0.46 |
| Sentinel-2A | 786 km | 98.57° | 2,87 cm | 2,20 cm | 0.77 |
| HY-2A | 966 km | 99.34° | 2,11 cm | 1,25 cm | 0.59 |
| Sentinel-6A | 1336 km | 66.04° | 0,75 cm | 0,51 cm | 0.67 |
Это не валидация. В статье подгонялись реальные прецизионные научные орбиты названных спутников (с их полной историей гравитации, сопротивления и негравитационных воздействий); Kshana подгоняет собственную интегрированную орбиту, вычисляет шесть добавленных параметров, как описано выше, и использует собственные веса SISRE. Сравнение показывает тенденцию и порядок величины. Сравнение на тех же реальных орбитах, которые подгонялись в статье, — это tests/leo_navmsg_fit_real_orbit_oracle.rs (начиная с 0,30 22-параметрическая подгонка там согласуется в пределах заранее зарегистрированного множителя 1,5, как на днях из статьи, так и на восьми отложенных днях).
Обновление в середине пролёта#
[midpass] размещает пользователя (по умолчанию 45° с. ш., 10° в. д.), находит самый высокий пролёт над маской в пределах search_s и планирует сообщения каждые update_period_s. При каждом переключении внутри пролёта он сообщает скачок положения, скачок часов, скачок псевдодальности пользователя (новое сообщение минус старое), наибольший скачок, который мог бы увидеть любой видимый пользователь (замкнутая форма по конусу надира), ошибку дальности до и после, а также PASS или FAIL относительно threshold_m. scenarios/leo-navmsg-midpass-update.toml (подгонки на 300 s с обновлением каждые 150 s):
Самый высокий пролёт за сутки достигает 43,7° и длится 455 s. Его переключения:
| Переключение | Угол места | Скачок положения | Скачок часов | Скачок дальности пользователя | Скачок при наихудшей геометрии |
|---|---|---|---|---|---|
| IOD 270 → 271 | 12.7° | 0,07 mm | 0,19 mm | -0.17 mm | 0,27 mm |
| IOD 271 → 272 | 37.4° | 0,14 mm | 0,14 mm | -0.24 mm | 0,27 mm |
| IOD 272 → 273 | 28.2° | 0,27 mm | -0.22 mm | 0,35 mm | 0,48 mm |
Наибольший скачок дальности пользователя 0,35 mm при пороге 5 cm: PASS.
Кодирование и декодирование#
scenarios/leo-navmsg-encode-decode.toml кодирует первое из трёх сообщений, декодирует его, проверяет CRC и отвергает повреждённую копию, выводит бюджет квантования, а также записывает и считывает обратно блок в стиле RINEX и таблицу CSV:
- кадр: 171 байт (1310 бит полезной нагрузки, из них 1045 — эфемериды и часы), 24-битный циклический избыточный код (CRC-24Q)
0x19105F; - наибольшее влияние половины шага для любого одного поля:
af0, 0,545 mm; - всё сообщение после квантования: положение в пределах 1,126 mm и часы в пределах 0,185 mm от точного сообщения; SISRE 0,113 cm для точного, 0,129 cm для декодированного;
- кадр с одним инвертированным битом отвергается: true;
- круговое преобразование в стиле RINEX в пределах 5.0e-06 m, круговое преобразование CSV в пределах 0.0e+00 m.
Независимость от платформы#
Кадр — это передаваемые целые числа, поэтому это должны быть одни и те же целые числа, где и как бы ни выполнялся сценарий: в нативном двоичном файле в любой операционной системе, в отладочной или релизной сборке и в сборке WebAssembly (WASM) в браузере. Этому мешали три обстоятельства. От синуса, косинуса, арктангенса и экспоненты из математической библиотеки хоста не требуется корректного округления, и на разных хостах они различаются в последнем разряде. Оптимизированная сборка на macOS берёт синус и косинус одного аргумента из комбинированной процедуры системы, которая не всегда возвращает значение отдельного синуса, поэтому отладочная и релизная сборки тоже различались. А обычный генератор нормальных величин вызывает экспоненту и логарифм хоста в своих редких ветвях. Подгонка превращает столь малую разницу в разные квантованные поля. Поэтому весь вид (истинная орбита и часы, подгонка, алгоритм пользователя, ошибка дальности сигнала в космосе (SISRE), кодек) вычисляет каждую такую функцию чистым Rust-крейтом libm через src/portable_math.rs, целые степени — явными произведениями, а нормальные отклонения — полярным методом по сырому выводу генератора. leo_navmsg::tests::the_encoded_frame_is_the_same_bytes_on_every_platform фиксирует 171-байтовый кадр сценария кодирования и декодирования, приведённого ниже, и одно контрольное значение на каждую модель эфемерид; отладочная сборка, релизная сборка и сборка WASM дают побайтово одинаковые документы результата для всех пяти встроенных сценариев leo-navmsg.
Двоичный формат#
Это собственное документированное кодирование Kshana. Оно несёт компоненты, которые называют опубликованные описания навигационных сообщений LEO, и построено по образцу набора полей ICD Galileo. Оно не является раскладкой битов Celeste или какой-либо другой системы: ни одна из них не является открытой.
Кадр: преамбула 0xA7 (8 бит), версия 1 (4), модель (4: 1 kepler16, 2 kepler-rac, 3 liu22, 4 ecef-poly), длина полезной нагрузки в байтах (12), полезная нагрузка, дополненная нулями до целого байта, CRC-24Q (24-битный циклический избыточный код, 24 бита) по всем предшествующим байтам. CRC-24Q — это контрольный код стандарта Radio Technical Commission for Maritime Services RTCM 10403 и ICD Galileo (полином 0x1864CFB, начальное значение 0); код воспроизводит каталожное контрольное значение 0xCDE703 для 123456789 и контрольные байты примера кадра RTCM 10403 типа сообщения 1005 (VALIDATED).
Шаги ICD Galileo выбраны для средней околоземной орбиты и слишком грубы для сообщения LEO с сантиметровой точностью: Crs с шагом 2⁻⁵ m (3,1 cm), Cuc 2⁻²⁹ рад (1,3 cm при радиусе LEO), углы 2⁻³¹ полуокружности (1,0 cm) и af0 2⁻³⁴ s (1,7 cm). Kshana сохраняет единицы ICD и соглашение о полуокружности, уточняет шаги так, чтобы ошибка половины шага каждого поля оставалась ниже 1 mm положения или дальности на 15-минутном окне, и расширяет поля, чтобы сохранить диапазоны, нужные подгонке LEO:
| Блок | Поле | Биты | Шаг | Единица |
|---|---|---|---|---|
| вспомогательные данные и синхронизация | SVID |
8 | 1 | - |
| вспомогательные данные и синхронизация | IOD |
10 | 1 | - |
| вспомогательные данные и синхронизация | Band |
4 | 1 | - |
| вспомогательные данные и синхронизация | Health |
2 | 1 | - |
| вспомогательные данные и синхронизация | WeekNumber |
13 | 1 | неделя |
| вспомогательные данные и синхронизация | ToW |
20 | 1 | s |
| вспомогательные данные и синхронизация | Flags |
4 | 1 | - |
| часы (флаговый бит 0) | toc |
20 | 1 | s |
| часы (флаговый бит 0) | af0 |
34 | 2^-38 | s |
| часы (флаговый бит 0) | af1 |
28 | 2^-50 | s/s |
| часы (флаговый бит 0) | af2 |
20 | 2^-62 | s/s^2 |
| кеплеровы (модели 1-3) | toe |
20 | 1 | s |
| кеплеровы (модели 1-3) | M0 |
36 | 2^-35 | полуокружность |
| кеплеровы (модели 1-3) | e |
32 | 2^-33 | - |
| кеплеровы (модели 1-3) | sqrtA |
36 | 2^-23 | m^0,5 |
| кеплеровы (модели 1-3) | Omega0 |
36 | 2^-35 | полуокружность |
| кеплеровы (модели 1-3) | i0 |
36 | 2^-35 | полуокружность |
| кеплеровы (модели 1-3) | omega |
36 | 2^-35 | полуокружность |
| кеплеровы (модели 1-3) | deltaN |
29 | 2^-43 | semicircle/s |
| кеплеровы (модели 1-3) | OmegaDot |
29 | 2^-43 | semicircle/s |
| кеплеровы (модели 1-3) | iDot |
22 | 2^-43 | semicircle/s |
| кеплеровы (модели 1-3) | Cuc |
26 | 2^-34 | рад |
| кеплеровы (модели 1-3) | Cus |
26 | 2^-34 | рад |
| кеплеровы (модели 1-3) | Crc |
26 | 2^-10 | m |
| кеплеровы (модели 1-3) | Crs |
26 | 2^-10 | m |
| кеплеровы (модели 1-3) | Cic |
26 | 2^-34 | рад |
| кеплеровы (модели 1-3) | Cis |
26 | 2^-34 | рад |
| поправки вдоль трассы, поперёк трассы и радиальные (модель 2) | degA |
3 | 1 | - |
| поправки вдоль трассы, поперёк трассы и радиальные (модель 2) | degC |
3 | 1 | - |
| поправки вдоль трассы, поперёк трассы и радиальные (модель 2) | degR |
3 | 1 | - |
| поправки вдоль трассы, поперёк трассы и радиальные (модель 2) | racTauExp |
4 | 1 | log2(s) |
| поправки вдоль трассы, поперёк трассы и радиальные (модель 2) | a_k, c_k, r_k |
22 | 2^-14 | m |
| дополнения Liu и др., 2025 (модель 3) | aDot |
26 | 2^-20 | m/s |
| дополнения Liu и др., 2025 (модель 3) | nDot |
30 | 2^-58 | полуокружность/s^2 |
| дополнения Liu и др., 2025 (модель 3) | Crs3 |
26 | 2^-10 | m |
| дополнения Liu и др., 2025 (модель 3) | Crc3 |
26 | 2^-10 | m |
| дополнения Liu и др., 2025 (модель 3) | Crs1 |
26 | 2^-10 | m |
| дополнения Liu и др., 2025 (модель 3) | Crc1 |
26 | 2^-10 | m |
| полином ECEF (модель 4) | tref |
20 | 1 | s |
| полином ECEF (модель 4) | degP |
4 | 1 | - |
| полином ECEF (модель 4) | x0, y0, z0 |
38 | 2^-11 | m |
| полином ECEF (модель 4) | x_k, y_k, z_k (k >= 1) |
34 | 2^-12 | m |
| Klobuchar (флаговый бит 1) | alpha0 |
8 | 2^-30 | s |
| Klobuchar (флаговый бит 1) | alpha1 |
8 | 2^-27 | s/semicircle |
| Klobuchar (флаговый бит 1) | alpha2 |
8 | 2^-24 | s/полуокружность^2 |
| Klobuchar (флаговый бит 1) | alpha3 |
8 | 2^-24 | s/полуокружность^3 |
| Klobuchar (флаговый бит 1) | beta0 |
8 | 2^11 | s |
| Klobuchar (флаговый бит 1) | beta1 |
8 | 2^14 | s/semicircle |
| Klobuchar (флаговый бит 1) | beta2 |
8 | 2^16 | s/полуокружность^2 |
| Klobuchar (флаговый бит 1) | beta3 |
8 | 2^16 | s/полуокружность^3 |
| NeQuick-G (флаговый бит 2) | ai0 |
11 | 2^-2 | sfu |
| NeQuick-G (флаговый бит 2) | ai1 |
11 | 2^-8 | sfu/deg |
| NeQuick-G (флаговый бит 2) | ai2 |
14 | 2^-15 | sfu/deg^2 |
| NeQuick-G (флаговый бит 2) | SF1-5 |
5 | 1 | - |
| UTC (флаговый бит 3) | A0 |
32 | 2^-30 | s |
| UTC (флаговый бит 3) | A1 |
24 | 2^-50 | s/s |
| UTC (флаговый бит 3) | dtLS |
8 | 1 | s |
| UTC (флаговый бит 3) | t0t |
8 | 3600 | s |
| UTC (флаговый бит 3) | WNot |
8 | 1 | неделя |
| UTC (флаговый бит 3) | WNLSF |
8 | 1 | неделя |
| UTC (флаговый бит 3) | DN |
3 | 1 | сутки |
| UTC (флаговый бит 3) | dtLSF |
8 | 1 | s |
Значение вне диапазона своего поля отвергается, а не переносится по модулю. Диапазоны проверялись кодированием подгонок на 300–2000 km, при наклонениях от 0° до 140° и интервалах подгонки до 20 минут: deltaN и OmegaDot широки, потому что на околоэкваториальной орбите узел определён плохо, и подгонка делит между ними J2-дрейф аргумента широты, а aDot и nDot — потому что 22-параметрическая подгонка на 20 минут поглощает часть короткопериодических колебаний большой полуоси. Начиная с 0,30 22-параметрическая подгонка — это обычный метод наименьших квадратов статьи без априорных значений, и экваториальная подгонка на 800 km тогда требует nDot около 6.3e-10 полуокружности/s^2, поэтому её масштаб изменился с 2^-60 на 2^-58. Поправки вдоль трассы степени 7 из kepler-rac укладываются в диапазон 22-битных коэффициентов до 15 минут; более длинная подгонка может его превысить и тогда отвергается. quantisation_budget сообщает для каждого поля эфемерид и часов наибольшее изменение положения и дальности от изменения на половину шага за период использования, а также изменение всего сообщения после квантования.
Текстовый экспорт#
RINEX 4,02 не определяет навигационных записей LEO (его системные буквы: G, R, E, J, C, I и S; Международная служба GNSS (IGS), RINEX 4,02). Блок, который записывает text.rs, заимствует форму RINEX 4 — заголовок записи > EPH, строку спутника и эпохи с тремя членами часов, строки широковещательной орбиты из четырёх полей D19.12 — и является документированным расширением Kshana: системная буква L, типы записей KP16, KRAC, LU22, APOL и три комментария заголовка, которые об этом говорят. Предшествующая работа по орбитам LEO в навигационных записях в стиле RINEX 4: arXiv 2401,17767.
> EPH L04 KRAC
L04 yyyy mm dd hh mm ss af0 af1 af2
IOD Crs deltaN M0
Cuc e Cus sqrtA
toe Cic Omega0 Cis
i0 Crc omega OmegaDot
IDOT Band Week Health
txTOW clock degA degC
degR tau_s a0 a1 then the rest of a_k, c_k and r_k, four per line
Таблица CSV содержит сообщения kepler16 и kepler-rac по одному в строке. Столбцы по умолчанию используют названия из ICD Galileo (SVID, IOD, Band, WeekNumber, ToW, Health, toc, af0, af1, af2, toe, M0, sqrtA, e, deltaN, Omega0, OmegaDot, iDot, i0, omega, Crc, Crs, Cic, Cis, Cuc, Cus, a0…, c0…, r0…, racTau); csv_schema выбирает вместо них написание предустановки. Оба формата читаются обратно.
Ионосфера и UTC#
- Klobuchar: модель L1 движка (
gnss_sim::klobuchar_delay_m, проверена по RTKLIB), приведённая к несущей по закону первого порядка(f_L1 / f)². - NeQuick-G: коэффициенты передаются в сообщении, и
effective_ionisation_levelвозвращаетAz = ai0 + ai1·μ + ai2·μ²для модифицированной магнитной широтыμпо правилам алгоритма (нулевые коэффициенты дают 63,7 единиц солнечного потока, sfu; результат ограничивается интервалом [0, 400] sfu). Модель электронной плотности NeQuick и её интегрирование по наклонной трассе, превращающиеAzв задержку, не реализованы. - Спутник на высоте в несколько сотен километров летает внутри ионосферы. Ни одна из широковещательных моделей не учитывает электронное содержание выше спутника, и поправка на него не применяется.
- UTC:
system_to_utcприменяет три случая из ICD Galileo, § 5.1.7 (до события високосной секунды, в пределах шести часов от него и после него); вставленная секунда читается как 86400.
Предустановки#
Предустановки — это данные, по одному файлу в src/leo_navmsg/presets/, с их источниками. Движок и все встроенные сценарии, кроме сценария Celeste, работают без них.
| Ключ | Источник | Орбита | Несущая | Модель сообщения |
|---|---|---|---|---|
xona-pulsar |
PUBLIC, arXiv 2509,19551 | 1080 km, 53° | X1 1593,3225 MHz | не опубликовано |
xona-pulsar-0 |
PUBLIC, arXiv 2509,19551 | 520 km, 97° | X1 | не опубликовано |
iridium |
PUBLIC, отчёт RNTF, описание орбитальной группировки | 781 km, 86,4° | 1621 MHz (диапазон 1616–1626 MHz) | не передаётся |
starlink |
PUBLIC, NAVIGATION 72(1), описание орбитальной группировки | 550 km, 53° | диапазон Ku, значение середины диапазона (репрезентативное) | нет (оппортунистические сигналы) |
centispace |
PUBLIC, Sensors 2023, Satellite Navigation 2026 | 700 km, 55° | вблизи B1 (скрыто в источнике; L1 как замена) | не опубликовано |
cband-generic |
REPRESENTATIVE | 600 km, 97,8° | 5020 MHz (центр диапазона C для RNSS) | не опубликовано |
atomic |
PUBLIC, InsideGNSS | 500 km (репрезентативное) | L1 (репрезентативное) | ecef-poly, степень 6, 60 s, обновление каждые 30 s, нулевые часы, остаток привязки 0,24 m |
celeste-iod |
WORKSHOP и PUBLIC | 510 km, 97,4° | 1191,795 MHz | kepler-rac, степени и интервал записей — в файле предустановки |
RNSS — радионавигационная спутниковая служба; RNTF — Resilient Navigation and Timing Foundation.
Celeste IOD. Предустановка Celeste in-orbit demonstration (IOD) Европейского космического агентства (ESA) — единственная, использующая материалы, представленные на семинаре по LEO-PNT программы ESA Navigation Innovation and Support Programme (NAVISP) в 2026 году: структуру сообщения (кеплеров набор Galileo плюс полиномы поправок вдоль трассы, поперёк трассы и радиальных, полином часов, SVID, исправность, IOD, ионосферные параметры и параметры UTC), интервал записей и имена столбцов CSV. Орбита (510 km, околополярная солнечно-синхронная) и несущая взяты из открытых источников, указанных в файле. Раскладка битов Celeste не является открытой и не воспроизводится; поздние фазы Celeste и система LEO-PNT Европейского союза (ЕС) могут отличаться. Каждое значение, полученное с семинара, находится в модуле navmsg файла src/celeste_iod.rs, используемом scenarios/leo-navmsg-celeste-iod.toml. Как предустановка удерживается: каждое число движка, полученное с семинара, находится в одном файле, src/celeste_iod.rs, который build.rs включает в сборку только при его наличии, и в сценариях только для репозитория scenarios/*celeste-iod*.toml. Удаление этого файла и этих сценариев удерживает предустановку без правки исходного кода; любые другие тесты, оракулы и сценарии работают без неё, а число файлов сценариев в README по-прежнему включает удержанные файлы.
Верификация#
| Строка | Метка | Оракул |
|---|---|---|
| Веса SISRE | VALIDATED | таблица Montenbruck и др., 2018 (GPS, ГЛОНАСС, Galileo, BeiDou, геостационарная орбита) |
| Алгоритм пользователя из ICD Galileo | VALIDATED | RTKLIB eph2pos на четырёх реальных широковещательных эфемеридах Galileo, 1 mm по каждой оси (tests/leo_navmsg_reference.rs) |
| CRC-24Q | VALIDATED | каталожное контрольное значение 0xCDE703; пример кадра RTCM 10403 1005 |
| Подгонка и сопоставление SISRE | MODELLED | двухтельная истина восстановлена до 1 mm; подгонка с поправками J2–J6 до 1 mm; монотонный рост с интервалом |
| Непрерывность в середине пролёта | MODELLED | тождество скачка; граница по конусу в замкнутой форме против выборки |
| Двоичный формат и бюджет | MODELLED | круговые преобразования; половина шага каждого поля менее 1 mm |
| стиль RINEX и CSV | MODELLED | круговые преобразования |
| 22-параметрическая модель Liu и др., 2025 и подгонка | VALIDATED | прецизионные орбиты TU Graz ITSG четырёх спутников против таблиц 4, 5, 6 и 8 статьи: отношения для вдоль трассы, поперёк трассы, радиального и SISRE от 0,755 до 1,138 на днях из статьи и от 0,683 до 1,186 на восьми отложенных днях, в пределах 1.5x (tests/leo_navmsg_fit_real_orbit_oracle.rs) |
| полином нулевых часов ATOMIC и таблица для пяти высот | MODELLED | факты ATOMIC из InsideGNSS; опубликованная таблица Liu приведена рядом с подгонкой Kshana по интегрированной орбите, без закрепления проверкой |
| Ионосфера и UTC | MODELLED | замкнутые формы ICD; модель Klobuchar, проверенная по RTKLIB |
Ограничения#
- SISRE — это только ошибка представления: без ошибки определения или прогнозирования орбиты.
- Истина — это интегрирование Kshana (без третьего тела, давления солнечного излучения и приливов), а не прецизионная орбита реального спутника.
- Двоичный формат и блок в стиле RINEX — собственные для Kshana.
- NeQuick-G передаётся, но не интегрируется в задержку; поправки для спутника внутри ионосферы нет.
- Сравнение с Liu и др. отличается орбитами, прочтением параметров и весами.