Kshana · क्षण · точна мить
Симулятор з відкритим кодом для стійкості PNT (позиціонування, навігація та час).
Випуск v0.40.0 176 із 401 можливостей перевірено за незалежними зовнішніми оракулами Близько 95 % покриття рядків, із порогом 85 % у безперервній інтеграції Ліцензія: AGPL-3.0-only або комерційна ліцензія DOI 10.5281/zenodo.20528627
Відрепетируйте хвилину, коли GNSS зникає#
Kshana відтворює глушіння, спуфінг і holdover годинника, коли сигнали GNSS (глобальної навігаційної супутникової системи) відмовляють, і показує, як довго система тримає час і позицію в межах бюджету та який годинник чи датчик дає найбільший запас. Це пакет WebAssembly: увесь рушій у JavaScript, у браузері або в Node.js. Кожен прогін відтворюється побітово зі сценарію, зерна та версії рушія.
Спершу спробуйте без жодного встановлення: Kshana Studio запускає весь рушій у вашому браузері, скомпільований у WebAssembly, і нічого не завантажує.
Докази#
176 із 401 можливостей перевірено за незалежними зовнішніми оракулами; 221 чесно позначено як змодельовані, 4 належать партнерам. Кожна можливість має одну позначку в машинно перевірюваному реєстрі: VALIDATED (незалежний зовнішній оракул погоджується: реальні дані, незалежна реалізація або опубліковані еталонні вектори), MODELLED (внутрішньо узгоджено, і про це сказано прямо) або PARTNER (нею володіє апаратний партнер). Серед перевірок: усі 666 векторів SGP4 (Simplified General Perturbations 4) AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 з точністю 4,12 mm і силова модель Cowell з точністю 0,08 m проти Orekit 12,2.
Встановлення#
npm install kshana
Використання#
Пакет — це модуль ES (ECMAScript, стандартний JavaScript) із корисним навантаженням WebAssembly, зібраний для браузера. Ініціалізуйте його один раз, потім викликайте рушій синхронно. Єдина відмінність між браузером і Node.js — спосіб завантаження двійкового файлу WebAssembly.
У браузері (через збирач або сторінку, що віддає node_modules/kshana/) init() отримує kshana_bg.wasm поруч із модулем:
import init, { run, summary, chart_svg, version } from "kshana";
await init(); // fetch and compile the WebAssembly binary
У Node.js init() завершується помилкою TypeError: fetch failed (fetch Node не може читати локальний файл), тож прочитайте двійковий файл з диска та передайте його в initSync:
import { readFileSync } from "node:fs";
import { createRequire } from "node:module";
import { initSync, run, summary, chart_svg, version } from "kshana";
const wasmPath = createRequire(import.meta.url).resolve("kshana/kshana_bg.wasm");
initSync({ module: readFileSync(wasmPath) }); // compile the WebAssembly binary
Збережіть версію для Node.js як файл .mjs (або задайте "type": "module" у вашому package.json), щоб працював import. Далі обидві версії однакові:
// 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.
const toml = `
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
`;
const result = JSON.parse(run(toml)); // the full result document
// timing_p95_ns: the 95th-percentile timing error over the GNSS outage, in nanoseconds
console.log(version(), result.classical.fom.timing_p95_ns);
console.log(summary(toml)); // the one-line result string
const svg = chart_svg(toml); // the same chart the command-line interface (CLI) writes
TypeScript бачить типізовані результати: run_typed(toml) повертає RunOutput (json, svg, summary, csv: string | null, data: ResultDocument), scenario_kinds() — KindMeta[], чий name є об'єднанням ScenarioKind усіх видів, а error_kind() — ErrorKind (або "" у разі успіху). Власні поля кожного документа результату залежать від виду; ResultDocument типізує спільну оболонку (schema_version, engine_version і блок units з FieldUnit).
import { run_typed, scenario_kinds, type ScenarioKind } from "kshana";
const out = run_typed(toml);
const units = out.data.units; // Record<string, FieldUnit>
const kinds: ScenarioKind[] = scenario_kinds().map((k) => k.name);
Ще чотири функції описують рушій для фронтенду. kind_modules() повертає об'єкт JSON від виду до модулів, названих у рядках його матриці верифікації, field_importance() — від виду до полів результату, що відповідають на його запитання (метадані для показу; рушій їх ніколи не читає), iq_signals() — назви сигналів, які приймає iq_run_short, а iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) — коротку синтетичну сцену IQ, захоплену та відстежену в пам'яті (не більше 0,25 с, 1 000 000 відліків і 8 супутників), з тією самою відповіддю, що й у нативній збірці.
import { list_examples, get_example, export_scenario, animate_scenario } from "kshana";
const names = JSON.parse(list_examples("")).scenarios.map((s) => s.name); // the bundled scenarios
const toml = get_example("orbit-gnss-challenged"); // its TOML, byte for byte
const czml = JSON.parse(export_scenario(toml, "czml")).files[0].content; // a CZML file, in memory
const player = JSON.parse(animate_scenario(toml, "html", 0, NaN, 0)).files; // {name: html text}
На боці WebAssembly кожна точка входу — окремий виклик: run (документ результату як рядок JSON), summary, chart_svg, table_csv (таблиця CSV (значення, розділені комами) сценарію як рядок або undefined для видів, що не публікують таблицю; на недійсному сценарії генерує виняток), run_all (один прогін рушія, що повертає {json, svg, summary, csv} як рядок JSON — використовуйте, коли потрібен більш ніж один вихід, бо кожен інший виклик запускає сценарій заново), run_typed (ті самі виходи як один типізований об'єкт, з документом, уже розібраним як data), version, list_kinds / scenario_kinds / error_kind (інтроспекція; scenario_kinds повертає розібраний список), encode_permalink / decode_permalink — кодек посилання для спільного доступу (URL, уніфікований локатор ресурсів), який Kshana Studio використовує, щоб передати цілий сценарій через фрагмент адресного рядка й назад, — і export_sp3 / export_omm / export_oem, артефакти ефемерид SP3-c (редакція c формату Standard Product 3) і CCSDS (Консультативний комітет із систем космічних даних) — OMM (Orbit Mean-elements Message, повідомлення про середні елементи орбіти) і OEM (Orbit Ephemeris Message, повідомлення про ефемериди орбіти), — які записує CLI, — і receiver_trust, що оцінює реальний журнал приймача, описаний сценарієм receiver-trust, і повертає {json, csv, svg, summary} як рядок JSON (у браузері немає файлової системи, тож журнал і будь-який навігаційний файл мають бути вбудовані в сценарій як text або base64; таблиця [platform] kind = "vessel" додає морські монітори та оцінку довіри 0–100, лише консультативно), export_formats / export_scenario (які формати взаємодії підтримує сценарій, без запуску, і один експорт у пам'яті: czml, kml, geojson, stk або sigmf як JSON {format, spec_url, files}, побайтово ідентичний для того самого сценарію, нічого не завантажується), import_route (маршрут GeoJSON, записаний у сценарій треку шляхових точок, --import-route командного рядка), animate_scenario (часовий ряд прогону як анімований SVG, єдиний програвач HTML або кадри SVG), list_examples / get_example (вбудовані еталонні сценарії та їхній TOML), evidence_attach_timestamp (прив'язати маркер RFC 3161 до пакета доказів у пам'яті; пакет усе одно має пройти перевірку, а підпис органу часових міток не перевіряється), osnma_verify (які супутники Galileo дані навігації підтверджує файл сторінок I/NAV чи потік UBX, з довіреним коренем Меркла або відкритими ключами та необов'язковим незалежним еталонним часом; він автентифікує дані й не робить жодного твердження про ефективність проти спуфінгу; нічого не завантажується), receiver_trust_replay (обмежений уривок NMEA, оцінений так, як оцінює живий режим; без шлюзу), assess_vessel_log (журнал NMEA судна як пакетний прогін), trust_telemetry (потік довіри чи результат як текст Prometheus, рядки syslog CEF чи LEEF або корисне навантаження OTLP; нічого не надсилається), evidence_verify (перевірити підписаний пакет доказів; нічого не завантажується; пакети створюються за допомогою CLI, Python або MCP), bench_export (рух і події сценарію як текст для лабораторного симулятора; сигнал не записується), compliance_report і compliance_mapping (які рядки вимог публічних рамок підтримують докази результатів (supports evidence for), із розривом для кожного рядка; це не висновок, що рамку виконано), і interference_map (текст CSV ADS-B чи AIS у GeoJSON kshana-interference-map/v1 на кожну добу UTC; лише сукупні дані), route_exposure (частка маршруту через деградовані комірки цих карт; не прогноз), nmea_training (синтетичний місткий NMEA та журнал інструктора для навчання екіпажів; лише текст, ніколи для живих навігаційних систем судна) і функції геометрії неба sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile і skyplot_svg (які супутники бачить майданчик, коли будівлі, причали чи рельєф блокують частину неба, із геометричним чинником DOP (погіршення точності), еліпсом горизонтальної похибки, хмарою Монте-Карло із зерном і скайплотом як текстом SVG; рішення щодо видимості та еліпс перевірено за незалежними бібліотеками, шаблони — це репрезентативні геометрії, а не зйомки, і обрій вилучає супутники прямої видимості й нічого більше). Немає в браузерній збірці: receiver-trust live із шлюзом і слухачем TCP, потоковий навчальний NMEA та експортери телеметрії (Prometheus, OpenTelemetry, syslog) — тривалі мережеві процеси та залишаються в інструменті командного рядка; створення пакета доказів потребує ключа підпису, що належить CLI або Python. Однокрокового run_full тут немає; цей зв'язок існує лише в колесі Python.
Кожну можливість у матриці верифікації позначено як перевірену за незалежним зовнішнім еталоном (перевірено за незалежним зовнішнім оракулом), обчислену за моделлю або таку, що належить партнеру; показники оптичних годинників — це космічні цілі на наземному обладнанні (жоден стронцієвий оптичний годинник не літав). Зрілість не однакова в усіх галузях — PNT Землі перевірено за реальними даними; навігація в далекому космосі та на Марсі обчислена за моделлю, і лише її будівельні блоки (світловий час, положення планет) перевірено за зовнішніми оракулами; реальне визначення орбіти (OD) для місій у далекому космосі є в дорожній карті.
Можливості#
Рушій має 92 види сценаріїв; kshana kinds перелічує їх разом із полями. Нове у 0.38.0: gnss-ssv (сигнали GNSS для космічних апаратів над орбітами GNSS, навколо них і за їхніми межами) і lunar-infrastructure (місячна орбіта та поверхня як навігаційна та геодезична інфраструктура), обидва MODELLED, і holdover-test (запис похибки часу проти масок ITU-T).
- Спектр: як глушник забирає L-діапазон GNSS, діапазон за діапазоном.
- Годинники та синхронізація часу: 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).
Архітектура#
Той самий файл сценарію дає ті самі байти на кожній поверхні. 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Ü.