机器翻译,未经母语人士审校。以英文版为准。

API与集成在GitHub上编辑来源:README.npm.md

Kshana:标志,一个标示精确时刻的罗盘准星,位于字标kshana旁Kshana:标志,一个标示精确时刻的罗盘准星,位于字标kshana旁

Kshana · क्षण · 精确的一瞬
一款开源的PNT(定位、导航与授时)韧性仿真器。

发布版本v0.40.0 401项能力中有176项已对照独立的外部参考基准(oracle)验证 行覆盖率约95%,持续集成中的门槛为85% 许可证:仅AGPL-3.0,或商业许可证 DOI 10.5281/zenodo.20528627

预演GNSS失效的那一分钟:Kshana的任务控制台,取自引擎的一次真实运行,这是针对GPS、Galileo、北斗和GLONASS共102颗卫星的、串联了压制干扰、欺骗干扰、守时和完好性的campaign预演GNSS失效的那一分钟:Kshana的任务控制台,取自引擎的一次真实运行,这是针对GPS、Galileo、北斗和GLONASS共102颗卫星的、串联了压制干扰、欺骗干扰、守时和完好性的campaign

预演GNSS失效的那一分钟#

当GNSS(全球导航卫星系统)信号失效时,Kshana重放压制干扰、欺骗干扰和时钟守时,并告诉你一个系统能在其预算之内维持多久的时间和位置,以及哪种时钟或传感器能换来最大的余量。这是WebAssembly软件包:整个引擎以JavaScript形式提供,可在浏览器或Node.js中使用。每次运行都可根据场景、随机种子和引擎版本逐位复现。

无需安装即可先试用:Kshana Studio在你的浏览器中运行整个引擎,已编译为WebAssembly,不上传任何内容。

证据#

401项能力中有176项已对照独立的外部参考基准(oracle)验证;221项如实标注为已建模,4项由合作方负责。每项能力在经机器核对的台账中带有一个标签:VALIDATED(独立的外部参考基准(oracle)一致:真实数据、独立实现或已发布的参考向量)、MODELLED(内部自洽,并明确说明)或PARTNER(由硬件合作方负责)。核对项包括:AIAA(美国航空航天学会)2006-6753的全部666个SGP4(简化通用摄动4)向量,一致至4.12 mm,以及Cowell力模型对照Orekit 12.2一致至0.08 m。

一项能力如何赢得其标签:能力、参考基准(oracle)、测试、台账标签。全部401项能力的验证状态:176项已验证,221项已建模,4项由合作方负责一项能力如何赢得其标签:能力、参考基准(oracle)、测试、台账标签。全部401项能力的验证状态:176项已验证,221项已建模,4项由合作方负责

安装#

npm install kshana

用法#

该软件包是带有WebAssembly载荷的ES(ECMAScript,标准JavaScript)模块,为浏览器构建。初始化一次,然后同步调用引擎。浏览器与Node.js之间唯一的区别,是WebAssembly二进制文件的加载方式。

在浏览器中(通过打包器,或通过提供node_modules/kshana/的页面),init()会从模块旁边获取kshana_bg.wasm:

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

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

在Node.js中,init()会以TypeError: fetch failed失败(Node的fetch无法读取本地文件),因此应从磁盘读取该二进制文件,并交给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

将Node.js版本保存为.mjs文件(或在你的package.json中设置"type": "module"),使import可以工作。此后两者相同:

// 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可看到带类型的结果:run_typed(toml)返回RunOutput(json、svg、summary、csv: string | null、data: ResultDocument),scenario_kinds()返回KindMeta[],其name是各类型的ScenarioKind联合,error_kind()返回ErrorKind(成功时为"")。每个结果文档自己的字段因类型而异;ResultDocument为共用的信封(schema_version、engine_version,以及由各FieldUnit组成的units块)给出类型。

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);

另有四个函数向前端描述该引擎。kind_modules()返回一个从类型到其验证矩阵各行所指名的模块的JSON对象,field_importance()返回从类型到回答其问题的结果字段的JSON对象(显示用元数据;引擎从不读取它),iq_signals()返回iq_run_short所接受的信号名称,iq_run_short(fs_hz, duration_s, signal, ids, dopplers_hz, cn0_dbhz, seed)返回一个简短的合成IQ场景,在内存中完成捕获和跟踪(至多0.25 s、1,000,000个采样和8颗卫星),其结果与原生构建相同。

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接口上,每个入口都是一次单独的调用:run(结果文档,以JSON字符串形式给出)、summary、chart_svg、table_csv(场景的CSV(逗号分隔值)表,以字符串形式给出;对于不发布表的类型则为undefined;场景无效时会抛出异常)、run_all(一次引擎运行,以JSON字符串形式返回{json, svg, summary, csv}——当你需要不止一种输出时使用它,因为其他每次调用都会重新运行该场景)、run_typed(同样的输出,作为一个带类型的对象,文档已解析为data)、version、list_kinds / scenario_kinds / error_kind(自省;scenario_kinds返回已解析的列表)、encode_permalink / decode_permalink——Kshana Studio用来把整个场景经由地址栏片段往返传递的可分享链接(URL,统一资源定位符)编解码器——以及export_sp3 / export_omm / export_oem,即命令行所写出的SP3-c(标准产品3格式的c修订版)和CCSDS(空间数据系统咨询委员会)星历产物——OMM(轨道平均根数消息)和OEM(轨道星历消息)——还有receiver_trust,它评估由receiver-trust场景描述的一份真实接收机日志,并以JSON字符串形式返回{json, csv, svg, summary}(浏览器没有文件系统,因此日志和任何导航文件都必须以text或base64的形式内联在场景中;[platform] kind = "vessel"表会增加海事监测项和0-100的信任度评分,仅供参考)、export_formats / export_scenario(某个场景支持哪些互操作格式,无需运行它,以及在内存中的一次导出:czml、kml、geojson、stk或sigmf,以JSON {format, spec_url, files}给出,同一场景逐字节相同,不上传任何内容)、import_route(写入航路点航迹场景的GeoJSON航线,即命令行的--import-route)、animate_scenario(把运行的时间序列做成动画SVG、单个HTML播放器或SVG帧)、list_examples / get_example(随附的参考场景及其TOML)、evidence_attach_timestamp(在内存中把一个RFC 3161令牌绑定到一个证据包;该证据包仍须通过验证,时间戳机构的签名不被检查)、osnma_verify(Galileo导航数据的I/NAV页文件或UBX数据流对哪些卫星的数据完成了认证,使用受信任的Merkle根或公钥,以及可选的独立参考时间;它认证的是数据,不就抗欺骗干扰性能作任何论断;不上传任何内容)、receiver_trust_replay(按实时模式的评分方式对有界的NMEA摘录评分;没有门限)、assess_vessel_log(一艘船的NMEA日志,作为批量运行)、trust_telemetry(以Prometheus文本、CEF或LEEF系统日志行、或OTLP载荷形式给出的信任数据流或结果;不发送任何内容)、evidence_verify(检查已签名的证据包;不上传任何内容;证据包由CLI、Python或MCP制作)、bench_export(把场景的运动和事件导出为文本,供实验室模拟器使用;不写出任何信号)、compliance_report和compliance_mapping(结果文档为哪些公开框架的要求行提供证据支持,并给出每一行的差距;并不表明某个框架已达到)、interference_map(把ADS-B或AIS的CSV文本按每个UTC日生成kshana-interference-map/v1 GeoJSON;仅作汇总)、route_exposure(某条航线穿过这些地图中降级单元的份额;不是预测)、nmea_training(合成的驾驶台NMEA和供船员训练用的教员日志;仅为文本,绝不用于船舶的实际导航系统),以及天空几何函数sky_geometry、sky_monte_carlo、skyline_presets、skyline_profile和skyplot_svg(在建筑物、码头或地形遮挡部分天空时,某个站点能看到哪些卫星,并给出精度因子、水平误差椭圆、带随机种子的蒙特卡罗点云和SVG文本形式的天空图;可见性判定和椭圆已对照独立的库核对,预设是具有代表性的几何而不是实地测量,天际线只会去除视距内的卫星,不会做其他任何事)。浏览器构建中没有的有:带有门限和TCP监听器的receiver-trust live、流式的训练NMEA,以及遥测导出器(Prometheus、OpenTelemetry、syslog)是长时间运行的网络进程,保留在命令行工具中;创建证据包需要签名密钥,应由CLI或Python持有。这里没有一次调用完成的run_full;该绑定只存在于Python wheel上。

验证矩阵中的每项能力都被标为已与外部参考核对(对照独立的外部基准(oracle)核对)、由模型计算得出或由合作方负责;光钟的数字是在地面硬件上的空间目标(尚无锶光钟上过天)。各领域的成熟度并不一致——地球PNT已对照真实数据核对;深空和火星导航是由模型计算得出的,只有其构件(光行时、行星位置)已对照外部基准(oracle)核对;真实任务的深空OD(定轨)还在路线图上。

能力#

引擎有92种场景类型;kshana kinds列出它们及其字段。0.38.0中新增:gnss-ssv(针对在GNSS轨道之上、周围和以外的航天器的GNSS信号)和lunar-infrastructure(作为导航与大地测量基础设施的月球轨道与月面),均为MODELLED,以及holdover-test(对照ITU-T模板的时间误差记录)。

  • 频谱:干扰源如何逐个频段占据GNSS的L频段。
  • 时钟与授时:对照阈值的守时、时间传递,以及对照国际电信联盟标准化部门(ITU-T)模板的电信守时。
  • 围绕任意天体的星座:围绕地球、月球或火星的覆盖、精度因子和可用性,以及某一历元的太阳系。
  • 低地球轨道导航:信号、过境和链路、导航电文,以及逐阶段给出的融合定位结果。
  • Campaign:在一个场景中进行串联任务、扫描或蒙特卡罗系综。
  • 报告、动画与导出:每个数字都带单位和标签;运行的动画图;SP3(标准产品3)、CCSDS(空间数据系统咨询委员会)轨道消息、CZML(Cesium语言)、KML(Keyhole标记语言)、GeoJSON、STK(系统工具包)和SigMF(信号元数据格式)文件。

架构#

中心是一个开放的引擎,kshana 0.40.0,通过带类型的分派覆盖75种类型;围绕它的是命令行、Rust库、Python、WebAssembly与Kshana Studio、MCP服务器、Docker镜像和JetBrains插件;其下是Kshana Pro,一个依赖开放引擎、且从不分叉它的专有叠加层中心是一个开放的引擎,kshana 0.40.0,通过带类型的分派覆盖75种类型;围绕它的是命令行、Rust库、Python、WebAssembly与Kshana Studio、MCP服务器、Docker镜像和JetBrains插件;其下是Kshana Pro,一个依赖开放引擎、且从不分叉它的专有叠加层

同一场景文件在每个界面上给出相同的字节。MCP即Model Context Protocol:kshana-mcp让AI(人工智能)助手运行该引擎。

研究#

arXiv上有六篇论文建立在该开放引擎之上,每篇都附有其背后的命令:arXiv:2606.22054(干扰检测器的乐观差距)、arXiv:2606.24210(条件授时保护级)、arXiv:2607.05415(PNT韧性评分有多稳定)、arXiv:2607.02566(以甚长基线干涉测量实现的月面站可观测性)、arXiv:2607.06212(月球南极几何与月面信标)和arXiv:2610.23871(作为可观测性问题的地月空间导航:弧长、Gramian条件数和多普勒杠杆)。参见研究。

版本#

整个引擎依AGPL-3.0免费提供。Kshana Pro是一个依赖开放引擎、且从不分叉它的专有叠加层,它和定制研究可通过合同从Ashforde® OÜ 获得:contact@ashforde.org。不列价格;参见docs/PRO.md。

了解更多#

许可#

依GNU AGPL-3.0-only(GNU Affero通用公共许可证,仅第3版)免费开源。商业许可证可从Ashforde® OÜ(一家爱沙尼亚私人有限公司;OÜ = osaühing)获得,用于闭源集成;参见LICENSING.md。由Ashforde® OÜ 专业开发和维护。