Kshana · क्षण · tarkka hetki
Avoimen lähdekoodin PNT-kestävyyssimulaattori (paikannus, navigointi ja ajanmääritys).
Julkaisu v0.40.0 176 / 401 kyvykkyydestä validoitu riippumattomia ulkoisia oraakkeleita vasten Noin 95 %:n rivikattavuus, jatkuvassa integroinnissa kynnyksenä 85 % Lisenssi: AGPL-3.0-only tai kaupallinen lisenssi DOI 10.5281/zenodo.20528627
Harjoittele hetkeä, kun GNSS sammuu#
Kshana toistaa häirintää (jamming), harhautusta (spoofing) ja kellon holdoveria (ajanpito ilman ulkoista viitettä), kun GNSS-signaalit (maailmanlaajuinen satelliittinavigointijärjestelmä) pettävät, ja kertoo, kuinka kauan järjestelmä pitää ajan ja paikan budjettinsa sisällä sekä mikä kello tai anturi tuo eniten marginaalia. Tämä on WebAssembly-paketti: koko moottori JavaScriptinä, selaimessa tai Node.js:ssä. Jokainen ajo on toistettavissa bitti bitiltä skenaarion, siemenluvun ja moottoriversion perusteella.
Kokeile ensin ilman asennusta: Kshana Studio ajaa koko moottorin selaimessasi WebAssemblyksi käännettynä eikä lähetä mitään.
Todisteet#
176 / 401 kyvykkyydestä validoitu riippumattomia ulkoisia oraakkeleita vasten; 221 rehellisesti merkitty mallinnetuksi, 4 kumppanin omistamaa. Jokaisella kyvykkyydellä on yksi nimike koneellisesti tarkistetussa kirjanpidossa: VALIDATED (riippumaton ulkoinen oraakkeli on samaa mieltä: todellinen data, riippumaton toteutus tai julkaistut viitevektorit), MODELLED (sisäisesti johdonmukainen, ja se sanotaan ääneen) tai PARTNER (laitteistokumppani omistaa sen). Tarkistuksiin kuuluvat muun muassa kaikki 666 SGP4-vektoria (Simplified General Perturbations 4) julkaisusta AIAA (American Institute of Aeronautics and Astronautics) 2006-6753 tarkkuudella 4,12 mm sekä Cowell-voimamalli tarkkuudella 0,08 m Orekit 12,2:aa vasten.
Asennus#
npm install kshana
Käyttö#
Paketti on ES-moduuli (ECMAScript, standardi JavaScript), jonka mukana on WebAssembly-hyötykuorma, rakennettu selainta varten. Alusta se kerran ja kutsu sitten moottoria synkronisesti. Ainoa ero selaimen ja Node.js:n välillä on se, miten WebAssembly-binääri ladataan.
Selaimessa (paketointityökalun kautta tai sivulla, joka tarjoaa hakemiston node_modules/kshana/) init() hakee tiedoston kshana_bg.wasm moduulin vierestä:
import init, { run, summary, chart_svg, version } from "kshana";
await init(); // fetch and compile the WebAssembly binary
Node.js:ssä init() epäonnistuu virheeseen TypeError: fetch failed (Noden fetch ei voi lukea paikallista tiedostoa), joten lue binääri levyltä ja anna se funktiolle 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
Tallenna Node.js-versio tiedostoksi, jonka pääte on .mjs (tai aseta "type": "module" tiedostossa package.json), jotta import toimii. Siitä eteenpäin molemmat ovat samanlaisia:
// 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 näkee tyypitetyt tulokset: run_typed(toml) palauttaa tyypin RunOutput (json, svg, summary, csv: string | null, data: ResultDocument), scenario_kinds() palauttaa tyypin KindMeta[], jonka name on kaikkien lajien unioni ScenarioKind, ja error_kind() palauttaa tyypin ErrorKind (onnistuessa ""). Kunkin tulosasiakirjan omat kentät vaihtelevat lajin mukaan; ResultDocument tyypittää yhteisen kehyksen (schema_version, engine_version sekä units-lohko, joka koostuu arvoista 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);
Neljä muuta funktiota kuvaa moottoria käyttöliittymälle. kind_modules() palauttaa JSON-olion lajista moduuleihin, jotka sen varmennusmatriisin rivit nimeävät, field_importance() lajista niihin tuloskenttiin, jotka vastaavat sen kysymykseen (esitysmetadataa; moottori ei koskaan lue sitä), iq_signals() signaalien nimet, jotka iq_run_short hyväksyy, ja iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed) lyhyen synteettisen IQ-kohtauksen, joka hankitaan ja jota seurataan muistissa (enintään 0,25 s, 1 000 000 näytettä ja 8 satelliittia), samalla vastauksella kuin natiiviversio.
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}
WebAssembly-pinnalla jokainen sisääntulopiste on erillinen kutsu: run (tulosasiakirja JSON-merkkijonona), summary, chart_svg, table_csv (skenaarion CSV-taulukko (pilkuin erotetut arvot) merkkijonona tai undefined lajeille, jotka eivät julkaise taulukkoa; heittää virheen virheellisestä skenaariosta), run_all (yksi moottoriajo, joka palauttaa {json, svg, summary, csv} JSON-merkkijonona — käytä sitä, kun haluat useamman kuin yhden tulosteen, sillä jokainen muu kutsu ajaa skenaarion alusta), run_typed (samat tulosteet yhtenä tyypitettynä oliona, jossa asiakirja on jo jäsennetty kentäksi data), version, list_kinds / scenario_kinds / error_kind (introspektio; scenario_kinds palauttaa jäsennetyn listan), encode_permalink / decode_permalink — jaettavan linkin (URL, yhtenäinen resurssitunniste) koodekki, jolla Kshana Studio kierrättää koko skenaarion osoiterivin fragmentin kautta — sekä export_sp3 / export_omm / export_oem, SP3-c (Standard Product 3 -muodon versio c) ja CCSDS:n (Consultative Committee for Space Data Systems) efemeridiartefaktit — OMM eli Orbit Mean-elements Message ja OEM eli Orbit Ephemeris Message — jotka komentorivi kirjoittaa — sekä receiver_trust, joka arvioi oikean vastaanottimen lokin, jonka skenaario (receiver-trust) kuvaa, ja palauttaa {json, csv, svg, summary} JSON-merkkijonona (selaimessa ei ole tiedostojärjestelmää, joten lokin ja mahdollisen navigointitiedoston on oltava skenaarion sisällä muodossa text tai base64; taulukko [platform] kind = "vessel" lisää merenkulun monitorit ja luottamuspistemäärän 0–100, vain ohjeellisena), export_formats / export_scenario (mitä yhteentoimivuusmuotoja skenaario tukee ajamatta sitä, ja yksi vienti muistissa: czml, kml, geojson, stk tai sigmf JSON-muodossa {format, spec_url, files}, tavutasolla identtinen samalle skenaariolle, mitään ei lähetetä), import_route (GeoJSON-reitti kirjoitettuna reittipistereittiskenaarioon, komentorivin --import-route), animate_scenario (ajon aikasarja animoituna SVG:nä, yhtenä HTML-soittimena tai SVG-kehyksinä), list_examples / get_example (mukana toimitetut vertailuskenaariot ja niiden TOML), evidence_attach_timestamp (sidotaan RFC 3161 -token todistepakettiin muistissa; paketin on silti läpäistävä varmennus, eikä aikaleimapalvelun allekirjoitusta tarkisteta), osnma_verify (minkä satelliittien Galileo-navigointidatan todentaa I/NAV-sivutiedosto tai UBX-virta, luotetulla Merkle-juurella tai julkisilla avaimilla ja valinnaisella riippumattomalla vertailuajalla; se todentaa dataa eikä esitä väitettä harhautuksenestosta; mitään ei lähetetä), receiver_trust_replay (rajattu NMEA-ote pisteytettynä samoin kuin live-tila pisteyttää; ei porttia), assess_vessel_log (aluksen NMEA-loki eräajona), trust_telemetry (luottamusvirta tai tulos Prometheus-tekstinä, CEF- tai LEEF-syslog-riveinä tai OTLP-hyötykuormana; mitään ei lähetetä), evidence_verify (allekirjoitetun todistepaketin tarkistus; mitään ei lähetetä; paketit tehdään komentorivillä, Pythonilla tai MCP:llä), bench_export (skenaarion liike ja tapahtumat tekstinä laboratoriosimulaattorille; signaalia ei kirjoiteta), compliance_report ja compliance_mapping (mille julkisen kehyksen vaatimusriveille tulosasiakirjat tukevat todisteita (supports evidence for), kunkin rivin aukon kanssa; ei toteamus siitä, että kehys täyttyisi) sekä interference_map (ADS-B- tai AIS-CSV-teksti GeoJSON-tiedostoksi (kshana-interference-map/v1) per UTC-päivä; vain aggregaatti), route_exposure (reitin osuus näiden karttojen heikentyneiden solujen läpi; ei ennuste), nmea_training (synteettinen siltojen NMEA ja ohjaajan loki miehistön harjoitukseen; vain teksti, ei koskaan aluksen todellisiin navigointijärjestelmiin) ja taivasgeometriafunktiot sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile ja skyplot_svg (mitkä satelliitit paikka näkee, kun rakennukset, laiturit tai maasto peittävät osan taivasta, DOP:n (tarkkuuden heikkenemiskerroin), vaakavirheellipsin, siemenluvulla ajetun Monte Carlo -pilven ja taivaskartan SVG-tekstinä; näkyvyyspäätös ja ellipsi on tarkistettu riippumattomia kirjastoja vastaan, esiasetukset ovat edustavia geometrioita eivätkä mittauksia, ja taivaanrantaprofiili poistaa vain näköyhteydettömät satelliitit eikä mitään muuta). Ei selainversiossa: receiver-trust live portteineen ja TCP-kuuntelijoineen, suoratoistettu harjoitus-NMEA ja telemetriavientimoduulit (Prometheus, OpenTelemetry, syslog) ovat pitkäkestoisia verkkoprosesseja ja pysyvät komentorivityökalussa; todistepaketin luominen vaatii allekirjoitusavaimen, joka kuuluu komentoriville tai Pythonille. Yhden kutsun kutsua run_full ei ole täällä; se sidonta on vain Python-wheelissä.
Jokainen varmennusmatriisin ominaisuus on merkitty tilaan validoitu (tarkistettu riippumatonta ulkoista oraakkelia vastaan), mallinnettu tai kumppanin omistama; optisten kellojen luvut ovat avaruustavoitteita maanpäällisellä laitteistolla (strontium-optista kelloa ei ole lennetty). Kypsyys ei ole tasaista eri aloilla: Maan PNT on validoitu oikeaa dataa vastaan; syväavaruuden ja Marsin navigointi on mallinnettua, ja vain sen rakennuspalikat (valon kulkuaika, planeettojen paikat) on validoitu ulkoisia oraakkeleita vastaan; oikean tehtävän syväavaruuden radanmääritys (OD, orbit determination) on tiekartalla.
Ominaisuudet#
Moottorissa on 92 skenaariolajia; kshana kinds luettelee ne kenttineen. Uutta versiossa 0.38.0: gnss-ssv (GNSS-signaalit avaruusaluksille GNSS-kiertoratojen yläpuolella, ympärillä ja ohi) ja lunar-infrastructure (Kuun kiertorata ja pinta navigointi- ja geodeettisena infrastruktuurina), molemmat MODELLED, sekä holdover-test (aikavirhetallenne ITU-T-maskeja vasten).
- Spektri: miten häirintälähde valtaa GNSS:n L-kaistan, kaista kerrallaan.
- Kellot ja ajoitus: holdover kynnystä vastaan, ajansiirto ja telealan holdover Kansainvälisen televiestintäliiton standardointisektorin (ITU-T) maskeja vastaan.
- Satelliittitähdistöt minkä tahansa kappaleen ympärillä: kattavuus, DOP (tarkkuuden heikkenemiskerroin) ja saatavuus Maan, Kuun tai Marsin ympärillä sekä aurinkokunta yhdellä epookilla.
- Matalan Maan kiertoradan navigointi: signaali, ylitys ja yhteys, navigointiviesti sekä yhdistetty paikkaratkaisu vaihe vaiheelta.
- Kampanjat: ketjutettu tehtävä, pyyhkäisy tai Monte Carlo -joukko yhdessä skenaariossa.
- Raportit, animaatio ja viennit: jokainen luku yksikköineen ja tunnisteineen; ajon animoitu piirros; SP3- (Standard Product 3), CCSDS:n (Consultative Committee for Space Data Systems) rataviestit sekä CZML- (Cesium Language), KML- (Keyhole Markup Language), GeoJSON-, STK- (Systems Tool Kit) ja SigMF-tiedostot (Signal Metadata Format).
Arkkitehtuuri#
Sama skenaariotiedosto antaa samat tavut jokaisella pinnalla. MCP on Model Context Protocol: kshana-mcp antaa tekoälyavustajan (AI) ajaa moottoria.
Tutkimus#
Kuusi arXiv-artikkelia perustuu avoimeen moottoriin, kukin komentoineen: arXiv:2606,22054 (häiriöilmaisimien optimismikuilu), arXiv:2606,24210 (ehdollinen ajoituksen suojaustaso), arXiv:2607,05415 (kuinka vakaa PNT-kestävyyspistemäärä on), arXiv:2607,02566 (Kuun pinta-aseman havaittavuus pitkän kantaman interferometrialla), arXiv:2607,06212 (Kuun etelänapaisen alueen geometria ja pintamajakat) ja arXiv:2610,23871 (kuunläheinen navigointi havaittavuusongelmana: kaaren pituus, Gramin matriisin ehtoluku ja Dopplerin vipuvarsi). Ks. Tutkimus.
Versiot#
Koko moottori on vapaa AGPL-3.0-lisenssillä. Kshana Pro, suljettu kerros, joka riippuu avoimesta moottorista eikä koskaan haarauta sitä, sekä räätälöidyt tutkimukset ovat saatavilla sopimuksella Ashforde® OÜ:ltä: contact@ashforde.org. Hintoja ei ole; ks. docs/PRO.md.
Lue lisää#
- Koko README → https://github.com/AshfordeOU/kshana
- Kshana Studio (moottori selaimessasi WebAssemblynä) → https://kshana.dev
- Ominaisuudet → docs/CAPABILITY.md
- Validointi ja alkuperä → docs/VALIDATION.md · docs/PROVENANCE.md
- Varmennusmatriisi → docs/VERIFICATION-MATRIX.md
- Viittaa → CITATION.cff · DOI 10.5281/zenodo.20528627
Lisenssi#
Vapaa ja avoimen lähdekoodin ohjelmisto lisenssillä GNU AGPL-3.0-only (GNU Affero General Public License, vain versio 3). Kaupallinen lisenssi on saatavilla yritykseltä Ashforde® OÜ (virolainen osakeyhtiö; OÜ = osaühing) suljettua integrointia varten; ks. LICENSING.md. Ashforde® OÜ kehittää ja ylläpitää ohjelmistoa ammattimaisesti.