Навігаційне повідомлення LEO
Вид сценарію leo-navmsg будує широкомовне повідомлення з ефемеридами та годинником супутника позиціонування, навігації та часу (PNT) на низькій навколоземній орбіті (LEO) і відповідає на запитання, які ставить розробник повідомлення: скільки часу може покривати одне повідомлення, що дає кожен додатковий параметр, що бачить користувач, коли повідомлення змінюється посеред прольоту, і скільки бітів потрібно, щоб передати його з точністю до сантиметра.
Він не залежить від системи. Будь-яка орбіта, будь-яка несівна та будь-яка з чотирьох моделей ефемерид працюють без жодного пресета; іменовані пресети є необов'язковими даними (див. Пресети).
Виведіть вбудований приклад командою 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 (експорти в стилі Receiver Independent Exchange Format (RINEX) і значень, розділених комами (CSV)), presets/ (один файл на пресет), mod.rs (вид).
Що несе повідомлення#
| Частина | Вміст |
|---|---|
| Службові дані | ідентифікатор космічного апарата (SVID), версія даних (IOD), ідентифікатор діапазону, стан справності сигналу (конвенція Galileo: 0 справний, 1 поза службою, 2 розширена експлуатація, 3 на випробуванні) |
| Синхронізація | номер тижня, час тижня (TOW) передавання та поліном годинника другого порядку af0 + af1·(t − toc) + af2·(t − toc)² |
| Ефемериди | одна з чотирьох моделей нижче |
| Інші служби | широкомовний іоносферний набір Klobuchar, коефіцієнти Galileo NeQuick-G ai0, ai1, ai2 з п'ятьма прапорцями бурі та параметри переходу від системного часу до UTC A0, A1, ΔtLS, t0t, WNot, WNLSF, DN, ΔtLSF |
Моделі ефемерид#
| Код | Модель | Параметри |
|---|---|---|
kepler16 |
кеплерів набір з Galileo Open Service Signal-in-Space Interface Control Document (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 см вони діють лише в цих нульових напрямках. Підгонка liu22 натомість бере початок і оцінювач зі статті, розділ 2,3: починає з нульових поправкових членів, не має апріорних обмежень (звичайні найменші квадрати) і зберігає обмеження статті в 100 ітерацій. Вона зупиняється за власним правилом збіжності параметрів Kshana, коли кожен крок параметра менший за 1e-3 його формального стандартного відхилення; стаття ж зупиняється, коли RMS змінюється менш ніж на 0,1 мм. Потім поліноми 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, GLONASS 1/45, Galileo 1/61, BeiDou 1/54) і геостаціонарної орбіти (0,99 і 1/126): це перевірка рівня VALIDATED. На LEO те саме усереднення дає
| Висота | w_R |
1 / w_AC² |
надирний кут горизонту |
|---|---|---|---|
| 320 км | 0.384 | 2.35 | 72.2° |
| 510 км | 0.459 | 2.53 | 67.8° |
| 550 км | 0.472 | 2.57 | 67.0° |
| 786 км | 0.536 | 2.81 | 62.9° |
| 1080 км | 0.597 | 3.11 | 58.8° |
| 1336 км | 0.638 | 3.37 | 55.8° |
тож користувач LEO, який бачить супутник далеко від надиру, значно сильніше відчуває похибки вздовж і поперек траєкторії, ніж користувач на середній орбіті.
Аналізи#
analysis = [...] вибирає будь-яку з чотирьох (типово всі).
Компроміс за інтервалом підгонки#
[trade] задає інтервал, інтервали підгонки, періоди оновлення та моделі. scenarios/leo-navmsg-fit-interval-trade.toml (550 км, 97,6°, EGM2008 до ступеня 20 і опір, 30 хвилин повідомлень) дає, коли період використання дорівнює інтервалу підгонки:
| Модель | Інтервал підгонки | RMS SISRE орбіти | Максимум SISRE орбіти | RMS SISRE з годинником | RMS радіально / уздовж / поперек |
|---|---|---|---|---|---|
kepler16 |
60 с | 0,041 см | 0,179 см | 0,069 см | 0,09 / 0,01 / 0,00 см |
kepler16 |
120 с | 0,032 см | 0,160 см | 0,079 см | 0,06 / 0,01 / 0,01 см |
kepler16 |
180 с | 0,093 см | 0,540 см | 0,134 см | 0,18 / 0,06 / 0,00 см |
kepler16 |
300 с | 0,310 см | 1,033 см | 0,329 см | 0,09 / 0,49 / 0,02 см |
kepler16 |
450 с | 1,690 см | 7,542 см | 1,696 см | 0,72 / 2,65 / 0,04 см |
kepler16 |
600 с | 2,875 см | 10,219 см | 2,866 см | 1,72 / 4,42 / 0,26 см |
kepler16 |
900 с | 9,345 см | 34,032 см | 9,349 см | 6,46 / 14,14 / 0,91 см |
kepler-rac |
60 с | 0,000 см | 0,000 см | 0,057 см | 0,00 / 0,00 / 0,00 см |
kepler-rac |
120 с | 0,000 см | 0,000 см | 0,074 см | 0,00 / 0,00 / 0,00 см |
kepler-rac |
180 с | 0,000 см | 0,001 см | 0,090 см | 0,00 / 0,00 / 0,00 см |
kepler-rac |
300 с | 0,004 см | 0,014 см | 0,106 см | 0,00 / 0,00 / 0,01 см |
kepler-rac |
450 с | 0,037 см | 0,176 см | 0,127 см | 0,05 / 0,01 / 0,04 см |
kepler-rac |
600 с | 0,214 см | 0,643 см | 0,229 см | 0,28 / 0,09 / 0,26 см |
kepler-rac |
900 с | 1,015 см | 3,695 см | 1,062 см | 1,52 / 0,70 / 0,91 см |
А з підгонкою 300 с, змінюючи, як часто нове повідомлення перебирає на себе роботу:
| Модель | Період оновлення | RMS SISRE орбіти | Максимум SISRE орбіти |
|---|---|---|---|
kepler16 |
30 с | 0,314 см | 0,850 см |
kepler16 |
60 с | 0,288 см | 0,859 см |
kepler16 |
150 с | 0,219 см | 0,830 см |
kepler16 |
300 с | 0,310 см | 1,033 см |
kepler-rac |
30 с | 0,004 см | 0,009 см |
kepler-rac |
60 с | 0,004 см | 0,009 см |
kepler-rac |
150 с | 0,004 см | 0,010 см |
kepler-rac |
300 с | 0,004 см | 0,014 см |
16-параметровий кеплерів набір погіршується від 0,04 см за 60 с до 9,35 см за 900 с: один кеплерів набір з гармоніками двічі на оберт не може довше за кілька хвилин простежувати гравітаційні члени вищої частоти та опір на дузі LEO, а його залишок за найменшими квадратами коливається по вікну. Поліноми вздовж/поперек/радіально (ступені 7, 5, 6) поглинають те, що лишилося: 1,01 см за 900 с, 0,21 см за 600 с. На найкоротших інтервалах кеплерові показники субміліметрові й більше не впорядковані строго (підгонка тоді обмежена обумовленістю, а не моделлю).
Порівняння моделей#
scenarios/leo-navmsg-model-comparison.toml запускає чотири моделі на 1, 5 і 10 хвилинах на тій самій орбіті, з кількістю параметрів і бітами ефемерид та годинника в кодуванні Kshana:
| Модель | Інтервал підгонки | Параметри | Біти ефемерид + годинника | RMS SISRE орбіти | RMS SISRE з годинником |
|---|---|---|---|---|---|
kepler16 |
60 с | 16 | 570 | 0,022 см | 0,049 см |
kepler16 |
300 с | 16 | 570 | 0,230 см | 0,260 см |
kepler16 |
600 с | 16 | 570 | 3,061 см | 3,071 см |
kepler-rac |
60 с | 37 | 1045 | 0,000 см | 0,044 см |
kepler-rac |
300 с | 37 | 1045 | 0,005 см | 0,120 см |
kepler-rac |
600 с | 37 | 1045 | 0,160 см | 0,208 см |
liu22 |
60 с | 22 | 730 | 0,014 см | 0,046 см |
liu22 |
300 с | 22 | 730 | 0,074 см | 0,142 см |
liu22 |
600 с | 22 | 730 | 0,258 см | 0,290 см |
ecef-poly (нульовий годинник) |
60 с | 22 | 750 | 0,000 см | 28,784 см |
ecef-poly (нульовий годинник) |
300 с | 22 | 750 | 0,005 см | 28,784 см |
ecef-poly (нульовий годинник) |
600 с | 22 | 750 | 0,561 см | 28,774 см |
Рядок із нульовим годинником оцінюється відносно годинника, підлаштованого із залишком 0,24 м (показник ATOMIC), решта — відносно вільно біжучого годинника, до якого їх підігнано.
Liu та ін. 2025, SISRE залежно від висоти (MODELLED). Той самий сценарій підганяє 22-параметрову модель Kshana на 20-хвилинних дугах на п'яти висотах зі статті, з нахилом кожного супутника:
| Супутник | Висота | Нахил | Liu та ін. 2025 | Kshana (RMS лише орбіти) | відношення |
|---|---|---|---|---|---|
| GRACE-A | 320 км | 89.00° | 8,88 см | 4,25 см | 0.48 |
| GRACE-C | 475 км | 89.00° | 6,21 см | 2,87 см | 0.46 |
| Sentinel-2A | 786 км | 98.57° | 2,87 см | 2,20 см | 0.77 |
| HY-2A | 966 км | 99.34° | 2,11 см | 1,25 см | 0.59 |
| Sentinel-6A | 1336 км | 66.04° | 0,75 см | 0,51 см | 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 с, оновлювані кожні 150 с):
Найвищий проліт за добу сягає 43,7° і триває 455 с. Його перемикання:
| Перемикання | Висота | Стрибок положення | Стрибок годинника | Стрибок дальності користувача | Стрибок за найгіршої геометрії |
|---|---|---|---|---|---|
| IOD 270 → 271 | 12.7° | 0,07 мм | 0,19 мм | -0.17 мм | 0,27 мм |
| IOD 271 → 272 | 37.4° | 0,14 мм | 0,14 мм | -0.24 мм | 0,27 мм |
| IOD 272 → 273 | 28.2° | 0,27 мм | -0.22 мм | 0,35 мм | 0,48 мм |
Найбільший стрибок дальності користувача 0,35 мм проти порога 5 см: PASS.
Кодування та декодування#
scenarios/leo-navmsg-encode-decode.toml кодує перше з трьох повідомлень, декодує його, перевіряє CRC і відхиляє пошкоджену копію, виводить бюджет квантування, а також записує й зчитує назад блок у стилі RINEX і таблицю CSV:
- кадр: 171 байтів (1310 бітів корисного навантаження, з яких 1045 — ефемериди та годинник), 24-бітна циклічна перевірка надлишковості (CRC-24Q)
0x19105F; - найбільший ефект півкроку будь-якого окремого поля:
af0, 0,545 мм; - ціле повідомлення після квантування: положення в межах 1,126 мм і годинник у межах 0,185 мм від точного повідомлення; SISRE 0,113 см точно, 0,129 см декодовано;
- кадр з одним переверненим бітом відхиляється: true;
- круговий обхід RINEX-стилю в межах 5.0e-06 м, круговий обхід CSV у межах 0.0e+00 м.
Незалежність від платформи#
Кадр — це передані цілі числа, тож це мають бути ті самі цілі числа, де б і як би не виконувався сценарій: рідний двійковий файл на будь-якій операційній системі, налагоджувальна або випускна збірка та збірка 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, за зразком набору полів Galileo ICD. Це не бітова розкладка 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 і Galileo ICD (поліном 0x1864CFB, початкове значення 0); код відтворює каталожне контрольне значення 0xCDE703 для 123456789 і контрольні байти прикладу кадру типу повідомлення 1005 RTCM 10403 (VALIDATED).
Кроки Galileo ICD обрано для середньої навколоземної орбіти, і вони надто грубі для сантиметрового повідомлення LEO: Crs кроками 2⁻⁵ м (3,1 см), Cuc 2⁻²⁹ рад (1,3 см на радіусі LEO), кути 2⁻³¹ піввідкол (1,0 см) і af0 2⁻³⁴ с (1,7 см). Kshana зберігає одиниці ICD і конвенцію піввідколу, уточнює кроки так, щоб похибка півкроку кожного поля лишалася нижчою за 1 мм положення чи дальності на 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 | с/с^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 | м^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 | піввідкол/с^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 | с/піввідкол^2 |
| Klobuchar (біт-прапорець 1) | alpha3 |
8 | 2^-24 | с/піввідкол^3 |
| Klobuchar (біт-прапорець 1) | beta0 |
8 | 2^11 | s |
| Klobuchar (біт-прапорець 1) | beta1 |
8 | 2^14 | s/semicircle |
| Klobuchar (біт-прапорець 1) | beta2 |
8 | 2^16 | с/піввідкол^2 |
| Klobuchar (біт-прапорець 1) | beta3 |
8 | 2^16 | с/піввідкол^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/град^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 км, нахилах від 0° до 140° та інтервалах підгонки до 20 хвилин: deltaN і OmegaDot широкі, бо на майже екваторіальній орбіті вузол визначений погано, і підгонка ділить між ними дрейф аргумента широти за J2, а aDot і nDot — бо 22-параметрова підгонка на 20 хвилин поглинає частину короткоперіодичного коливання великої півосі. Починаючи з 0,30, 22-параметрова підгонка — це звичайні найменші квадрати зі статті без апріорних обмежень, і екваторіальна підгонка на 800 км тоді потребує nDot близько 6.3e-10 піввідкола/с^2, тож її масштаб змінився з 2^-60 на 2^-58. Поліноми поправок вздовж траєкторії 7-го ступеня для kepler-rac вкладаються в 22-бітний діапазон коефіцієнтів до 15 хвилин; довша підгонка може його перевищити й тоді відхиляється. quantisation_budget повідомляє для кожного поля ефемерид і годинника найбільшу зміну положення та дальності від зміни на півкроку за період використання та зміну всього повідомлення після квантування.
Текстові експорти#
RINEX 4,02 не визначає навігаційних записів LEO (його літери систем — G, R, E, J, C, I і S; RINEX 4,02 Міжнародної служби GNSS (IGS)). Блок, який записує 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 по одному в рядку. Типові стовпці використовують назви з Galileo ICD (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застосовує три випадки з Galileo ICD §5.1.7 (до події високосної секунди, протягом шести годин від неї та після неї); вставлена секунда читається як 86400.
Пресети#
Пресети — це дані, по одному файлу під src/leo_navmsg/presets/, із джерелами. Рушій і кожен вбудований сценарій, окрім сценарію Celeste, працюють без них.
| Ключ | Джерело | Орбіта | Несівна | Модель повідомлення |
|---|---|---|---|---|
xona-pulsar |
PUBLIC, arXiv 2509,19551 | 1080 км, 53° | X1 1593,3225 МГц | не опубліковано |
xona-pulsar-0 |
PUBLIC, arXiv 2509,19551 | 520 км, 97° | X1 | не опубліковано |
iridium |
PUBLIC, звіт RNTF, опис орбітального угруповання | 781 км, 86,4° | 1621 МГц (діапазон 1616–1626 МГц) | не передається |
starlink |
PUBLIC, NAVIGATION 72(1), опис орбітального угруповання | 550 км, 53° | діапазон Ku, значення середини діапазону (репрезентативне) | немає (сигнали нагоди) |
centispace |
PUBLIC, Sensors 2023, Satellite Navigation 2026 | 700 км, 55° | поблизу B1 (у джерелі замасковано; L1 як замінник) | не опубліковано |
cband-generic |
REPRESENTATIVE | 600 км, 97,8° | 5020 МГц (центр C-діапазону RNSS) | не опубліковано |
atomic |
PUBLIC, InsideGNSS | 500 км (репрезентативне) | L1 (репрезентативне) | ecef-poly, ступінь 6, 60 с, оновлюється кожні 30 с, нульовий годинник, залишок підлаштування 0,24 м |
celeste-iod |
WORKSHOP і PUBLIC | 510 км, 97,4° | 1191,795 МГц | kepler-rac, ступені та крок записів у файлі пресета |
RNSS — це радіонавігаційна супутникова служба; RNTF — Resilient Navigation and Timing Foundation.
Celeste IOD. Пресет демонстрації на орбіті (IOD) Celeste Європейського космічного агентства (ESA) — єдиний, що використовує матеріали, представлені на семінарі LEO-PNT програми ESA Navigation Innovation and Support Programme (NAVISP), 2026: структуру повідомлення (кеплерів набір Galileo плюс поліноми поправок вздовж/поперек/радіально, поліном годинника, SVID, справність, IOD, параметри іоносфери та UTC), крок записів і назви стовпців CSV. Орбіта (510 км, майже полярна сонячно-синхронна) і несівна походять із публічних джерел, указаних у файлі. Бітова розкладка 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, GLONASS, Galileo, BeiDou, геостаціонарна) |
| Алгоритм користувача Galileo ICD | VALIDATED | RTKLIB eph2pos на чотирьох реальних широкомовних ефемеридах Galileo, 1 мм на вісь (tests/leo_navmsg_reference.rs) |
| CRC-24Q | VALIDATED | каталожне контрольне значення 0xCDE703; приклад кадру RTCM 10403 1005 |
| Підгонка та компроміс SISRE | MODELLED | двотільну істину відновлено до 1 мм; скоригована підгонка J2–J6 до 1 мм; монотонне зростання з інтервалом |
| Безперервність посеред прольоту | MODELLED | тотожність стрибка; межа замкненої форми для конуса проти вибірки |
| Двійковий формат і бюджет | MODELLED | круговий обхід; півкрок кожного поля менший за 1 мм |
| Стиль 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 та ін. відрізняється орбітами, тлумаченням параметрів і вагами.