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

API и интеграцииПравить на GitHubИсточник: README.crates.md

Kshana: знак — прицельная сетка компаса, отмечающая точный момент, рядом с логотипом kshanaKshana: знак — прицельная сетка компаса, отмечающая точный момент, рядом с логотипом kshana

Kshana · क्षण · точный миг
Симулятор устойчивости PNT (позиционирование, навигация и время) с открытым исходным кодом.

Выпуск v0.40.0 176 из 401 возможностей проверены по независимым внешним оракулам Около 95% покрытия строк, с порогом 85% в непрерывной интеграции Лицензия: только AGPL-3.0 или коммерческая лицензия DOI 10.5281/zenodo.20528627

Отрепетируйте минуту, когда ГНСС пропадает: консоль миссий Kshana, построенная по реальному прогону движка, — сквозная кампания подавления, спуфинга, holdover и целостности по 102 спутникам GPS, Galileo, BeiDou и ГЛОНАССОтрепетируйте минуту, когда ГНСС пропадает: консоль миссий Kshana, построенная по реальному прогону движка, — сквозная кампания подавления, спуфинга, holdover и целостности по 102 спутникам GPS, Galileo, BeiDou и ГЛОНАСС

Отрепетируйте минуту, когда ГНСС пропадает#

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.

Как возможность получает свою метку: возможность, оракул, тест, метка реестра. Состояние верификации по всем 401 возможностям: 176 проверены, 221 смоделированы, 4 принадлежат партнёруКак возможность получает свою метку: возможность, оракул, тест, метка реестра. Состояние верификации по всем 401 возможностям: 176 проверены, 221 смоделированы, 4 принадлежат партнёру

Установка#

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) -> Stringjson без метки доказательств ([crate::evidence_label]); без изменений, если метки нет.
kshana::api::without_evidence_labels(mut out: RunOutput) -> RunOutputout с удалённой из его 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.

Архитектура#

Один открытый движок в центре, kshana 0.40.0, с типизированной диспетчеризацией по 75 видам; вокруг него командная строка, библиотека Rust, Python, WebAssembly и Kshana Studio, сервер MCP, образ Docker и плагин JetBrains; под ним Kshana Pro, проприетарная надстройка, которая зависит от открытого движка и никогда его не ответвляетОдин открытый движок в центре, kshana 0.40.0, с типизированной диспетчеризацией по 75 видам; вокруг него командная строка, библиотека Rust, Python, WebAssembly и Kshana Studio, сервер MCP, образ Docker и плагин JetBrains; под ним Kshana Pro, проприетарная надстройка, которая зависит от открытого движка и никогда его не ответвляет

Один и тот же файл сценария даёт одни и те же байты на любой поверхности. 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.

Подробнее#

Лицензия#

Бесплатно и с открытым исходным кодом по лицензии GNU AGPL-3.0-only (Стандартная общественная лицензия GNU Affero, только версия 3). Коммерческая лицензия предоставляется Ashforde® OÜ (эстонское частное общество с ограниченной ответственностью; OÜ = osaühing) для закрытой интеграции; см. LICENSING.md. Разработано и поддерживается профессионалами в Ashforde® OÜ.