Kshana · क्षण · het precieze moment
Een opensource-simulator voor de veerkracht van PNT (positiebepaling, navigatie en tijdsynchronisatie).
Release v0.40.0 176 van 401 mogelijkheden gevalideerd tegen onafhankelijke externe referenties Ongeveer 95% regeldekking, in continue integratie bewaakt op 85% Licentie: AGPL-3.0-only, of een commerciële licentie DOI 10.5281/zenodo.20528627
Oefen de minuut waarin GNSS uitvalt#
Kshana speelt jamming, spoofing en klok-holdover na wanneer GNSS-signalen (Global Navigation Satellite System) uitvallen, en vertelt u hoe lang een systeem tijd en positie binnen zijn budget houdt, en welke klok of sensor de meeste marge oplevert. Dit is het WebAssembly-pakket: de hele engine in JavaScript, in de browser of in Node.js. Elke run is bit voor bit reproduceerbaar uit het scenario, de seed en de engineversie.
Probeer het eerst zonder iets te installeren: Kshana Studio draait de hele engine in uw browser, gecompileerd naar WebAssembly, en uploadt niets.
Bewijs#
176 van 401 mogelijkheden gevalideerd tegen onafhankelijke externe referenties; 221 eerlijk gelabeld als gemodelleerd, 4 in handen van een partner. Elke mogelijkheid draagt één label in een machinaal gecontroleerd register: VALIDATED (een onafhankelijke externe referentie komt overeen: echte data, een onafhankelijke implementatie of gepubliceerde referentievectoren), MODELLED (intern consistent, en hardop gezegd) of PARTNER (een hardwarepartner is eigenaar). Onder de controles: alle 666 SGP4-vectoren (Simplified General Perturbations 4) van AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 tot 4,12 mm, en het Cowell-krachtenmodel tot 0,08 m tegen Orekit 12,2.
Installeren#
npm install kshana
Gebruik#
Het pakket is een ES-module (ECMAScript, standaard-JavaScript) met een WebAssembly-payload, gebouwd voor de browser. Initialiseer het één keer en roep de engine daarna synchroon aan. Het enige verschil tussen de browser en Node.js is hoe het WebAssembly-binary wordt geladen.
In de browser (via een bundler, of een pagina die node_modules/kshana/ serveert) haalt init() kshana_bg.wasm op naast de module:
import init, { run, summary, chart_svg, version } from "kshana";
await init(); // fetch and compile the WebAssembly binary
In Node.js faalt init() met TypeError: fetch failed (de fetch van Node kan geen lokaal bestand lezen), dus lees het binary van schijf en geef het aan 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
Sla de Node.js-versie op als een .mjs-bestand (of stel "type": "module" in in uw package.json) zodat import werkt. Vanaf daar zijn beide gelijk:
// 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 ziet getypeerde resultaten: run_typed(toml) geeft een RunOutput terug (json, svg, summary, csv: string | null, data: ResultDocument), scenario_kinds() een KindMeta[] waarvan name de ScenarioKind-unie van elke soort is, en error_kind() een ErrorKind (of "" bij succes). De eigen velden van elk resultaatdocument verschillen per soort; ResultDocument typeert de gedeelde envelop (schema_version, engine_version en het units-blok van FieldUnits).
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);
Vier andere functies beschrijven de engine voor een front-end. kind_modules() geeft een JSON-object van soort naar de modules die de rijen van de verificatiematrix noemen, field_importance() een van soort naar de resultaatvelden die zijn vraag beantwoorden (weergavemetadata; de engine leest het nooit), iq_signals() de signaalnamen die iq_run_short accepteert, en iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) een korte synthetische IQ-scène, in het geheugen geacquireerd en gevolgd (hoogstens 0,25 s, 1.000.000 samples en 8 satellieten), met hetzelfde antwoord als de native build.
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}
Op het WebAssembly-vlak is elk toegangspunt een afzonderlijke aanroep: run (het resultaatdocument als JSON-string), summary, chart_svg, table_csv (de CSV-tabel (kommagescheiden waarden) van het scenario als string, of undefined voor soorten die geen tabel publiceren; het gooit een fout bij een ongeldig scenario), run_all (één engine-run die {json, svg, summary, csv} als JSON-string teruggeeft — gebruik het wanneer u meer dan één uitvoer wilt, aangezien elke andere aanroep het scenario opnieuw uitvoert), run_typed (dezelfde uitvoer als één getypeerd object, met het document al geparsed als data), version, list_kinds / scenario_kinds / error_kind (introspectie; scenario_kinds geeft de geparsede lijst terug), encode_permalink / decode_permalink — de codec voor deelbare links (URL, uniform resource locator) die Kshana Studio gebruikt om een heel scenario via het fragment in de adresbalk heen en terug te sturen — en export_sp3 / export_omm / export_oem, de SP3-c- (revisie c van het Standard Product 3-formaat) en CCSDS-efemeridebestanden (Consultative Committee for Space Data Systems) — OMM, het Orbit Mean-elements Message, en OEM, het Orbit Ephemeris Message — die de CLI schrijft — en receiver_trust, dat een echt ontvangerlog beoordeelt dat wordt beschreven door een receiver-trust-scenario en {json, csv, svg, summary} als JSON-string teruggeeft (de browser heeft geen bestandssysteem, dus het log, en elk navigatiebestand, moet inline in het scenario staan als text of base64; een [platform] kind = "vessel"-tabel voegt de maritieme monitors en de vertrouwensscore van 0-100 toe, alleen adviserend), export_formats / export_scenario (welke interoperabiliteitsformaten een scenario ondersteunt, zonder het uit te voeren, en één export in het geheugen: czml, kml, geojson, stk of sigmf als JSON {format, spec_url, files}, byte-identiek voor hetzelfde scenario, niets wordt geüpload), import_route (een GeoJSON-route geschreven in een scenario met waypoint-spoor, de --import-route van de opdrachtregel), animate_scenario (de tijdreeks van de run als geanimeerde SVG, een enkele HTML-speler of SVG-frames), list_examples / get_example (de meegeleverde referentiescenario's en hun TOML), evidence_attach_timestamp (bind een RFC 3161-token aan een bewijspakket in het geheugen; het pakket moet nog steeds verifiëren en de handtekening van de tijdstempelautoriteit wordt niet gecontroleerd), osnma_verify (van welke satellieten de Galileo-navigatiedata een I/NAV-paginabestand of een UBX-stroom authenticeert, met de vertrouwde Merkle-wortel of publieke sleutels en een optionele onafhankelijke referentietijd; het authenticeert data en doet geen claim over anti-spoofingprestaties; niets wordt geüpload), receiver_trust_replay (een begrensd NMEA-fragment gescoord zoals de live-modus het scoort; geen gate), assess_vessel_log (het NMEA-log van een vaartuig als batchrun), trust_telemetry (een vertrouwensstroom of -resultaat als Prometheus-tekst, CEF- of LEEF-syslogregels of een OTLP-payload; niets wordt verzonden), evidence_verify (controleer een ondertekend bewijspakket; niets wordt geüpload; pakketten worden gemaakt met de CLI, Python of MCP), bench_export (de beweging en gebeurtenissen van een scenario als tekst voor een laboratoriumsimulator; er wordt geen signaal geschreven), compliance_report en compliance_mapping (voor welke rijen met eisen uit een openbaar kader resultaatdocumenten bewijs leveren, met de lacune van elke rij; geen vaststelling dat een kader wordt gehaald), en interference_map (ADS-B- of AIS-CSV-tekst naar een kshana-interference-map/v1 GeoJSON per UTC-dag; alleen geaggregeerd), route_exposure (het aandeel van een route door verslechterde cellen van die kaarten; geen voorspelling), nmea_training (synthetische brug-NMEA en een instructeurslogboek voor bemanningstraining; alleen tekst, nooit voor de live navigatiesystemen van een vaartuig) en de functies voor hemelgeometrie sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile en skyplot_svg (welke satellieten een locatie ziet wanneer gebouwen, kaden of terrein een deel van de hemel blokkeren, met de dilution of precision, de horizontale foutenellips, een geseede Monte Carlo-wolk en een skyplot als SVG-tekst; de zichtbaarheidsbeslissing en de ellips worden gecontroleerd aan onafhankelijke bibliotheken, de voorinstellingen zijn representatieve geometrieën en geen opmetingen, en een skyline verwijdert satellieten in zichtlijn en niets meer). Niet in de browserbuild: receiver-trust live met zijn gate en TCP-listener, gestreamde training-NMEA en de telemetrie-exporters (Prometheus, OpenTelemetry, syslog) zijn langlopende netwerkprocessen en blijven in het opdrachtregelprogramma; het maken van een bewijspakket vereist een ondertekeningssleutel, die bij de CLI of Python hoort. Er is hier geen run_full in één aanroep; die binding bestaat alleen in het Python-wheel.
Elke mogelijkheid in de verificatiematrix is gelabeld getoetst aan een onafhankelijke externe referentie, modelmatig of in eigendom van een partner; de cijfers voor optische klokken zijn ruimtedoelen op grondhardware (er is nog geen optische strontiumklok gevlogen). De maturiteit is niet uniform over de domeinen — PNT op aarde is getoetst aan echte data; navigatie in de diepe ruimte en op Mars is modelmatig, waarbij alleen de bouwstenen (lichttijd, planeetposities) zijn getoetst aan externe onafhankelijke referenties; baanbepaling (orbit determination) in de diepe ruimte voor echte missies staat op de roadmap.
Mogelijkheden#
De engine heeft 92 scenariosoorten; kshana kinds toont ze met hun velden. Nieuw in 0.38.0: gnss-ssv (GNSS-signalen voor ruimtevaartuigen boven, rond en voorbij de GNSS-banen) en lunar-infrastructure (maanbaan en maanoppervlak als navigatie- en geodetische infrastructuur), beide MODELLED, en holdover-test (een tijdfoutopname tegen de ITU-T-maskers).
- Spectrum: hoe een jammer de GNSS L-band inneemt, band voor band.
- Klokken en tijdsynchronisatie: holdover tegenover een drempel, tijdoverdracht, en telecom-holdover tegenover de maskers van de standaardisatiesector van de International Telecommunication Union (ITU-T).
- Constellaties rond elk lichaam: dekking, dilution of precision en beschikbaarheid rond de aarde, de maan of Mars, en het zonnestelsel op één epoch.
- Navigatie met lage aardbaan: signaal, passage en link, navigatiebericht, en een gefuseerde positiebepaling, fase voor fase.
- Campagnes: een geketende missie, een sweep of een Monte Carlo-ensemble in één scenario.
- Rapporten, animatie en exports: elk cijfer met zijn eenheid en label; een geanimeerde tekening van een run; SP3- (Standard Product 3), CCSDS- (Consultative Committee for Space Data Systems) baanberichten, CZML- (Cesium Language), KML- (Keyhole Markup Language), GeoJSON-, STK- (Systems Tool Kit) en SigMF-bestanden (Signal Metadata Format).
Architectuur#
Hetzelfde scenariobestand geeft op elk vlak dezelfde bytes. MCP is het Model Context Protocol: kshana-mcp laat een AI-assistent (kunstmatige intelligentie) de engine uitvoeren.
Onderzoek#
Zes artikelen op arXiv zijn gebouwd op de open engine, elk met de opdracht erachter: arXiv:2606,22054 (de optimismekloof van interferentiedetectoren), arXiv:2606,24210 (een voorwaardelijk beschermingsniveau voor tijdsynchronisatie), arXiv:2607,05415 (hoe stabiel een veerkrachtscore voor PNT is), arXiv:2607,02566 (waarneembaarheid van maanoppervlaktestations met very-long-baseline interferometrie), arXiv:2607,06212 (geometrie van het zuidpoolgebied van de maan en oppervlaktebakens) en arXiv:2610,23871 (cislunaire navigatie als waarneembaarheidsprobleem: booglengte, Gramiaan-conditionering en de Doppler-hefboom). Zie Onderzoek.
Edities#
De hele engine is vrij onder de AGPL-3.0. Kshana Pro, een propriëtaire laag die van de open engine afhangt en hem nooit forkt, en studies op maat zijn onder contract beschikbaar bij Ashforde® OÜ: contact@ashforde.org. Er zijn geen prijzen; zie docs/PRO.md.
Meer informatie#
- De volledige README → https://github.com/AshfordeOU/kshana
- Kshana Studio (de engine in uw browser, als WebAssembly) → https://kshana.dev
- Mogelijkheden → docs/CAPABILITY.md
- Validatie en herkomst → docs/VALIDATION.md · docs/PROVENANCE.md
- Verificatiematrix → docs/VERIFICATION-MATRIX.md
- Citeren → CITATION.cff · DOI 10.5281/zenodo.20528627
Licentie#
Vrij en opensource onder de GNU AGPL-3.0-only (de GNU Affero General Public License, alleen versie 3). Een commerciële licentie is verkrijgbaar bij Ashforde® OÜ (een Estse besloten vennootschap; OÜ = osaühing) voor gesloten integratie; zie LICENSING.md. Professioneel ontwikkeld en onderhouden door Ashforde® OÜ.