Maskinöversättning, inte granskad av en modersmålstalare. Engelska är referensen.

API:er och integrationerRedigera på GitHubKälla: README.npm.md

Kshana: märket, ett kompassmålkors som markerar det exakta ögonblicket, bredvid ordmärket kshanaKshana: märket, ett kompassmålkors som markerar det exakta ögonblicket, bredvid ordmärket kshana

Kshana · क्षण · det precisa ögonblicket
En simulator med öppen källkod för PNT-resiliens (positionering, navigering och tidssynkronisering).

Utgåva v0.40.0 176 av 401 förmågor validerade mot oberoende externa referenser Cirka 95 % radtäckning, med spärr vid 85 % i kontinuerlig integration Licens: AGPL-3.0-only, eller en kommersiell licens DOI 10.5281/zenodo.20528627

Öva på minuten då GNSS går i mörker: Kshanas uppdragskonsol, ritad utifrån en verklig körning av motorn, en kedjad kampanj med jamming, spoofing, holdover och integritet över de 102 satelliterna i GPS, Galileo, BeiDou och GLONASSÖva på minuten då GNSS går i mörker: Kshanas uppdragskonsol, ritad utifrån en verklig körning av motorn, en kedjad kampanj med jamming, spoofing, holdover och integritet över de 102 satelliterna i GPS, Galileo, BeiDou och GLONASS

Öva på minuten då GNSS går i mörker#

Kshana spelar upp jamming, spoofing och klock-holdover när GNSS-signaler (Global Navigation Satellite System) fallerar, och talar om hur länge ett system håller tid och position inom sin budget, och vilken klocka eller sensor som ger mest marginal. Det här är WebAssembly-paketet: hela motorn i JavaScript, i webbläsaren eller i Node.js. Varje körning kan återskapas bit för bit utifrån scenariot, fröet och motorversionen.

Prova först utan att installera något: Kshana Studio kör hela motorn i din webbläsare, kompilerad till WebAssembly, och laddar inte upp något.

Evidens#

176 av 401 förmågor validerade mot oberoende externa referenser; 221 ärligt märkta som modellerade, 4 ägda av partner. Varje förmåga bär en etikett i ett maskinkontrollerat register: VALIDATED (en oberoende extern referens stämmer: verkliga data, en oberoende implementation eller publicerade referensvektorer), MODELLED (internt konsistent, och sagt högt) eller PARTNER (en hårdvarupartner äger den). Bland kontrollerna: alla 666 SGP4-vektorer (Simplified General Perturbations 4) från AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 till 4,12 mm, och Cowell-kraftmodellen till 0,08 m mot Orekit 12,2.

Hur en förmåga förtjänar sin etikett: förmåga, oberoende referens, test, registeretikett. Verifieringsstatusen för alla 401 förmågor: 176 validerade, 221 modellerade, 4 ägda av partnerHur en förmåga förtjänar sin etikett: förmåga, oberoende referens, test, registeretikett. Verifieringsstatusen för alla 401 förmågor: 176 validerade, 221 modellerade, 4 ägda av partner

Installera#

npm install kshana

Användning#

Paketet är en ES-modul (ECMAScript, standard-JavaScript) med en WebAssembly-last, byggd för webbläsaren. Initiera den en gång och anropa sedan motorn synkront. Den enda skillnaden mellan webbläsaren och Node.js är hur WebAssembly-binären läses in.

I webbläsaren (via en bundlare, eller en sida som serverar node_modules/kshana/) hämtar init() kshana_bg.wasm från platsen bredvid modulen:

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

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

I Node.js misslyckas init() med TypeError: fetch failed (Nodes fetch kan inte läsa en lokal fil), så läs binären från disk och lämna den till 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

Spara Node.js-versionen som en .mjs-fil (eller sätt "type": "module" i din package.json) så att import fungerar. Därefter är de båda lika:

// 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 typade resultat: run_typed(toml) returnerar en RunOutput (json, svg, summary, csv: string | null, data: ResultDocument), scenario_kinds() en KindMeta[] vars name är unionen ScenarioKind av alla typer, och error_kind() en ErrorKind (eller "" vid lyckat resultat). Varje resultatdokuments egna fält varierar efter typ; ResultDocument typar det gemensamma höljet (schema_version, engine_version och blocket units med poster av typen 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);

Fyra funktioner till beskriver motorn för ett gränssnitt. kind_modules() returnerar ett JSON-objekt från typ till de moduler som dess rader i verifieringsmatrisen nämner, field_importance() ett från typ till de resultatfält som svarar på dess fråga (visningsmetadata; motorn läser det aldrig), iq_signals() de signalnamn som iq_run_short godtar, och iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) en kort syntetisk IQ-scen, förvärvad och spårad i minnet (högst 0,25 s, 1 000 000 sampel och 8 satelliter), med samma svar som det inbyggda 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-sidan är varje ingångspunkt ett separat anrop: run (resultatdokumentet som JSON-sträng), summary, chart_svg, table_csv (scenariots CSV-tabell (kommaseparerade värden) som sträng, eller undefined för typer som inte publicerar någon tabell; den kastar ett fel vid ogiltigt scenario), run_all (en motorkörning som returnerar {json, svg, summary, csv} som JSON-sträng — använd den när du vill ha mer än en utdata, eftersom varje annat anrop kör scenariot på nytt), run_typed (samma utdata som ett typat objekt, med dokumentet redan tolkat som data), version, list_kinds / scenario_kinds / error_kind (introspektion; scenario_kinds returnerar den tolkade listan), encode_permalink / decode_permalink — kodeken för delbara länkar (URL, uniform resource locator) som Kshana Studio använder för att skicka ett helt scenario fram och tillbaka via adressfältets fragment — och export_sp3 / export_omm / export_oem, de efemerid-artefakter i SP3-c (revision c av formatet Standard Product 3) och CCSDS (Consultative Committee for Space Data Systems) som kommandoradsverktyget skriver — OMM, Orbit Mean-elements Message, och OEM, Orbit Ephemeris Message — och receiver_trust, som bedömer en verklig mottagarlogg beskriven av ett receiver-trust-scenario och returnerar {json, csv, svg, summary} som JSON-sträng (webbläsaren har inget filsystem, så loggen, och eventuell navigationsfil, måste ligga inline i scenariot som text eller base64; en [platform] kind = "vessel"-tabell lägger till de maritima övervakarna och förtroendepoängen 0-100, endast rådgivande), export_formats / export_scenario (vilka interoperabilitetsformat ett scenario stöder, utan att köra det, och en export i minnet: czml, kml, geojson, stk eller sigmf som JSON {format, spec_url, files}, byte-identisk för samma scenario, inget laddas upp), import_route (en GeoJSON-rutt skriven in i ett waypoint-spårscenario, kommandoradens --import-route), animate_scenario (körningens tidsserie som en animerad SVG, en enda HTML-spelare eller SVG-bildrutor), list_examples / get_example (de medföljande referensscenarierna och deras TOML), evidence_attach_timestamp (bind en RFC 3161-token till ett bevispaket i minnet; paketet måste fortfarande verifieras, och tidsstämplingsmyndighetens signatur kontrolleras inte), osnma_verify (vilka satelliters Galileo-navigeringsdata en I/NAV-sidfil eller en UBX-ström autentiserar, med den betrodda Merkle-roten eller publika nycklar och en valfri oberoende referenstid; den autentiserar data och gör inget anspråk på prestanda mot spoofing; inget laddas upp), receiver_trust_replay (ett begränsat NMEA-utdrag poängsatt på det sätt som liveläget poängsätter; ingen grind), assess_vessel_log (ett fartygs NMEA-logg som batchkörning), trust_telemetry (en förtroendeström eller ett resultat som Prometheus-text, CEF- eller LEEF-syslograder eller en OTLP-nyttolast; inget skickas), evidence_verify (kontrollera ett signerat bevispaket; inget laddas upp; paket skapas med kommandoradsverktyget, Python eller MCP), bench_export (ett scenarios rörelse och händelser som text för en laboratoriesimulator; ingen signal skrivs), compliance_report och compliance_mapping (vilka rader i offentliga ramverkskrav som resultatdokument ger belägg för, med varje rads lucka; inte ett konstaterande att ett ramverk är uppnått), och interference_map (ADS-B- eller AIS-CSV-text till en kshana-interference-map/v1-GeoJSON per UTC-dag; endast aggregerat), route_exposure (en rutts andel genom försämrade celler i de kartorna; inte en prognos), nmea_training (syntetisk brygg-NMEA och en instruktörslogg för besättningsutbildning; endast text, aldrig för ett fartygs levande navigationssystem) och sky-geometri-funktionerna sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile och skyplot_svg (vilka satelliter en plats ser när byggnader, kajer eller terräng blockerar en del av himlen, med precisionsförsämring (DOP), den horisontella felellipsen, ett seedat Monte Carlo-moln och ett skyplot som SVG-text; synlighetsbeslutet och ellipsen kontrolleras mot oberoende bibliotek, förinställningarna är representativa geometrier snarare än inmätningar, och en horisontprofil tar bara bort satelliter utan fri sikt och inget mer). Inte i webbläsarbygget: receiver-trust live med sin grind och TCP-lyssnare, strömmad utbildnings-NMEA och telemetriexportörerna (Prometheus, OpenTelemetry, syslog) är långkörande nätverksprocesser och stannar i kommandoradsverktyget; att skapa ett bevispaket kräver en signeringsnyckel, som hör hemma i kommandoradsverktyget eller Python. Det finns inget run_full med ett enda anrop här; den bindningen finns bara i Python-wheelen.

Varje förmåga i verifieringsmatrisen är märkt validerad (kontrollerad mot en oberoende extern referens), modellerad eller ägd av partner; siffrorna för optiska klockor är rymdmål på markhårdvara (ingen optisk strontiumklocka har flugit). Mognaden är inte enhetlig mellan områden — PNT på jorden är validerad mot verkliga data; navigering i djuprymden och vid Mars är modellerad, där bara byggstenarna (ljustid, planetpositioner) är validerade mot externa referenser; banbestämning (OD) för verkliga djuprymdsuppdrag finns på färdplanen.

Förmågor#

Motorn har 92 scenariotyper; kshana kinds listar dem med deras fält. Nya i 0.38.0: gnss-ssv (GNSS-signaler för rymdfarkoster ovanför, runt och bortom GNSS-banorna) och lunar-infrastructure (månbana och månyta som infrastruktur för navigering och geodesi), båda MODELLED, och holdover-test (en tidsfelsregistrering mot ITU-T-maskerna).

  • Spektrum: hur en jammer tar GNSS L-bandet, band för band.
  • Klockor och tidssynkronisering: holdover mot en tröskel, tidsöverföring och telekom-holdover mot maskerna från International Telecommunication Unions standardiseringssektor (ITU-T).
  • Konstellationer runt vilken kropp som helst: täckning, precisionsförsämring (DOP) och tillgänglighet runt jorden, månen eller Mars, och solsystemet vid en epok.
  • Navigering i låg omloppsbana: signal, passage och länk, navigeringsmeddelande och en fusionerad positionsbestämning, steg för steg.
  • Kampanjer: ett kedjat uppdrag, ett svep eller en Monte Carlo-ensemble i ett scenario.
  • Rapporter, animering och exporter: varje siffra med sin enhet och etikett; en animerad ritning av en körning; SP3 (Standard Product 3), CCSDS-banmeddelanden (Consultative Committee for Space Data Systems), CZML (Cesium Language), KML (Keyhole Markup Language), GeoJSON-, STK- (Systems Tool Kit) och SigMF-filer (Signal Metadata Format).

Arkitektur#

En öppen motor i mitten, kshana 0.40.0, med typad dispatch över 75 typer; runt den kommandoraden, Rust-biblioteket, Python, WebAssembly och Kshana Studio, MCP-servern, Docker-avbilden och JetBrains-pluginet; under den Kshana Pro, ett proprietärt lager som beror på den öppna motorn och aldrig forkar denEn öppen motor i mitten, kshana 0.40.0, med typad dispatch över 75 typer; runt den kommandoraden, Rust-biblioteket, Python, WebAssembly och Kshana Studio, MCP-servern, Docker-avbilden och JetBrains-pluginet; under den Kshana Pro, ett proprietärt lager som beror på den öppna motorn och aldrig forkar den

Samma scenariofil ger samma bytes på varje yta. MCP är Model Context Protocol: kshana-mcp låter en AI-assistent (artificiell intelligens) köra motorn.

Forskning#

Sex artiklar på arXiv bygger på den öppna motorn, var och en med kommandot bakom: arXiv:2606,22054 (optimismgapet hos störningsdetektorer), arXiv:2606,24210 (en villkorad skyddsnivå för tidssynkronisering), arXiv:2607,05415 (hur stabilt ett PNT-resiliensvärde är), arXiv:2607,02566 (observerbarhet för stationer på månytan med interferometri med mycket lång baslinje), arXiv:2607,06212 (geometri vid månens sydpol och ytbeacons) och arXiv:2610,23871 (cislunär navigering som ett observerbarhetsproblem: bågens längd, konditionering av Gram-matrisen och Doppler-hävstången). Se Forskning.

Utgåvor#

Hela motorn är fri under AGPL-3.0. Kshana Pro, ett proprietärt lager som beror på den öppna motorn och aldrig forkar den, och skräddarsydda studier finns på uppdrag från Ashforde® OÜ: contact@ashforde.org. Det finns inga priser; se docs/PRO.md.

Läs mer#

Licens#

Fri och öppen källkod under GNU AGPL-3.0-only (GNU Affero General Public License, endast version 3). En kommersiell licens finns hos Ashforde® OÜ (ett estniskt privat aktiebolag; OÜ = osaühing) för sluten integration; se LICENSING.md. Professionellt utvecklad och underhållen av Ashforde® OÜ.