Kshana · क्षण · přesný okamžik
Open-source simulátor odolnosti PNT (určování polohy, navigace a času).
Vydání v0.40.0 176 z 401 schopností ověřeno proti nezávislým vnějším orákulům Pokrytí řádků zhruba 95 %, v nepřetržité integraci s hranicí 85 % Licence: AGPL-3.0-only, nebo komerční licence DOI 10.5281/zenodo.20528627
Nacvičte minutu, kdy GNSS zhasne#
Kshana přehrává rušení, podvržení signálu (spoofing) a holdover hodin (udržení času), když signály GNSS (globálního družicového navigačního systému) selžou, a říká vám, jak dlouho systém udrží čas a polohu v rámci svého rozpočtu a které hodiny nebo který senzor přinese největší rezervu. Toto je balíček WebAssembly: celý engine v JavaScriptu, v prohlížeči nebo v Node.js. Každý běh je reprodukovatelný bit po bitu ze scénáře, seedu a verze enginu.
Vyzkoušejte jej nejdřív bez jakékoli instalace: Kshana Studio spouští celý engine ve vašem prohlížeči, přeložený do WebAssembly, a nic nenahrává.
Důkazy#
176 z 401 schopností ověřeno proti nezávislým vnějším orákulům; 221 poctivě označeno jako modelované, 4 ve vlastnictví partnera. Každá schopnost nese jedno označení ve strojově kontrolovaném registru: VALIDATED (souhlasí nezávislé vnější orákulum: skutečná data, nezávislá implementace nebo zveřejněné referenční vektory), MODELLED (vnitřně konzistentní, a řečeno otevřeně) nebo PARTNER (vlastní ho hardwarový partner). Mezi kontrolami: všech 666 vektorů SGP4 (Simplified General Perturbations 4) podle AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 na 4,12 mm a model sil Cowell na 0,08 m proti Orekit 12,2.
Instalace#
npm install kshana
Použití#
Balíček je modul ES (ECMAScript, standardní JavaScript) s obsahem WebAssembly, určený pro prohlížeč. Inicializujte jej jednou a poté volejte engine synchronně. Jediný rozdíl mezi prohlížečem a Node.js je v tom, jak se načte binární soubor WebAssembly.
V prohlížeči (přes bundler nebo stránku, která poskytuje node_modules/kshana/) init() načte kshana_bg.wasm z místa vedle modulu:
import init, { run, summary, chart_svg, version } from "kshana";
await init(); // fetch and compile the WebAssembly binary
V Node.js init() selže s TypeError: fetch failed (fetch v Node nedokáže číst místní soubor), proto načtěte binární soubor z disku a předejte jej do 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
Verzi pro Node.js uložte jako soubor .mjs (nebo nastavte "type": "module" ve svém package.json), aby fungoval import. Odtud je obojí stejné:
// 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 vidí typované výsledky: run_typed(toml) vrací RunOutput (json, svg, summary, csv: string | null, data: ResultDocument), scenario_kinds() vrací KindMeta[], jejíž name je sjednocení ScenarioKind všech druhů, a error_kind() vrací ErrorKind (nebo "" při úspěchu). Vlastní pole dokumentu každého výsledku se podle druhu liší; ResultDocument typuje sdílenou obálku (schema_version, engine_version a blok units hodnot 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);
Další čtyři funkce popisují engine pro front-end. kind_modules() vrací objekt JSON z druhu na moduly, které uvádějí jeho řádky ve verifikační matici, field_importance() jeden z druhu na pole výsledku, která odpovídají na jeho otázku (zobrazovací metadata; engine je nikdy nečte), iq_signals() názvy signálů, které iq_run_short přijímá, a iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) krátkou syntetickou scénu IQ, zachycenou a sledovanou v paměti (nejvýše 0,25 s, 1 000 000 vzorků a 8 družic), se stejnou odpovědí jako nativní sestavení.
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}
Na straně WebAssembly je každý vstupní bod samostatné volání: run (dokument výsledku jako řetězec JSON), summary, chart_svg, table_csv (tabulka CSV (hodnoty oddělené čárkami) scénáře jako řetězec, nebo undefined pro druhy, které žádnou tabulku nepublikují; u neplatného scénáře vyhodí výjimku), run_all (jeden běh enginu vracející {json, svg, summary, csv} jako řetězec JSON – použijte jej, když chcete více než jeden výstup, protože každé jiné volání spouští scénář znovu), run_typed (tytéž výstupy jako jeden typovaný objekt, s dokumentem již zpracovaným jako data), version, list_kinds / scenario_kinds / error_kind (introspekce; scenario_kinds vrací zpracovaný seznam), encode_permalink / decode_permalink – kodek odkazů ke sdílení (URL, jednotný lokátor zdrojů), který Kshana Studio používá k přenosu celého scénáře tam a zpět přes fragment v adresním řádku – a export_sp3 / export_omm / export_oem, artefakty efemerid SP3-c (revize c formátu Standard Product 3) a CCSDS (Consultative Committee for Space Data Systems) – OMM, Orbit Mean-elements Message, a OEM, Orbit Ephemeris Message – které zapisuje CLI – a receiver_trust, který vyhodnotí skutečný záznam přijímače popsaný scénářem receiver-trust a vrátí {json, csv, svg, summary} jako řetězec JSON (prohlížeč nemá souborový systém, takže záznam a každý navigační soubor musí být ve scénáři vložen jako text nebo base64; tabulka [platform] kind = "vessel" přidá námořní monitory a skóre důvěry 0–100, pouze poradní), export_formats / export_scenario (které formáty interoperability scénář podporuje, aniž by se spustil, a jeden export v paměti: czml, kml, geojson, stk nebo sigmf jako JSON {format, spec_url, files}, bajtově shodný pro tentýž scénář, nic se nenahrává), import_route (trasa GeoJSON zapsaná do scénáře sledování bodů trasy, ekvivalent --import-route v příkazové řádce), animate_scenario (časové řady běhu jako animované SVG, jediný přehrávač HTML nebo snímky SVG), list_examples / get_example (přibalené referenční scénáře a jejich TOML), evidence_attach_timestamp (naváže token RFC 3161 na balíček důkazů v paměti; balíček se musí stále ověřit a podpis autority časových razítek se nekontroluje), osnma_verify (navigační data Galileo kterých družic ověřuje soubor stránek I/NAV nebo proud UBX, s důvěryhodným kořenem Merkle nebo veřejnými klíči a volitelným nezávislým referenčním časem; ověřuje data a netvrdí nic o výkonu proti podvržení signálu; nic se nenahrává), receiver_trust_replay (omezený výřez NMEA vyhodnocený tak, jak jej vyhodnocuje živý režim; bez hradla), assess_vessel_log (záznam NMEA plavidla jako dávkový běh), trust_telemetry (proud nebo výsledek důvěry jako text pro Prometheus, řádky syslog CEF nebo LEEF nebo datová část OTLP; nic se neodesílá), evidence_verify (kontrola podepsaného balíčku důkazů; nic se nenahrává; balíčky se vytvářejí pomocí CLI, Pythonu nebo MCP), bench_export (pohyb a události scénáře jako text pro laboratorní simulátor; nezapisuje se žádný signál), compliance_report a compliance_mapping (které řádky požadavků veřejných rámců výsledkové dokumenty podporují důkazy pro, s mezerou u každého řádku; nejde o zjištění, že rámec je splněn) a interference_map (text CSV z ADS-B nebo AIS na GeoJSON kshana-interference-map/v1 za den UTC; pouze souhrnně), route_exposure (podíl trasy vedoucí zhoršenými buňkami těchto map; nejde o předpověď), nmea_training (syntetická NMEA můstku a instruktorský záznam pro výcvik posádek; pouze text, nikdy pro živé navigační systémy plavidla) a funkce geometrie oblohy sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile a skyplot_svg (které družice místo vidí, když část oblohy blokují budovy, nábřeží nebo terén, s faktorem DOP (zhoršení přesnosti), elipsou vodorovné chyby, oblakem Monte Carlo se seedem a skyplotem jako textem SVG; rozhodnutí o viditelnosti a elipsa jsou ověřeny proti nezávislým knihovnám, přednastavení jsou reprezentativní geometrie, nikoli zaměření, a obzor odstraní družice s přímou viditelností a nic víc). Není v sestavení pro prohlížeč: receiver-trust live s hradlem a naslouchačem TCP, proudová tréninková NMEA a exportéry telemetrie (Prometheus, OpenTelemetry, syslog) jsou dlouho běžící síťové procesy a zůstávají v nástroji příkazové řádky; vytvoření balíčku důkazů potřebuje podpisový klíč, který patří k CLI nebo Pythonu. Volání run_full jedním příkazem zde neexistuje; tato vazba existuje jen v kole (wheel) pro Python.
Každá schopnost ve verifikační matici je označena jako ověřená (zkontrolovaná proti nezávislému vnějšímu orákulu), modelovaná nebo ve vlastnictví partnera; údaje o optických hodinách jsou cíle pro vesmír na pozemním hardwaru (žádné optické hodiny se stronciem dosud nelétaly). Zralost není napříč oblastmi jednotná – PNT pro Zemi je ověřeno proti skutečným datům; navigace v hlubokém vesmíru a na Marsu je modelovaná, přičemž proti vnějším orákulím jsou ověřeny jen její stavební bloky (světelný čas, polohy planet); skutečné OD (určování oběžné dráhy) pro mise v hlubokém vesmíru je na plánu rozvoje.
Schopnosti#
Engine má 92 druhů scénářů; kshana kinds je vypíše s jejich poli. Nově ve verzi 0.38.0: gnss-ssv (signály GNSS pro kosmické prostředky nad drahami GNSS, kolem nich i za nimi) a lunar-infrastructure (lunární oběžná dráha a povrch jako navigační a geodetická infrastruktura), obojí MODELLED, a holdover-test (záznam časové chyby proti maskám ITU-T).
- Spektrum: jak jammer zabírá pásmo L GNSS, pásmo po pásmu.
- Hodiny a časování: holdover proti prahu, přenos času a telekomunikační holdover proti maskám normalizačního sektoru Mezinárodní telekomunikační unie (ITU-T).
- Konstelace kolem libovolného tělesa: pokrytí, faktor DOP (zhoršení přesnosti) a dostupnost kolem Země, Měsíce nebo Marsu a sluneční soustava v jedné epoše.
- Navigace na nízké oběžné dráze: signál, přelet a spoj, navigační zpráva a fúzované zaměření, krok za krokem.
- Kampaně: zřetězená mise, průchod parametrem nebo soubor Monte Carlo v jednom scénáři.
- Zprávy, animace a exporty: každý údaj s jednotkou a štítkem; animovaný záznam běhu; soubory SP3 (Standard Product 3), orbitální zprávy CCSDS (Consultative Committee for Space Data Systems), CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK (Systems Tool Kit) a SigMF (Signal Metadata Format).
Architektura#
Tentýž soubor scénáře dává na každém rozhraní stejné bajty. MCP je Model Context Protocol: kshana-mcp umožňuje asistentovi s umělou inteligencí (AI) spouštět engine.
Výzkum#
Na otevřeném enginu je postaveno šest článků na arXiv, každý s příkazem, který za ním stojí: arXiv:2606,22054 (optimismus detektorů interference), arXiv:2606,24210 (podmíněná ochranná úroveň pro časování), arXiv:2607,05415 (jak stabilní je skóre odolnosti PNT), arXiv:2607,02566 (pozorovatelnost lunárních povrchových stanic pomocí interferometrie s velmi dlouhou základnou), arXiv:2607,06212 (geometrie jižního pólu Měsíce a povrchové majáky) a arXiv:2610,23871 (cislunární navigace jako problém pozorovatelnosti: délka oblouku, podmíněnost Gramiánu a Dopplerova páka). Viz Výzkum.
Edice#
Celý engine je zdarma pod AGPL-3.0. Kshana Pro, proprietární nadstavba, která závisí na otevřeném enginu a nikdy jej nevětví, a studie na zakázku jsou dostupné na smlouvu od Ashforde® OÜ: contact@ashforde.org. Žádné ceny se neuvádějí; viz docs/PRO.md.
Další informace#
- Úplné README → https://github.com/AshfordeOU/kshana
- Kshana Studio (engine ve vašem prohlížeči, jako WebAssembly) → https://kshana.dev
- Schopnosti → docs/CAPABILITY.md
- Validace a původ → docs/VALIDATION.md · docs/PROVENANCE.md
- Verifikační matice → docs/VERIFICATION-MATRIX.md
- Citace → CITATION.cff · DOI 10.5281/zenodo.20528627
Licence#
Svobodný a open source pod licencí GNU AGPL-3.0-only (GNU Affero General Public License, pouze verze 3). Komerční licence je k dispozici od Ashforde® OÜ (estonská společnost s ručením omezeným; OÜ = osaühing) pro uzavřenou integraci; viz LICENSING.md. Profesionálně vyvíjí a udržuje Ashforde® OÜ.