Kshana · क्षण · точный миг
Симулятор устойчивости PNT (позиционирование, навигация и время) с открытым исходным кодом.
Выпуск v0.40.0 176 из 401 возможностей проверены по независимым внешним оракулам Около 95% покрытия строк, с порогом 85% в непрерывной интеграции Лицензия: только AGPL-3.0 или коммерческая лицензия DOI 10.5281/zenodo.20528627
Отрепетируйте минуту, когда ГНСС пропадает#
Kshana воспроизводит подавление, спуфинг и holdover часов при отказе сигналов GNSS (глобальная навигационная спутниковая система) и сообщает, как долго система удерживает время и положение в пределах бюджета и какие часы или какой датчик дают наибольший запас. Это крейт на Rust: движок как библиотека и команда kshana. Каждый прогон воспроизводится бит в бит по сценарию, начальному значению (seed) и версии движка.
Сначала попробуйте то, что не требует установки: Kshana Studio выполняет весь движок в вашем браузере, скомпилированный в WebAssembly, и ничего не загружает.
Доказательства#
176 из 401 возможностей проверены по независимым внешним оракулам; 221 честно помечены как смоделированные, 4 принадлежат партнёру. Каждая возможность несёт одну метку в машинно проверяемом реестре (ledger): VALIDATED (независимый внешний оракул согласуется: реальные данные, независимая реализация или опубликованные эталонные векторы), MODELLED (внутренне согласовано, и об этом сказано прямо) или PARTNER (отвечает аппаратный партнёр). Среди проверок: все 666 векторов SGP4 (Simplified General Perturbations 4) из AIAA (Американский институт аэронавтики и астронавтики) 2006-6753 с точностью до 4,12 мм и модель сил Коуэлла с точностью до 0,08 м относительно Orekit 12,2.
Установка#
cargo add kshana # use the engine as a library
cargo install kshana # or install the command-line interface (CLI)
Использование — библиотека#
Пример — полная программа: она несёт собственный сценарий, записанный в TOML (Tom's Obvious, Minimal Language), поэтому запускается как src/main.rs нового проекта cargo new после cargo add kshana, и на диске больше ничего не требуется.
use kshana::api;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// A complete scenario, not a sketch: scenarios/clock-holdover.toml without its
// comment lines. It runs 2 h, 10 min of GNSS then about 1.8 h with GNSS denied, and
// asks how long a strontium optical clock and a chip-scale atomic clock (CSAC) each
// hold time to within 20 ns. sigma_y(1s) is a clock's Allan deviation at an averaging
// time of one second; q_wf, the white-frequency-noise intensity, is its square.
let toml = r#"
seed = 42
threshold_ns = 20.0
[time]
step_s = 10.0
duration_s = 7200.0
[gnss]
windows = [
{ t0 = 0.0, t1 = 600.0, state = "nominal" },
{ t0 = 600.0, t1 = 7200.0, state = "denied" },
]
[clock_quantum]
id = "optical-sr-lattice"
provenance = "Strontium optical lattice clock, space-oriented goal sigma_y(1s)=1e-15 (Origlia/Schiller/Bongs et al., arXiv:1503.08457); q_wf=sigma_y(1s)^2; ground-demonstrator maturity, not flown; flicker/aging not modeled"
y0 = 5.0e-17
q_wf = 1.0e-30
q_rw = 0.0
[clock_classical]
id = "csac-sa45s"
provenance = "Microchip SA65 / SA.45s CSAC datasheet sigma_y(1s)=3e-10; q_wf=sigma_y(1s)^2; flicker/aging not modeled"
y0 = 5.0e-10
q_wf = 9.0e-20
q_rw = 0.0
"#;
let out = api::run_toml(toml)?; // RunOutput { json, svg, summary, csv }
println!("{}", out.summary); // the one-line result string
std::fs::write("clock-holdover.result.json", &out.json)?; // the full result document
Ok(())
}
out.json — документ результата в JSON (JavaScript Object Notation), out.svg — график в виде SVG (Scalable Vector Graphics), а out.csv для видов сценариев, публикующих таблицу, — эта таблица в виде CSV (значения, разделённые запятыми).
Справочник по API, сформированный из src/api.rs#
Каждая общедоступная функция kshana::api в движке v0.40.0, считанная из исходного кода при сборке.
| Функция | Сигнатура | Что делает |
|---|---|---|
kshana::api::without_figure_tiers | (json: &str) -> Option<String> | json с удалённым завершающим блоком figure_tiers, байт в байт таким, каким документ был до появления этого блока; None, если в документе такого блока нет или он есть, но не является последним ключом (чего этот крейт никогда не выдаёт, поэтому тестовая оснастка должна считать это сбоем, а не удалять то, чего не может объяснить). |
kshana::api::list_scenario_kinds | () -> Vec<ScenarioMeta> | Перечисляет каждый встроенный вид сценария с его метаданными. |
kshana::api::list_scenario_kinds_json | () -> String | Встроенные виды сценариев и их метаданные в виде массива JSON — форма, в которой привязки к языкам предоставляют программную интроспекцию. |
kshana::api::kind_description_in | (lang: &crate::i18n::Lang, kind: &str) -> Option<String> | Описание встроенного вида сценария kind на языке lang из каталога (английское, если для языка нет его перевода); None для имени, которое не является встроенным видом. |
kshana::api::kind_description | (kind: &str) -> Option<String> | [kind_description_in] на текущем языке ([crate::i18n::current]). |
kshana::api::list_scenario_kinds_json_lang | (lang: &str) -> Result<String, String> | [list_scenario_kinds_json] с описанием каждого вида на языке lang (тег, который принимает --lang, например de или zh-Hans); имена и списки полей одинаковы на всех языках, а для английского документ побайтово идентичен [list_scenario_kinds_json]. |
kshana::api::kind_modules_json | () -> String | [KIND_MODULES] в виде объекта JSON: вид — массив имён модулей, в порядке таблицы. |
kshana::api::field_importance_json | () -> String | [HEADLINE_FIELDS] в виде JSON: {kind: {"headline": [path, ...]}}, в порядке таблицы. |
kshana::api::scenarios_reference_md | () -> String | Формирует встроенный каталог видов сценариев как отдельный справочник в Markdown (docs/SCENARIOS.md): каждый допустимый вид с однострочным описанием и обязательными и необязательными полями TOML. |
kshana::api::validate_scenario | (src: &str) -> Vec<String> | Проверяет TOML сценария по собственной интроспекции крейта и возвращает список проблем, чтобы вызывающая сторона узнала, что не так, ДО (возможно, долгого) прогона, а не столкнулась с поздним сбоем во время выполнения. |
kshana::api::export_sp3 | (src: &str) -> Result<String, String> | Экспортирует распространённую орбитальную группировку сценария орбиты/группировки в текст SP3-c. |
kshana::api::auto_export_sp3 | (src: &str) -> Result<Option<String>, String> | Если src — сценарий орбиты с export_sp3 = true, возвращает его текст SP3-c; иначе None. |
kshana::api::export_omm | (src: &str) -> Result<String, String> | Экспортирует средние элементы TLE сценария орбиты в виде каталога CCSDS OMM — по одному OMM (Orbit Mean-Elements Message) на каждый спутник, заданный через TLE, в форме KVN, с настоящим каталожным номером NORAD, обозначением COSPAR и эпохой из каждого TLE. |
kshana::api::auto_export_omm | (src: &str) -> Result<Option<String>, String> | Если src — сценарий орбиты с export_omm = true, возвращает текст его каталога OMM; иначе None. |
kshana::api::export_oem | (src: &str) -> Result<String, String> | Экспортирует распространённую орбитальную группировку сценария орбиты в виде текста CCSDS OEM — временной ряд инерциальных состояний (TEME), положения И скорости, в формате обмена эфемеридами космического аппарата, который читают инструменты динамики полёта (GMAT/Orekit/STK). |
kshana::api::auto_export_oem | (src: &str) -> Result<Option<String>, String> | Если src — сценарий орбиты с export_oem = true, возвращает его текст OEM; иначе None. |
kshana::api::inject_eop | (src: &str, finals2000a_body: &str) -> Result<String, String> | Встраивает настоящее тело IERS finals2000A в поле eop_finals2000a сценария (путь CLI --eop <file>), возвращая объединённый TOML. |
kshana::api::with_study_meta | (json: &str, meta: &crate::report::StudyMeta) -> String | Вставляет блок метаданных исследования в уже сформированный документ результата JSON, возвращая документ с ключом верхнего уровня "meta", вставленным сразу после открывающей скобки. |
kshana::api::run_scenario | (src: &str) -> Result<RunOutput, KshanaError> | Запускает сценарий и возвращает типизированный результат со структурированной ошибкой — точку входа, которую вызывающим привязкам следует предпочитать функции [run_toml] со строковой ошибкой. |
kshana::api::run_toml | (src: &str) -> Result<RunOutput, String> | Разбирает, диспетчеризует и запускает сценарий, заданный строкой TOML. |
kshana::api::run_toml_lang | (src: &str, lang: &str) -> Result<RunOutput, String> | [run_toml] для пользователя на языке lang (тег вроде de, pt-BR, zh-Hans, en-XA). |
kshana::api::run_toml_bilingual | (src: &str, lang: &str) -> Result<(RunOutput, Option<RunOutput>), String> | Два прогона [run_toml_lang], разнесённые: английский прогон, чьи json и csv являются машинными файлами, и, для другого языка, прогон на этом языке для всего, что читает человек. |
kshana::api::run_toml_human | (src: &str, lang: &str) -> Result<HumanOutput, String> | Второй проход [run_toml_bilingual] отдельно: запустить сценарий один раз на языке lang и вернуть только то, что читает человек. |
kshana::api::run_scenario_lang | (src: &str, lang: &str) -> Result<RunOutput, KshanaError> | [run_scenario] для пользователя на языке lang; см. [run_toml_lang]. |
kshana::api::error_info_json | (src: &str, lang: &str) -> String | Запустить src на языке lang и, если он завершается ошибкой, описать сбой как объект JSON {"kind": <kind_tag>, "code": <стабильный код или null>, "message": <текст на языке>}. |
kshana::api::without_evidence | (json: &str) -> String | json без метки доказательств ([crate::evidence_label]); без изменений, если метки нет. |
kshana::api::without_evidence_labels | (mut out: RunOutput) -> RunOutput | out с удалённой из его JSON, SVG и CSV меткой доказательств, байт в байт так, как их создал прогон до появления метки; вывод без метки остаётся без изменений. |
kshana::api::run_toml_untiered | (src: &str) -> Result<RunOutput, String> | [run_toml] без блока figure_tiers для каждого вида, который добавляет [run_toml_inner] (RM-04): для прогона, документ которого встроен в результат другого вида (участник кампании), чтобы внешний документ сохранил свои байты. |
kshana::api::append_figure_tiers | (json: &str, block: &serde_json::Value) -> Result<String, String> | json с блоком block, добавленным как последний ключ figure_tiers, байт в байт так, как его сериализовала бы обёртка Documented: форматированный вывод с отступом в два пробела, блок вложен на один уровень. |
Форматы обмена в крейте: разбор и запись сообщения CCSDS Tracking Data Message (TDM) (kshana::ccsds_tdm); Kshana Interchange Format (KIF) (kshana::interchange).
Использование — CLI#
В установке из реестра нет каталога scenarios/, поэтому CLI несёт эталонные сценарии с собой; kshana example перечисляет их и называет немногие, которые опущены, с указанием причины (каждый читает данные, поставляемые только с репозиторием, или следует предустановке, которую выпуск может не включать).
kshana example clock-holdover > clock-holdover.toml # write a bundled scenario to a file
kshana clock-holdover.toml # run it
kshana --validate clock-holdover.toml # lint it without running
kshana example # list every bundled scenario
kshana kinds # list every scenario kind
kshana example orbit-sgp4-gps > orbit-sgp4-gps.toml # the GPS constellation, real orbital elements
kshana orbit-sgp4-gps.toml --export list # which exchange formats apply
kshana orbit-sgp4-gps.toml --export all # every exchange file that applies
kshana orbit-sgp4-gps.toml --animate html # a self-contained animation page
Прогон выбирает путь по kind сценария и записывает <scenario>.result.json, .chart.svg, .report.html (печатная страница отчёта в HTML, HyperText Markup Language) и .report.json (тот же отчёт в машиночитаемом виде), а для видов сценариев, публикующих таблицу, ещё и .table.csv, рядом с файлом сценария. --export добавляет файлы обмена: CZML (Cesium Language) и KML (Keyhole Markup Language) для просмотрщиков глобуса, GeoJSON для карт, файлы эфемерид STK (Systems Tool Kit) и записи SigMF (Signal Metadata Format) для вида spectrum. --animate добавляет анимацию в формате SVG, HTML или покадровую.
Из клона репозитория те же команды принимают файлы в scenarios/ напрямую, включая исследование из нескольких сценариев (kshana --study scenarios/quantum-pnt-demonstrator.suite.toml) и lunar-llr-datum — единственный сценарий, который читает реальные данные лазерной дальнометрии, поставляемые только с репозиторием.
Каждая возможность в матрице верификации помечена как validated (проверена по независимому внешнему оракулу), modelled или принадлежит партнёру; показатели оптических часов — это космические цели на наземном оборудовании (ни одни стронциевые оптические часы не летали). Зрелость не одинакова по областям: PNT на Земле проверена по реальным данным; навигация в дальнем космосе и на Марсе моделируется, и по внешним оракулам проверены лишь её строительные блоки (время распространения света, положения планет); определение орбиты (OD) в реальных миссиях в дальнем космосе есть в дорожной карте.
Возможности#
В движке 92 видов сценариев; kshana kinds перечисляет их с полями. Новое в 0.38.0: gnss-ssv (сигналы ГНСС для космических аппаратов выше орбит ГНСС, на них и за их пределами) и lunar-infrastructure (лунная орбита и поверхность как навигационная и геодезическая инфраструктура), оба MODELLED, и holdover-test (запись ошибки времени относительно масок ITU-T).
- Спектр: как источник подавления занимает L-диапазон ГНСС, диапазон за диапазоном.
- Часы и синхронизация времени: holdover относительно порога, передача времени и телекоммуникационный holdover относительно масок сектора стандартизации Международного союза электросвязи (ITU-T).
- Орбитальные группировки вокруг любого тела: покрытие, геометрический фактор DOP (ухудшение точности) и доступность вокруг Земли, Луны или Марса и Солнечная система в одну эпоху.
- Навигация на низкой околоземной орбите: сигнал, пролёт и линия связи, навигационное сообщение и объединённое решение, этап за этапом.
- Кампании: сквозная миссия, перебор или ансамбль Монте-Карло в одном сценарии.
- Отчёты, анимация и экспорт: каждый показатель с единицей и меткой; анимированный рисунок прогона; сообщения об орбитах SP3 (Standard Product 3), CCSDS (Консультативный комитет по космическим системам передачи данных), файлы CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK (Systems Tool Kit) и SigMF (Signal Metadata Format).
- Доверие к ГНСС на судне (
receiver_trust, включаяreceiver_trust::live): оценка от 0 до 100 с указанием причин по NMEA приёмника, в реальном времени или из журнала; носит консультативный характер, не навигационное оборудование с утверждённым типом. - Пакеты доказательств (
evidence): подписанная техническая запись окна журнала, проверяемая в автономном режиме. - Телеметрия доверия (
telemetry): поток оценок доверия в виде метрик Prometheus, событий SIEM и, при желании, OpenTelemetry. - Тренировочные потоки (
nmea_synth): синтетический мостиковый NMEA со сценарным подавлением и спуфингом и журналом инструктора. Только текст; никогда не для действующих навигационных систем судна. - Карта помех (
interference_map): сводные карты ухудшенной навигации и подверженность маршрута. - Испытательный стенд и сопоставление compliance (
interop::testbench,compliance): движение носителя и события сценария для лабораторного имитатора GNSS и сопоставление с публичным стандартом, заполняемое из документов результатов. - Лаборатория IQ для GNSS (
iq): сцены, захват, сопровождение, мониторы и кампании на записанных и синтетических отсчётах IQ.
Архитектура#
Один и тот же файл сценария даёт одни и те же байты на любой поверхности. MCP — это Model Context Protocol: kshana-mcp позволяет ИИ-помощнику (искусственному интеллекту) запускать движок.
Исследования#
На открытом движке построены шесть статей на arXiv, у каждой есть команда, стоящая за ней: arXiv:2606,22054 (разрыв в оптимизме детекторов помех), arXiv:2606,24210 (условный уровень защиты времени), arXiv:2607,05415 (насколько стабильна оценка устойчивости PNT), arXiv:2607,02566 (наблюдаемость лунной поверхностной станции методом радиоинтерферометрии со сверхдлинной базой), arXiv:2607,06212 (геометрия южного полярного района Луны и поверхностные маяки) и arXiv:2610,23871 (цислунная навигация как задача наблюдаемости: длина дуги, обусловленность грамиана и рычаг Доплера). См. Исследования.
Редакции#
Весь движок свободен по лицензии AGPL-3.0. Kshana Pro, проприетарная надстройка, которая зависит от открытого движка и никогда его не ответвляет, и индивидуальные исследования доступны по договору с Ashforde® OÜ: contact@ashforde.org. Цен нет; см. docs/PRO.md.
Подробнее#
- Полный README → https://github.com/AshfordeOU/kshana
- Kshana Studio (движок в вашем браузере, в виде WebAssembly) → https://kshana.dev
- Возможности → docs/CAPABILITY.md
- Проверка и происхождение → docs/VALIDATION.md · docs/PROVENANCE.md
- Матрица верификации → docs/VERIFICATION-MATRIX.md
- Цитирование → CITATION.cff · DOI 10.5281/zenodo.20528627
Лицензия#
Бесплатно и с открытым исходным кодом по лицензии GNU AGPL-3.0-only (Стандартная общественная лицензия GNU Affero, только версия 3). Коммерческая лицензия предоставляется Ashforde® OÜ (эстонское частное общество с ограниченной ответственностью; OÜ = osaühing) для закрытой интеграции; см. LICENSING.md. Разработано и поддерживается профессионалами в Ashforde® OÜ.