Maschinelle Übersetzung, nicht von einem Muttersprachler geprüft. Englisch ist die maßgebliche Fassung.

APIs und IntegrationenAuf GitHub bearbeitenQuelle: README.npm.md

Kshana: die Marke, ein Kompass-Fadenkreuz, das den genauen Augenblick markiert, neben dem Wortzeichen kshanaKshana: die Marke, ein Kompass-Fadenkreuz, das den genauen Augenblick markiert, neben dem Wortzeichen kshana

Kshana · क्षण · der präzise Augenblick
Ein quelloffener Simulator für die Resilienz von PNT (Positionierung, Navigation und Zeitgebung).

Version v0.40.0 176 von 401 Fähigkeiten gegen unabhängige externe Referenzen validiert Etwa 95 % Zeilenabdeckung, in der kontinuierlichen Integration mit 85 % als Schwelle Lizenz: AGPL-3.0-only oder eine kommerzielle Lizenz DOI 10.5281/zenodo.20528627

Proben Sie die Minute, in der GNSS ausfällt: die Missionskonsole von Kshana, gezeichnet aus einem echten Lauf der Engine, einer verketteten Kampagne aus jamming, spoofing, holdover und Integrität über die 102 Satelliten von GPS, Galileo, BeiDou und GLONASSProben Sie die Minute, in der GNSS ausfällt: die Missionskonsole von Kshana, gezeichnet aus einem echten Lauf der Engine, einer verketteten Kampagne aus jamming, spoofing, holdover und Integrität über die 102 Satelliten von GPS, Galileo, BeiDou und GLONASS

Proben Sie die Minute, in der GNSS ausfällt#

Kshana spielt jamming, spoofing und Uhren-holdover ab, wenn GNSS-Signale (Global Navigation Satellite System) ausfallen, und sagt Ihnen, wie lange ein System Zeit und Position innerhalb seines Budgets hält und welche Uhr oder welcher Sensor den größten Spielraum bringt. Dies ist das WebAssembly-Paket: die gesamte Engine in JavaScript, im Browser oder in Node.js. Jeder Lauf ist aus dem Szenario, dem Seed und der Version der Engine bitgenau reproduzierbar.

Probieren Sie es zuerst aus, ohne etwas zu installieren: Kshana Studio führt die gesamte Engine in Ihrem Browser aus, zu WebAssembly kompiliert, und lädt nichts hoch.

Nachweise#

176 von 401 Fähigkeiten gegen unabhängige externe Referenzen validiert; 221 ehrlich als modelliert gekennzeichnet, 4 im Besitz von Partnern. Jede Fähigkeit trägt in einem maschinengeprüften Register genau eine Kennzeichnung: VALIDATED (eine unabhängige externe Referenz stimmt überein: reale Daten, eine unabhängige Implementierung oder veröffentlichte Referenzvektoren), MODELLED (in sich konsistent, und das wird offen gesagt) oder PARTNER (ein Hardware-Partner besitzt sie). Zu den Prüfungen gehören: alle 666 SGP4-Vektoren (Simplified General Perturbations 4) von AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 bis auf 4,12 mm und das Cowell-Kraftmodell bis auf 0,08 m gegen Orekit 12,2.

Wie eine Fähigkeit ihre Kennzeichnung erwirbt: Fähigkeit, unabhängige Referenz, Test, Registerkennzeichnung. Der Verifikationsstatus über alle 401 Fähigkeiten: 176 validiert, 221 modelliert, 4 im Besitz von PartnernWie eine Fähigkeit ihre Kennzeichnung erwirbt: Fähigkeit, unabhängige Referenz, Test, Registerkennzeichnung. Der Verifikationsstatus über alle 401 Fähigkeiten: 176 validiert, 221 modelliert, 4 im Besitz von Partnern

Installation#

npm install kshana

Verwendung#

Das Paket ist ein ES-Modul (ECMAScript, Standard-JavaScript) mit einer WebAssembly-Nutzlast, für den Browser gebaut. Initialisieren Sie es einmal und rufen Sie die Engine dann synchron auf. Der einzige Unterschied zwischen dem Browser und Node.js besteht darin, wie die WebAssembly-Binärdatei geladen wird.

Im Browser (über einen Bundler oder eine Seite, die node_modules/kshana/ ausliefert) holt init() kshana_bg.wasm von neben dem Modul:

import init, { run, summary, chart_svg, version } from "kshana";

await init();                                   // fetch and compile the WebAssembly binary

In Node.js scheitert init() mit TypeError: fetch failed (das fetch von Node kann keine lokale Datei lesen), also lesen Sie die Binärdatei von der Festplatte und übergeben sie an 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

Speichern Sie die Node.js-Version als .mjs-Datei (oder setzen Sie "type": "module" in Ihrer package.json), damit import funktioniert. Von da an sind beide gleich:

// 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 sieht typisierte Ergebnisse: run_typed(toml) gibt ein RunOutput zurück (json, svg, summary, csv: string | null, data: ResultDocument), scenario_kinds() ein KindMeta[], dessen name die Union ScenarioKind jeder Art ist, und error_kind() ein ErrorKind (oder "" bei Erfolg). Die eigenen Felder jedes Ergebnisdokuments variieren je nach Art; ResultDocument typisiert den gemeinsamen Umschlag (schema_version, engine_version und den Block units aus 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 weitere Funktionen beschreiben die Engine für ein Frontend. kind_modules() gibt ein JSON-Objekt von Art zu den Modulen zurück, die ihre Zeilen der Verifikationsmatrix nennen, field_importance() eines von Art zu den Ergebnisfeldern, die ihre Frage beantworten (Anzeige-Metadaten; die Engine liest sie nie), iq_signals() die Signalnamen, die iq_run_short akzeptiert, und iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) eine kurze synthetische IQ-Szene, im Speicher erfasst und verfolgt (höchstens 0,25 s, 1.000.000 Abtastwerte und 8 Satelliten), mit derselben Antwort wie der 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}

Auf der WebAssembly-Seite ist jeder Einstiegspunkt ein eigener Aufruf: run (das Ergebnisdokument als JSON-Zeichenkette), summary, chart_svg, table_csv (die CSV-Tabelle (kommagetrennte Werte) des Szenarios als Zeichenkette oder undefined für Arten, die keine Tabelle veröffentlichen; bei einem ungültigen Szenario wirft er eine Ausnahme), run_all (ein Lauf der Engine, der {json, svg, summary, csv} als JSON-Zeichenkette zurückgibt — verwenden Sie ihn, wenn Sie mehr als eine Ausgabe wollen, da jeder andere Aufruf das Szenario neu ausführt), run_typed (dieselben Ausgaben als ein typisiertes Objekt, mit dem bereits als data geparsten Dokument), version, list_kinds / scenario_kinds / error_kind (Introspektion; scenario_kinds gibt die geparste Liste zurück), encode_permalink / decode_permalink — der Codec für teilbare Links (URL, Uniform Resource Locator), mit dem Kshana Studio ein ganzes Szenario durch das Fragment der Adressleiste hin und zurück führt — und export_sp3 / export_omm / export_oem, die Ephemeridenartefakte SP3-c (Revision c des Formats Standard Product 3) und CCSDS (Consultative Committee for Space Data Systems) — OMM, die Orbit Mean-elements Message, und OEM, die Orbit Ephemeris Message —, die das CLI schreibt — und receiver_trust, das ein reales Empfängerlog bewertet, das durch ein Szenario receiver-trust beschrieben wird, und {json, csv, svg, summary} als JSON-Zeichenkette zurückgibt (der Browser hat kein Dateisystem, daher müssen das Log und jede Navigationsdatei als text oder base64 inline im Szenario stehen; eine Tabelle [platform] kind = "vessel" fügt die maritimen Monitore und den Vertrauenswert von 0-100 hinzu, nur beratend), export_formats / export_scenario (welche Interoperabilitätsformate ein Szenario unterstützt, ohne es auszuführen, und ein Export im Speicher: czml, kml, geojson, stk oder sigmf als JSON {format, spec_url, files}, byteidentisch für dasselbe Szenario, nichts wird hochgeladen), import_route (eine GeoJSON-Route, in ein Szenario mit Wegpunktspur geschrieben, das --import-route der Kommandozeile), animate_scenario (die Zeitreihen des Laufs als animiertes SVG, einen einzelnen HTML-Player oder SVG-Frames), list_examples / get_example (die mitgelieferten Referenzszenarien und ihre TOML), evidence_attach_timestamp (ein Token nach RFC 3161 im Speicher an ein Nachweispaket binden; das Paket muss weiterhin verifizieren, und die Signatur der Zeitstempelautorität wird nicht geprüft), osnma_verify (welche Galileo-Navigationsdaten welcher Satelliten eine I/NAV-Seitendatei oder ein UBX-Strom authentifiziert, mit dem vertrauenswürdigen Merkle-Root oder öffentlichen Schlüsseln und einer optionalen unabhängigen Referenzzeit; er authentifiziert Daten und macht keine Aussage über die Leistung gegen spoofing; nichts wird hochgeladen), receiver_trust_replay (ein begrenzter NMEA-Ausschnitt, so bewertet, wie der Live-Modus bewertet; kein Gate), assess_vessel_log (das NMEA-Log eines Schiffes als Stapellauf), trust_telemetry (ein Vertrauensstrom oder -ergebnis als Prometheus-Text, CEF- oder LEEF-Syslog-Zeilen oder eine OTLP-Nutzlast; nichts wird gesendet), evidence_verify (ein signiertes Nachweispaket prüfen; nichts wird hochgeladen; Pakete werden mit dem CLI, Python oder MCP erstellt), bench_export (die Bewegung und die Ereignisse eines Szenarios als Text für einen Laborsimulator; es wird kein Signal geschrieben), compliance_report und compliance_mapping (für welche Anforderungszeilen öffentlicher Rahmenwerke Ergebnisdokumente Belege liefern, mit der Lücke jeder Zeile; kein Befund, dass ein Rahmenwerk erreicht ist) und interference_map (ADS-B- oder AIS-CSV-Text zu einem GeoJSON kshana-interference-map/v1 je UTC-Tag; nur aggregiert), route_exposure (der Anteil einer Route durch beeinträchtigte Zellen dieser Karten; keine Prognose), nmea_training (synthetisches Brücken-NMEA und ein Ausbilderlog für das Training von Besatzungen; nur Text, niemals für die laufenden Navigationssysteme eines Schiffes) und die Funktionen zur Himmelsgeometrie sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile und skyplot_svg (welche Satelliten ein Standort sieht, wenn Gebäude, Kaimauern oder Gelände einen Teil des Himmels verdecken, mit der Dilution of Precision, der horizontalen Fehlerellipse, einer Monte-Carlo-Wolke mit Seed und einem Skyplot als SVG-Text; die Sichtbarkeitsentscheidung und die Ellipse werden gegen unabhängige Bibliotheken geprüft, die Presets sind repräsentative Geometrien und keine Vermessungen, und eine Skyline entfernt Satelliten in Sichtlinie und nichts weiter). Nicht im Browser-Build: receiver-trust live mit seinem Gate und TCP-Listener, gestreamtes Training-NMEA und die Telemetrie-Exporter (Prometheus, OpenTelemetry, Syslog) sind lang laufende Netzwerkprozesse und bleiben im Kommandozeilenwerkzeug; das Erstellen eines Nachweispakets braucht einen Signierschlüssel, der zum CLI oder zu Python gehört. Hier gibt es kein run_full mit einem Aufruf; diese Anbindung existiert nur im Python-Wheel.

Jede Fähigkeit in der Verifikationsmatrix ist als validiert (gegen eine unabhängige externe Referenz geprüft), modelliert oder vom Partner verantwortet gekennzeichnet; Angaben zu optischen Uhren sind Weltraumziele auf Bodenhardware (noch keine optische Strontium-Uhr ist geflogen). Die Reife ist über die Bereiche hinweg nicht einheitlich: Erd-PNT ist gegen reale Daten validiert; die Navigation im tiefen Weltraum und zum Mars ist modelliert, wobei nur ihre Bausteine (Lichtlaufzeit, Planetenpositionen) gegen externe unabhängige Referenzen validiert sind; die Bahnbestimmung (OD, orbit determination) für reale Missionen im tiefen Weltraum steht auf der Roadmap.

Fähigkeiten#

Die Engine hat 92 Szenarioarten; kshana kinds listet sie mit ihren Feldern auf. Neu in 0.38.0: gnss-ssv (GNSS-Signale für Raumfahrzeuge oberhalb, um und jenseits der GNSS-Umlaufbahnen) und lunar-infrastructure (Mondumlaufbahn und Mondoberfläche als Navigations- und Geodäsie-Infrastruktur), beide MODELLED, und holdover-test (eine Zeitfehleraufzeichnung gegen die ITU-T-Masken).

  • Spektrum: wie ein Jammer das GNSS-L-Band belegt, Band für Band.
  • Uhren und Zeitgebung: Holdover gegen einen Schwellenwert, Zeitübertragung und Telekom-Holdover gegen die Masken des Standardisierungssektors der Internationalen Fernmeldeunion (ITU-T).
  • Konstellationen um jeden Körper: Abdeckung, Dilution of Precision und Verfügbarkeit um die Erde, den Mond oder den Mars sowie das Sonnensystem zu einer Epoche.
  • Navigation im niedrigen Erdorbit: Signal, Überflug und Verbindung, Navigationsnachricht und eine fusionierte Lösung, Stufe für Stufe.
  • Kampagnen: eine verkettete Mission, ein Sweep oder ein Monte-Carlo-Ensemble in einem Szenario.
  • Berichte, Animation und Exporte: jede Größe mit ihrer Einheit und Beschriftung; eine animierte Darstellung eines Laufs; SP3 (Standard Product 3), CCSDS-Bahnnachrichten (Consultative Committee for Space Data Systems), CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK (Systems Tool Kit) und SigMF (Signal Metadata Format) als Dateien.

Architektur#

Eine offene Engine in der Mitte, kshana 0.40.0, mit einem typisierten Dispatch über 75 Typen; um sie herum die Kommandozeile, die Rust-Bibliothek, Python, WebAssembly und Kshana Studio, der MCP-Server, das Docker-Image und das JetBrains-Plugin; darunter Kshana Pro, ein proprietäres Overlay, das von der offenen Engine abhängt und sie nie forktEine offene Engine in der Mitte, kshana 0.40.0, mit einem typisierten Dispatch über 75 Typen; um sie herum die Kommandozeile, die Rust-Bibliothek, Python, WebAssembly und Kshana Studio, der MCP-Server, das Docker-Image und das JetBrains-Plugin; darunter Kshana Pro, ein proprietäres Overlay, das von der offenen Engine abhängt und sie nie forkt

Dieselbe Szenariodatei liefert auf jeder Oberfläche dieselben Bytes. MCP ist das Model Context Protocol: kshana-mcp lässt einen KI-Assistenten (künstliche Intelligenz) die Engine ausführen.

Forschung#

Sechs Arbeiten auf arXiv bauen auf der offenen Engine auf, jeweils mit dem zugehörigen Befehl: arXiv:2606,22054 (die Optimismuslücke von Störungsdetektoren), arXiv:2606,24210 (ein bedingtes Schutzniveau für die Zeitgebung), arXiv:2607,05415 (wie stabil ein PNT-Resilienzwert ist), arXiv:2607,02566 (Beobachtbarkeit von Mondoberflächenstationen mit Very-Long-Baseline-Interferometrie), arXiv:2607,06212 (Geometrie am Mond-Südpol und Oberflächenbaken) und arXiv:2610,23871 (cislunare Navigation als Beobachtbarkeitsproblem: Bogenlänge, Gramian-Konditionierung und der Doppler-Hebel). Siehe Forschung.

Editionen#

Die gesamte Engine ist unter der AGPL-3.0 frei. Kshana Pro, ein proprietäres Overlay, das von der offenen Engine abhängt und sie nie forkt, sowie individuelle Studien sind per Vertrag von Ashforde® OÜ erhältlich: contact@ashforde.org. Es gibt keine Preise; siehe docs/PRO.md.

Mehr erfahren#

Lizenz#

Frei und quelloffen unter der GNU AGPL-3.0-only (der GNU Affero General Public License, nur Version 3). Eine kommerzielle Lizenz ist für geschlossene Integration von Ashforde® OÜ (einer estnischen Gesellschaft mit beschränkter Haftung; OÜ = osaühing) erhältlich; siehe LICENSING.md. Professionell entwickelt und gepflegt von Ashforde® OÜ.