Konekäännös, jota äidinkielinen puhuja ei ole tarkistanut. Viitteenä on englanninkielinen versio.

API:t ja integraatiotMuokkaa GitHubissaLähde: README.npm.md

Kshana: tunnus, kompassin ristikko, joka merkitsee täsmällisen hetken, sanamerkin kshana vieressäKshana: tunnus, kompassin ristikko, joka merkitsee täsmällisen hetken, sanamerkin kshana vieressä

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: Kshanan tehtäväkonsoli, piirretty moottorin todellisesta ajosta, ketjutettu häirinnän, harhautuksen, holdoverin ja eheyden kampanja GPS:n, Galileon, BeiDoun ja GLONASSin 102 satelliitin yliHarjoittele hetkeä, kun GNSS sammuu: Kshanan tehtäväkonsoli, piirretty moottorin todellisesta ajosta, ketjutettu häirinnän, harhautuksen, holdoverin ja eheyden kampanja GPS:n, Galileon, BeiDoun ja GLONASSin 102 satelliitin yli

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.

Miten kyvykkyys ansaitsee nimikkeensä: kyvykkyys, oraakkeli, testi, kirjanpidon nimike. Varmennustila kaikissa 401 kyvykkyydessä: 176 validoitua, 221 mallinnettua, 4 kumppanin omistamaaMiten kyvykkyys ansaitsee nimikkeensä: kyvykkyys, oraakkeli, testi, kirjanpidon nimike. Varmennustila kaikissa 401 kyvykkyydessä: 176 validoitua, 221 mallinnettua, 4 kumppanin omistamaa

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#

Yksi avoin moottori keskellä, kshana 0.40.0, tyypitetyllä lähetyksellä 75 lajiin; sen ympärillä komentorivi, Rust-kirjasto, Python, WebAssembly ja Kshana Studio, MCP-palvelin, Docker-image ja JetBrains-liitännäinen; sen alla Kshana Pro, suljettu kerros, joka riippuu avoimesta moottorista eikä koskaan haarauta sitäYksi avoin moottori keskellä, kshana 0.40.0, tyypitetyllä lähetyksellä 75 lajiin; sen ympärillä komentorivi, Rust-kirjasto, Python, WebAssembly ja Kshana Studio, MCP-palvelin, Docker-image ja JetBrains-liitännäinen; sen alla Kshana Pro, suljettu kerros, joka riippuu avoimesta moottorista eikä koskaan haarauta sitä

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ää#

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.