Kshana · क्षण · det presise øyeblikket
En åpen kildekode-simulator for PNT-robusthet (posisjonering, navigasjon og tidssynkronisering).
Utgivelse v0.40.0 176 av 401 funksjoner validert mot uavhengige eksterne referanser Omtrent 95 % linjedekning, med krav på 85 % i kontinuerlig integrasjon Lisens: AGPL-3.0-only, eller en kommersiell lisens DOI 10.5281/zenodo.20528627
Øv på minuttet GNSS går i svart#
Kshana spiller av jamming, spoofing og klokke-holdover når GNSS-signaler (Global Navigation Satellite System) svikter, og forteller deg hvor lenge et system holder tid og posisjon innenfor budsjettet, og hvilken klokke eller sensor som gir mest margin. Dette er WebAssembly-pakken: hele motoren i JavaScript, i nettleseren eller i Node.js. Hver kjøring kan gjengis bit for bit fra scenarioet, seedet og motorversjonen.
Prøv det først uten noe å installere: Kshana Studio kjører hele motoren i nettleseren din, kompilert til WebAssembly, og laster ikke opp noe.
Evidens#
176 av 401 funksjoner validert mot uavhengige eksterne referanser; 221 ærlig merket som modellert, 4 eid av partnere. Hver funksjon har én merkelapp i et maskinkontrollert register: VALIDATED (en uavhengig ekstern referanse stemmer: reelle data, en uavhengig implementering eller publiserte referansevektorer), MODELLED (internt konsistent, og sagt høyt) eller PARTNER (en maskinvarepartner eier den). Blant kontrollene: alle 666 SGP4-vektorer (Simplified General Perturbations 4) fra AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 til 4,12 mm, og Cowell-kraftmodellen til 0,08 m mot Orekit 12,2.
Installasjon#
npm install kshana
Bruk#
Pakken er en ES-modul (ECMAScript, standard JavaScript) med en WebAssembly-last, bygd for nettleseren. Initialiser den én gang, og kall deretter motoren synkront. Den eneste forskjellen mellom nettleseren og Node.js er hvordan WebAssembly-binæren lastes.
I nettleseren (gjennom en bundler, eller en side som serverer node_modules/kshana/) henter init() kshana_bg.wasm fra siden av modulen:
import init, { run, summary, chart_svg, version } from "kshana";
await init(); // fetch and compile the WebAssembly binary
I Node.js feiler init() med TypeError: fetch failed (Nodes fetch kan ikke lese en lokal fil), så les binæren fra disk og gi den til 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
Lagre Node.js-versjonen som en .mjs-fil (eller sett "type": "module" i package.json) slik at import fungerer. Derfra er begge like:
// 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 ser typede resultater: run_typed(toml) returnerer en RunOutput (json, svg, summary, csv: string | null, data: ResultDocument), scenario_kinds() en KindMeta[] der name er unionen ScenarioKind av hver type, og error_kind() en ErrorKind (eller "" ved suksess). Hvert resultatdokuments egne felt varierer med typen; ResultDocument typer den felles konvolutten (schema_version, engine_version og blokken units med FieldUnit-er).
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);
Fire funksjoner til beskriver motoren for en frontend. kind_modules() returnerer et JSON-objekt fra type til modulene radene i verifikasjonsmatrisen nevner, field_importance() ett fra type til resultatfeltene som svarer på spørsmålet (visningsmetadata; motoren leser det aldri), iq_signals() signalnavnene iq_run_short godtar, og iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) en kort syntetisk IQ-scene, oppfanget og sporet i minnet (høyst 0,25 s, 1 000 000 sampler og 8 satellitter), med det samme svaret som det native bygget.
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}
På WebAssembly-siden er hvert inngangspunkt et eget kall: run (resultatdokumentet som en JSON-streng), summary, chart_svg, table_csv (scenarioets CSV-tabell (kommaseparerte verdier) som en streng, eller undefined for typer som ikke publiserer noen tabell; den kaster en feil for et ugyldig scenario), run_all (én motorkjøring som returnerer {json, svg, summary, csv} som en JSON-streng — bruk den når du vil ha mer enn én utdata, siden hvert annet kall kjører scenarioet på nytt), run_typed (de samme utdataene som ett typet objekt, med dokumentet allerede tolket som data), version, list_kinds / scenario_kinds / error_kind (introspeksjon; scenario_kinds returnerer den tolkede listen), encode_permalink / decode_permalink — kodeken for delbare lenker (URL, uniform resource locator) som Kshana Studio bruker til å sende et helt scenario fram og tilbake gjennom fragmentet i adressefeltet — og export_sp3 / export_omm / export_oem, SP3-c (revisjon c av formatet Standard Product 3) og CCSDS-efemeridene (Consultative Committee for Space Data Systems) — OMM, Orbit Mean-elements Message, og OEM, Orbit Ephemeris Message — som kommandolinjen skriver — og receiver_trust, som vurderer en ekte mottakerlogg beskrevet av et receiver-trust-scenario og returnerer {json, csv, svg, summary} som en JSON-streng (nettleseren har ikke noe filsystem, så loggen, og enhver navigasjonsfil, må ligge innebygd i scenarioet som text eller base64; en [platform] kind = "vessel"-tabell legger til de maritime monitorene og tillitsscoren på 0–100, kun veiledende), export_formats / export_scenario (hvilke interoperabilitetsformater et scenario støtter, uten å kjøre det, og én eksport i minnet: czml, kml, geojson, stk eller sigmf som JSON {format, spec_url, files}, byte-identisk for samme scenario, ingenting lastes opp), import_route (en GeoJSON-rute skrevet inn i et scenario med veipunktspor, kommandolinjens --import-route), animate_scenario (kjøringens tidsserie som en animert SVG, en enkelt HTML-spiller eller SVG-rammer), list_examples / get_example (de medfølgende referansescenarioene og deres TOML), evidence_attach_timestamp (bind et RFC 3161-token til en bevispakke i minnet; pakken må fortsatt verifiseres, og signaturen til tidsstempelmyndigheten kontrolleres ikke), osnma_verify (hvilke satellitters Galileo-navigasjonsdata en I/NAV-sidefil eller en UBX-strøm autentiserer, med den klarerte Merkle-roten eller offentlige nøkler og en valgfri uavhengig referansetid; den autentiserer data og gir ingen påstand om ytelse mot spoofing; ingenting lastes opp), receiver_trust_replay (et avgrenset NMEA-utdrag scoret slik live-modus scorer det; ingen gate), assess_vessel_log (en NMEA-logg fra et fartøy som en batchkjøring), trust_telemetry (en tillitsstrøm eller et resultat som Prometheus-tekst, CEF- eller LEEF-syslog-linjer eller en OTLP-nyttelast; ingenting sendes), evidence_verify (kontroller en signert bevispakke; ingenting lastes opp; pakker lages med CLI, Python eller MCP), bench_export (et scenarios bevegelse og hendelser som tekst for en laboratoriesimulator; intet signal skrives), compliance_report og compliance_mapping (hvilke kravrader i offentlige rammeverk resultatdokumentene gir belegg for, med hver rads gap; ikke en konstatering av at et rammeverk er oppfylt), og interference_map (ADS-B- eller AIS-CSV-tekst til en kshana-interference-map/v1-GeoJSON per UTC-dag; bare aggregert), route_exposure (en rutes andel gjennom degraderte celler i disse kartene; ikke en prognose), nmea_training (syntetisk bro-NMEA og en instruktørlogg for mannskapstrening; bare tekst, aldri for et fartøys levende navigasjonssystemer) og himmelgeometrifunksjonene sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile og skyplot_svg (hvilke satellitter et sted ser når bygninger, kaier eller terreng blokkerer en del av himmelen, med presisjonsfortynning, horisontal feilellipse, en seedet Monte Carlo-sky og et skyplot som SVG-tekst; synlighetsavgjørelsen og ellipsen er kontrollert mot uavhengige biblioteker, forhåndsinnstillingene er representative geometrier og ikke oppmålinger, og en skyline fjerner satellitter med siktlinje og ingenting mer). Ikke i nettleserbygget: receiver-trust live med sin gate og TCP-lytter, strømmet trenings-NMEA og telemetrieksportørene (Prometheus, OpenTelemetry, syslog) er langvarige nettverksprosesser og blir i kommandolinjeverktøyet; å lage en bevispakke krever en signeringsnøkkel, som hører hjemme i CLI eller Python. Det finnes ikke noe kall med én runde run_full her; den bindingen finnes bare i Python-wheel-pakken.
Hver funksjon i verifikasjonsmatrisen er merket validert (kontrollert mot en uavhengig ekstern referanse), modellert eller eid av partner; tallene for optiske klokker er romformål på bakkemaskinvare (ingen optisk strontiumklokke har fløyet). Modenheten er ikke lik på tvers av områder — Earth PNT er validert mot reelle data; dypromsnavigasjon og Mars-navigasjon er modellert, og bare byggeklossene (lystid, planetposisjoner) er validert mot eksterne referanser; banebestemmelse (OD) for reelle dypromsoppdrag står på veikartet.
Funksjoner#
Motoren har 92 scenariotyper; kshana kinds lister dem med feltene deres. Nytt i 0.38.0: gnss-ssv (GNSS-signaler for romfartøy over, rundt og forbi GNSS-banene) og lunar-infrastructure (månebane og -overflate som navigasjons- og geodetisk infrastruktur), begge MODELLED, og holdover-test (en tidsfeilregistrering mot ITU-T-maskene).
- Spektrum: hvordan en jammer tar GNSS L-båndet, bånd for bånd.
- Klokker og tidssynkronisering: holdover mot en terskel, tidsoverføring og telekom-holdover mot maskene til standardiseringssektoren i Den internasjonale teleunion (ITU-T).
- Konstellasjoner rundt et hvilket som helst legeme: dekning, presisjonsfortynning og tilgjengelighet rundt Jorda, Månen eller Mars, og solsystemet ved én epoke.
- Navigasjon i lav jordbane: signal, passering og link, navigasjonsmelding og en fusjonert posisjonsbestemmelse, trinn for trinn.
- Kampanjer: et sammenkjedet oppdrag, en sveip eller et Monte Carlo-ensemble i ett scenario.
- Rapporter, animasjon og eksport: hvert tall med sin enhet og merkelapp; en animert tegning av en kjøring; SP3 (Standard Product 3), CCSDS-banemeldinger (Consultative Committee for Space Data Systems), CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK (Systems Tool Kit) og SigMF-filer (Signal Metadata Format).
Arkitektur#
Den samme scenariofilen gir de samme bytene på hver flate. MCP er Model Context Protocol: kshana-mcp lar en KI-assistent (kunstig intelligens) kjøre motoren.
Forskning#
Seks artikler på arXiv er bygd på den åpne motoren, hver med kommandoen bak: arXiv:2606,22054 (optimismegapet hos interferensdetektorer), arXiv:2606,24210 (et betinget beskyttelsesnivå for tidssynkronisering), arXiv:2607,05415 (hvor stabil en PNT-robusthetsscore er), arXiv:2607,02566 (observerbarhet for månestasjoner på overflaten med interferometri med svært lang grunnlinje), arXiv:2607,06212 (geometri ved månens sørpol og overflatebeacons) og arXiv:2610,23871 (cislunar navigasjon som et observerbarhetsproblem: buelengde, Gram-konditionering og Doppler-vektstangen). Se Forskning.
Utgaver#
Hele motoren er gratis under AGPL-3.0. Kshana Pro, et proprietært overlegg som avhenger av den åpne motoren og aldri forker den, og skreddersydde studier tilbys på kontrakt fra Ashforde® OÜ: contact@ashforde.org. Det er ingen priser; se docs/PRO.md.
Les mer#
- Hele README-en → https://github.com/AshfordeOU/kshana
- Kshana Studio (motoren i nettleseren din, som WebAssembly) → https://kshana.dev
- Funksjoner → docs/CAPABILITY.md
- Validering og opprinnelse → docs/VALIDATION.md · docs/PROVENANCE.md
- Verifikasjonsmatrise → docs/VERIFICATION-MATRIX.md
- Siter → CITATION.cff · DOI 10.5281/zenodo.20528627
Lisens#
Gratis og åpen kildekode under GNU AGPL-3.0-only (GNU Affero General Public License, kun versjon 3). En kommersiell lisens er tilgjengelig fra Ashforde® OÜ (et estisk privat aksjeselskap; OÜ = osaühing) for lukket integrasjon; se LICENSING.md. Profesjonelt utviklet og vedlikeholdt av Ashforde® OÜ.