GNSS 拒止环境定位 · 私有仓库 · 9 个包
知道自己可能错多少的定位。
每一种不依赖卫星的导航方法都有同样的失效模式:它给出一个自信但错误的数字,而下游没有任何环节能察觉。pnt-stack 由九个包组成,遵循相反的规则:每一层都把自身的不确定性向上传递,并拒绝断言它无法支撑的位置。
思路
拒绝是一等输出。
一个没有附带基准面的水深读数,不是一个可以谨慎使用的数字。它是一次指明缺失内容的拒绝。这种形态在每一层反复出现,正是它让栈的最顶层能够说出 ACT、CAUTION 或 REFUSE,并且说到做到。
不确定性向上传递
`celnav` 返回一个位置,以及协方差、误差椭圆和保护级别。没有边界的定位不算定位。
以不同方式失效的数据源
天文、地磁和海底地形误差互不相关,因此 `pntfuse` 可以交叉校验它们,把有故障的那个排除掉,而不是把它平均进去。
受支持 ≠ 可以放心信任
`CAUTION` 状态之所以存在,是因为一个定位可能完全有证据支持,却仍然不该据此行动。
九个包 · 12,725 行 · 3,923 行测试
完整链路,端到端。
感知
输入 NMEA 0183。每个量都带有它的时效、基准,以及它为何不可信的原因。
celnav
天文定位解算、加权最小二乘、误差椭圆、保护级别、卡方故障检测。
magnav
航磁补偿与地形辅助导航,均基于真实飞行数据。
pntfuse
跨数据源完整性监测与故障排除,组合以不同方式失效的数据源。
边界
预授权的能力边界,以及防篡改、哈希链式的决策日志,使用 Ed25519 签名。
进行中
连续运行一周、跨越重启的值守,写下能挺过断电的日志。
helm
ACT / CAUTION / REFUSE。它的 26 个测试是关于诚实的规则,而不是关于布局。
完整性
在被允许测量任何东西之前,先以真实值 5% 为基准校准到 4.915%。
bridge
估计器与必须做决定的那部分之间的接缝。
skymaths 是一个 submodule,而不是副本。它在自己的公共仓库中保持权威版本,因为 TerraFirma 和 Starwheel 也依赖它。正是 vendoring 一份副本,让 TerraFirma 偏差了十一个像素长达一年。
大多数项目略去的部分
哪些是实测的,哪些只是写下来的。
此表直接复制自项目自己的 SYSTEM.md,这个文件存在的目的就是把两者分开。那些不好看的行才是重点。
| 层 | 状态 | 证据 |
|---|---|---|
magnav 补偿 | 实测 | 在真实 DAF-MIT 飞行数据上跨航次 22.8× |
magnav 导航 | 实测 | 后处理 6.64 m DRMS / 因果约 28.5 m,四次飞行,其中一次留作测试 |
skymaths | 实测 | 太阳 0.01 nm,月亮 0.17,行星 0.02,对照 Meeus 的算例 |
integrity | 已校准 | 在被允许测量任何东西之前,对真实值 5% 测得 4.915% |
| 测深匹配器 | 已对照孪生体验证 | 在真实星图的 30 条共享航段上峰值完全一致,拒绝 1:1,双方 DRMS 均为 12.76 m |
pntfuse | 逻辑已测试 | 55 个测试;磁误差模型是真实的,定位解是合成的 |
envelope | 逻辑已测试 | 24 个测试,Ed25519,哈希链式 |
sense | 从未遇到过总线 | 48 个测试;9 个注入故障中 7 个被拒绝,2 个被证明无法检测。每一句都是合成的 |
underway | 从没见过船 | 39 个测试;尚未打开过任何串口 |
celnav | 从未见过任何观测 | 数学正确,却什么都看不到 |
| 垂直领域参考 | 完全不需要硬件 | 而且它主导了每一次天文定位 |
实际状况:这个技术栈里的任何东西都还没接触过现实。地磁结果是用别人的地图、在别人的飞行数据上做的真实测量。所有天文部分都是正确的数学,但从未见过一次观测。最关键的那个缺口,补上大约要花 £25。
可以问这个项目的问题:哪些是测量过的,哪些只是写下来的。
- 这里实际测量了什么?
- 哪些内容从未经过测试?