Машинний переклад, не перевірений носієм мови. Еталоном є англійська версія.

API та інтеграціїРедагувати на GitHubДжерело: README.npm.md

Kshana: знак, прицільна сітка компаса, що позначає точну мить, поруч зі словесним знаком kshanaKshana: знак, прицільна сітка компаса, що позначає точну мить, поруч зі словесним знаком kshana

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

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

Відрепетируйте хвилину, коли GNSS зникає: консоль місії Kshana, побудована за реальним прогоном рушія, ланцюжкова кампанія глушіння, спуфінгу, holdover і цілісності над 102 супутниками GPS, Galileo, BeiDou і GLONASSВідрепетируйте хвилину, коли GNSS зникає: консоль місії Kshana, побудована за реальним прогоном рушія, ланцюжкова кампанія глушіння, спуфінгу, holdover і цілісності над 102 супутниками GPS, Galileo, BeiDou і GLONASS

Відрепетируйте хвилину, коли 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.

Як можливість заробляє свою позначку: можливість, оракул, тест, позначка реєстру. Стан верифікації для всіх 401 можливостей: 176 перевірено, 221 змодельовано, 4 належать партнерамЯк можливість заробляє свою позначку: можливість, оракул, тест, позначка реєстру. Стан верифікації для всіх 401 можливостей: 176 перевірено, 221 змодельовано, 4 належать партнерам

Встановлення#

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).

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

Один відкритий рушій у центрі, 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Ü.