Maskinoversættelse, ikke gennemgået af en modersmålstalende. Engelsk er referencen.

API'er og integrationerRedigér på GitHubKilde: README.npm.md

Kshana: mærket, et kompastrådkors, der markerer det præcise øjeblik, ved siden af ordmærket kshanaKshana: mærket, et kompastrådkors, der markerer det præcise øjeblik, ved siden af ordmærket kshana

Kshana · क्षण · det præcise øjeblik
En open source-simulator til PNT-robusthed (positionering, navigation og tidssynkronisering).

Udgave v0.40.0 176 af 401 funktioner valideret mod uafhængige eksterne referencer Cirka 95% linjedækning, med en grænse på 85% i kontinuerlig integration Licens: AGPL-3.0-only eller en kommerciel licens DOI 10.5281/zenodo.20528627

Øv det minut, hvor GNSS går i sort: Kshanas missionskonsol, tegnet ud fra en rigtig kørsel af motoren, en sammenkædet kampagne med jamming, spoofing, holdover og integritet over de 102 satellitter i GPS, Galileo, BeiDou og GLONASSØv det minut, hvor GNSS går i sort: Kshanas missionskonsol, tegnet ud fra en rigtig kørsel af motoren, en sammenkædet kampagne med jamming, spoofing, holdover og integritet over de 102 satellitter i GPS, Galileo, BeiDou og GLONASS

Øv det minut, hvor GNSS går i sort#

Kshana afspiller jamming, spoofing og urets holdover, når GNSS-signaler (Global Navigation Satellite System) svigter, og fortæller dig, hvor længe et system holder tid og position inden for sit budget, og hvilket ur eller hvilken sensor der giver mest margin. Dette er WebAssembly-pakken: hele motoren i JavaScript, i browseren eller i Node.js. Hver kørsel kan gengives bit for bit ud fra scenariet, seedet og motorversionen.

Prøv det først uden at installere noget: Kshana Studio kører hele motoren i din browser, kompileret til WebAssembly, og uploader ingenting.

Evidens#

176 af 401 funktioner valideret mod uafhængige eksterne referencer; 221 ærligt betegnet modelleret, 4 ejet af partnere. Hver funktion bærer én etiket i et maskinkontrolleret register: VALIDATED (en uafhængig ekstern reference stemmer overens: virkelige data, en uafhængig implementering eller offentliggjorte referencevektorer), MODELLED (internt konsistent og sagt højt) eller PARTNER (en hardwarepartner ejer den). Blandt kontrollerne: 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 mod Orekit 12,2.

Hvordan en funktion opnår sin etiket: funktion, uafhængig reference, test, registeretiket. Verifikationsstatus på tværs af alle 401 funktioner: 176 valideret, 221 modelleret, 4 ejet af partnereHvordan en funktion opnår sin etiket: funktion, uafhængig reference, test, registeretiket. Verifikationsstatus på tværs af alle 401 funktioner: 176 valideret, 221 modelleret, 4 ejet af partnere

Installation#

npm install kshana

Brug#

Pakken er et ES-modul (ECMAScript, standard-JavaScript) med en WebAssembly-nyttelast, bygget til browseren. Initialisér den én gang, og kald derefter motoren synkront. Den eneste forskel mellem browseren og Node.js er, hvordan WebAssembly-binæren indlæses.

I browseren (gennem en bundler eller en side, der serverer node_modules/kshana/) henter init() filen kshana_bg.wasm fra siden af modulet:

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

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

I Node.js fejler init() med TypeError: fetch failed (Nodes fetch kan ikke læse en lokal fil), så læs binæren fra disk og giv 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

Gem Node.js-versionen som en .mjs-fil (eller sæt "type": "module" i din package.json), så import virker. Derfra er de to ens:

// 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[], hvis name er ScenarioKind-unionen af alle typer, og error_kind() en ErrorKind (eller "" ved succes). Hvert resultatdokuments egne felter varierer efter type; ResultDocument typer den fælles kuvert (schema_version, engine_version og units-blokken med 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);

Fire funktioner mere beskriver motoren over for en brugerflade. kind_modules() returnerer et JSON-objekt fra type til de moduler, som rækkerne i dens verifikationsmatrix nævner, field_importance() et fra type til de resultatfelter, der besvarer dens spørgsmål (visningsmetadata; motoren læser det aldrig), iq_signals() de signalnavne, som iq_run_short accepterer, og iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) en kort syntetisk IQ-scene, indfanget og sporet i hukommelsen (højst 0,25 s, 1.000.000 sampel og 8 satellitter), med det samme svar som den 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}

På WebAssembly-fladen er hvert indgangspunkt et separat kald: run (resultatdokumentet som en JSON-streng), summary, chart_svg, table_csv (scenariets CSV-tabel (kommasepareret) som en streng eller undefined for typer, der ikke udgiver nogen tabel; den kaster en fejl ved et ugyldigt scenarie), run_all (én motorkørsel, der returnerer {json, svg, summary, csv} som en JSON-streng — brug det, når du vil have mere end ét output, da hvert andet kald kører scenariet forfra), run_typed (de samme outputs som ét typet objekt, med dokumentet allerede fortolket som data), version, list_kinds / scenario_kinds / error_kind (introspektion; scenario_kinds returnerer den fortolkede liste), encode_permalink / decode_permalink — kodeken til delbare links (URL, uniform resource locator), som Kshana Studio bruger til at føre et helt scenarie frem og tilbage gennem adresselinjens fragment — og export_sp3 / export_omm / export_oem, SP3-c (revision c af formatet Standard Product 3) og CCSDS-efemerideartefakterne (Consultative Committee for Space Data Systems) — OMM, Orbit Mean-elements Message, og OEM, Orbit Ephemeris Message — som CLI'en skriver — og receiver_trust, der vurderer en rigtig modtagerlog beskrevet af et receiver-trust-scenarie og returnerer {json, csv, svg, summary} som en JSON-streng (browseren har intet filsystem, så loggen og en eventuel navigationsfil skal stå inline i scenariet som text eller base64; en [platform] kind = "vessel"-tabel tilføjer de maritime monitorer og tillidsscoren 0-100, kun vejledende), export_formats / export_scenario (hvilke interoperabilitetsformater et scenarie understøtter, uden at køre det, og én eksport i hukommelsen: czml, kml, geojson, stk eller sigmf som JSON {format, spec_url, files}, byte-identisk for det samme scenarie, intet uploades), import_route (en GeoJSON-rute skrevet ind i et waypoint-spor-scenarie, kommandolinjens --import-route), animate_scenario (kørslens tidsserie som en animeret SVG, en enkelt HTML-afspiller eller SVG-billeder), list_examples / get_example (de medfølgende referencescenarier og deres TOML), evidence_attach_timestamp (bind et RFC 3161-token til en bevispakke i hukommelsen; pakken skal stadig kunne verificeres, og tidsstempelmyndighedens signatur kontrolleres ikke), osnma_verify (hvilke satellitters Galileo-navigationsdata en I/NAV-sidefil eller en UBX-strøm autentificerer, med den betroede Merkle-rod eller offentlige nøgler og en valgfri uafhængig referencetid; den autentificerer data og gør ikke krav på nogen anti-spoofing-ydeevne; intet uploades), receiver_trust_replay (et afgrænset NMEA-uddrag bedømt på samme måde som live-tilstanden bedømmer; ingen gate), assess_vessel_log (et fartøjs NMEA-log som en batchkørsel), trust_telemetry (en tillidsstrøm eller et resultat som Prometheus-tekst, CEF- eller LEEF-syslog-linjer eller en OTLP-nyttelast; intet sendes), evidence_verify (kontrollér en signeret bevispakke; intet uploades; pakker laves med CLI'en, Python eller MCP), bench_export (et scenaries bevægelse og hændelser som tekst til en laboratoriesimulator; intet signal skrives), compliance_report og compliance_mapping (hvilke rækker i offentlige rammeværkskrav resultatdokumenter leverer belæg for, med hver rækkes hul; ikke en konstatering af, at et rammeværk er opfyldt), og interference_map (ADS-B- eller AIS-CSV-tekst til en kshana-interference-map/v1-GeoJSON pr. UTC-dag; kun aggregeret), route_exposure (en rutes andel gennem forringede celler i disse kort; ikke en prognose), nmea_training (syntetisk bro-NMEA og en instruktørlog til besætningstræning; kun tekst, aldrig til et fartøjs levende navigationssystemer) og himmelgeometrifunktionerne sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile og skyplot_svg (hvilke satellitter et sted ser, når bygninger, kajer eller terræn blokerer en del af himlen, med præcisionsfortyndingen, den vandrette fejlellipse, en seedet Monte Carlo-sky og et skyplot som SVG-tekst; synlighedsafgørelsen og ellipsen er kontrolleret mod uafhængige biblioteker, forudindstillingerne er repræsentative geometrier og ikke opmålinger, og en horisontprofil fjerner satellitter med fri sigtelinje og intet andet). Ikke i browser-buildet: receiver-trust live med sin gate og TCP-lytter, streamet trænings-NMEA og telemetrieksportørerne (Prometheus, OpenTelemetry, syslog) er langvarige netværksprocesser og bliver i kommandolinjeværktøjet; oprettelse af en bevispakke kræver en signeringsnøgle, som hører til CLI'en eller Python. Der er intet run_full med ét kald her; den binding findes kun i Python-wheelen.

Hver funktion i verifikationsmatrixen er mærket valideret (kontrolleret mod en uafhængig ekstern reference), modelleret eller ejet af partnere; tal for optiske ure er rummål på jordhardware (intet optisk strontiumur er fløjet). Modenheden er ikke ensartet på tværs af områder — PNT på Jorden er valideret mod rigtige data; navigation i det dybe rum og på Mars er modelleret, og kun byggeklodserne (lystid, planetpositioner) er valideret mod eksterne uafhængige referencer; banebestemmelse (OD, orbit determination) i det dybe rum for rigtige missioner står på køreplanen.

Funktioner#

Motoren har 92 scenarietyper; kshana kinds viser dem med deres felter. Nye i 0.38.0: gnss-ssv (GNSS-signaler til rumfartøjer over, omkring og forbi GNSS-banerne) og lunar-infrastructure (månebane og -overflade som navigations- og geodætisk infrastruktur), begge MODELLED, og holdover-test (en tidsfejlsoptagelse mod ITU-T-masker).

  • Spektrum: hvordan en jammer tager GNSS L-båndet, bånd for bånd.
  • Ure og tidssynkronisering: holdover mod en tærskel, tidsoverførsel og telekommunikationsholdover mod maskerne fra Den Internationale Telekommunikationsunions standardiseringssektor (ITU-T).
  • Konstellationer omkring ethvert legeme: dækning, præcisionsfortynding og tilgængelighed omkring Jorden, Månen eller Mars og solsystemet ved én epoke.
  • Navigation i lav jordbane: signal, overflyvning og link, navigationsmeddelelse og en fusioneret positionsbestemmelse, trin for trin.
  • Kampagner: en sammenkædet mission, et sweep eller et Monte Carlo-ensemble i ét scenarie.
  • Rapporter, animation og eksport: hvert tal med sin enhed og sit mærke; en animeret tegning af en kørsel; SP3 (Standard Product 3), CCSDS-banemeddelelser (Consultative Committee for Space Data Systems), CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON, STK-filer (Systems Tool Kit) og SigMF-filer (Signal Metadata Format).

Arkitektur#

Én åben motor i midten, kshana 0.40.0, med en typet fordeling over 75 typer; omkring den kommandolinjen, Rust-biblioteket, Python, WebAssembly og Kshana Studio, MCP-serveren, Docker-aftrykket og JetBrains-pluginnet; under den Kshana Pro, et proprietært lag, der afhænger af den åbne motor og aldrig forgrener denÉn åben motor i midten, kshana 0.40.0, med en typet fordeling over 75 typer; omkring den kommandolinjen, Rust-biblioteket, Python, WebAssembly og Kshana Studio, MCP-serveren, Docker-aftrykket og JetBrains-pluginnet; under den Kshana Pro, et proprietært lag, der afhænger af den åbne motor og aldrig forgrener den

Den samme scenariefil giver de samme bytes på alle flader. MCP er Model Context Protocol: kshana-mcp lader en AI-assistent (kunstig intelligens) køre motoren.

Forskning#

Seks artikler på arXiv bygger på den åbne motor, hver med kommandoen bag sig: arXiv:2606,22054 (optimismegabet for interferensdetektorer), arXiv:2606,24210 (et betinget beskyttelsesniveau for tidssynkronisering), arXiv:2607,05415 (hvor stabil en PNT-robusthedsscore er), arXiv:2607,02566 (observerbarhed af månestationer på overfladen med interferometri over meget lange baselines), arXiv:2607,06212 (geometri ved månens sydpol og overfladefyr) og arXiv:2610,23871 (navigation i cislunart rum som et observerbarhedsproblem: buelængde, Gramian-konditionering og Doppler-løftestangen). Se Forskning.

Udgaver#

Hele motoren er gratis under AGPL-3.0. Kshana Pro, et proprietært lag, der afhænger af den åbne motor og aldrig forgrener den, og skræddersyede studier fås på kontrakt fra Ashforde® OÜ: contact@ashforde.org. Der er ingen priser; se docs/PRO.md.

Læs mere#

Licens#

Gratis og open source under GNU AGPL-3.0-only (GNU Affero General Public License, kun version 3). En kommerciel licens fås fra Ashforde® OÜ (et estisk anpartsselskab; OÜ = osaühing) til lukket integration; se LICENSING.md. Professionelt udviklet og vedligeholdt af Ashforde® OÜ.