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

接收机信任度与海事在GitHub上编辑来源:docs/SKYLINE.md

天际线遮蔽与天空几何

直到0.36之前,引擎中的每一次对地可见性判断都只是一个仰角截止角mask_deg:只要卫星处于该数值或以上,不论其方向如何,就算作可见。街道、码头、峡湾或起重机会遮挡部分天空,而让其余部分保持开阔。天际线是随方位角而变的仰角截断;天空几何函数把站点、时间、星座和天际线转换为可见集合、精度因子(DOP)、几何协方差、水平误差椭圆、蒙特卡罗点云和天空图。设计见docs/design/2026-10-12-geometry-and-skyline-design.md(第1和2项)。

证据:遮蔽后的可见性判定(大地测量视角、表格截止角、可见集合及其DOP),在预先登记的比较中对照Orekit 12.2和gnss_lib_py 1.0.4为VALIDATED,误差椭圆和各系统余因子(numpy,预先登记)也是如此;峡谷、扇区和地形的简化、预设以及其余的天空几何函数则为MODELLED(证据)。天际线只会移除视线内的卫星,仅此而已。预设是REPRESENTATIVE的几何,不是实地测绘。

天际线#

天际线是四种描述的逐点最大值。方位角是在站点局部东-北-天坐标系中,自正北起顺时针的度数;仰角的范围为[0, 90)。

描述 TOML 它是什么
表格 table = [[az, el], ...] 仰角在方位角上线性插值,在360° 处回绕。方位角在[0, 360)内严格递增;最多3600行。
街道峡谷 street_az_deg, width_m, height_left_m, height_right_m, antenna_m, length_m 两面笔直的平行墙(见下)。
扇区 sectors = [{ az_from, az_to, el_deg }] 边缘分明的区间,自az_from(含)顺时针到az_to(不含),可以跨过正北;最多360个。
地形 terrain = [{ az, distance_m, height_m }] 化简为表格的点:仰角atan((height_m − d²/(2 R_eff)) / d),带有R_eff = 4/3 × 6371 km的曲率下降(选定并声明的常数)。height_m是相对天线的高度。

preset = "<name>"从某个具名几何出发;随后峡谷字段逐字段覆盖预设的峡谷字段,而table、sectors和terrain则在其上叠加。

接收机的mask_deg保持其含义:它是一条平坦的天际线。方位角az处的有效截断为max(mask_deg, skyline(az)),当卫星的仰角处于或高于它时即可见:与平坦截止角一贯使用的>=相同。高于mask_deg但低于天际线的卫星为被天际线遮蔽。

街道峡谷#

一条街道沿方位角s延伸,两墙之间为w米,天线位于中心线上方a米。沿方位角az,取θ = az − s,射线经d(az) = (w/2) / |sin θ|到达墙面,因此高度为h的墙所产生的截断为

cut(az) = atan( (h − a) / d(az) )          (the right wall for sin θ > 0, the side at s + 90°)

开阔的条带沿街道延伸。当长度为length_m = L(天线位于中点)时,若满足d(az) · |cos θ| > L/2,射线便从开口端穿出,墙体不遮挡任何方向。不高于天线的墙体不遮挡任何方向。antenna_m默认为1.5 m(汽车车顶或手持接收机,属设定的选择);新增街道峡谷则需要width_m。

预设#

所用尺寸为选定并声明的尺寸(取自设计说明),并非对任何真实地点的测量。kshana skyline --preset <name>会打印其中一种预设,连同其出处以及每度一个值的遮挡截止角。

预设 几何 出处
city-street 峡谷:街道走向0°,宽20 m,两侧墙高分别为30 m和30 m,天线高1.5 m。横跨街道方向为70.7°,沿街方向开阔。 高宽比为1.5,处于Oke(1988)《Street design and urban canopy layer climate》(Street design and urban canopy layer climate),Energy and Buildings 11,103–113中给出的街道峡谷高宽比范围0.5–2之内。
harbour-approach 扇区:090–270(180°)向海一侧开阔;码头建筑在315–045(90°)范围内为8°;防波堤及其灯塔在045–090和270–315范围内为3°。 均为设定的选择(例如约285 m外的40 m高仓库)。
fjord 地形:南北向水道两侧各1500 m处,墙体高出天线600 m,每度一个点(位于1500/|sin az| m),并计入曲率下降。横跨方向为21.8°,沿轴线方向低于1°。 其量级与挪威西部深峡湾的宽度和地势起伏相当(Holtedahl(1967),Notes on the formation of fjords and fjord-valleys,Geografiska Annaler 49A,193–203)。
container-terminal 扇区:集装箱堆垛在朝陆一侧的000–180范围内为12°;起重机吊臂在245–255范围内为35°,在285–295范围内为25°;其余方向向水面开阔。 五个ISO 668高箱(14.5 m),距高2 m的天线约60 m;吊臂高出码头约50 m,位于70 m和100 m处,属后巴拿马型起重机的量级。起重机扇区视为不透明。

在场景中#

一个可选的[skyline]段,作用于该类型自身的截止角之上:

类别 天际线带来的变化 每个采样
orbit(配合user_site) 可见性时间线(GNSS可用性)和DOP汇总。 —
integrity(配合user_site) RAIM和ARAIM(araim_dual)所使用的卫星。 epochs[].masked_by_skyline
gnss-sim 其伪距被模拟并由RAIM使用的卫星。 gnss_measurements[].masked_by_skyline
jamming 在干扰机作用之前,接收机能够跟踪的卫星。 epochs[].masked_by_skyline
leo-pvt 每种模式的在视集合,均基于各系统自身的遮蔽角,包括极地扫描(各站点的天际线相同)。多普勒模式包络和设计的单次过境,是接收机必须应对的范围界限,并保持各系统自身的遮蔽角。 joint.epochs[].masked_by_skyline
leo-pass 哪些历元计为高于遮蔽角、高于遮蔽角的时间,以及GNSS对比中的卫星。 satellites[].pass.epochs_masked_by_skyline
nmea-scenario(训练用NMEA) GSV和定位解中的卫星。方位角为固定于地面的真方位,而非船舶的航向。 —

orbit和integrity的地面站点。这两种类型都为在轨用户建模,采用地心高度角,没有地固系方位角,因此只有在设计说明的地面站点模式下才接受天际线:以user_site = { lat_deg, lon_deg, height_m }代替user(二者恰选其一)。每个采样都是一个绝对时刻epoch + t:每颗卫星都传播到该时刻(轨道根数集、广播星历或SP3文件从各自的历元推进,Walker卫星则从epoch起计t),并在该时刻旋转到地固系,使站点看到一致的天空。epoch取自轨道场景自身;若没有(对于没有该项的integrity则始终如此),则取携带历元的卫星中最新的历元,仅对Walker构型则取J2000。高度角和方位角为大地坐标(WGS-84)。完好性类型的ARAIM保护级以及Stanford垂直误差的水平与垂直分量划分,使用同样的大地“上”方向(WGS-84椭球法线,在45° 纬度处与地心径向相差约0.19°);快照RAIM已使用这一方向。没有天际线的user_site是普通的地面用户;在轨的user路径保持不变。

kind = "integrity"
mask_deg = 5.0
# ...
[user_site]
lat_deg = 59.45
lon_deg = 24.75
height_m = 15.0

[skyline]
preset = "harbour-approach"

向后兼容。没有[skyline]段时,场景与天际线代码出现之前同一引擎给出的结果逐字节一致:tests/skyline_scenarios.rs针对每个运行这些类型之一的内置场景,核对其JSON、图表和摘要,并针对每个训练场景核对其NMEA文本,依据是“0.36 portable”基线的SHA-256摘要(即0.35.0发布提交的摘要,在引擎转为可移植数学库时重新建立基线,并作为记录保留在测试中:docs/revisions/STUDIO15-portable-math-rebaseline.md)。空的[skyline]段不遮挡任何方向;此时结果与不带该段的运行相同,只是多了skyline块,且masked_by_skyline计数为零。

被拒绝(refused)的情形,原因写在消息中:在轨user上使用天际线;user与user_site同时出现;未知的预设;没有width_m的峡谷;在[0, 360)内不严格递增的表;超出[0, 90)的高度角;空的扇区;非正的地形距离;输入超过上限;任何未知的键。

存在该段时,结果会增加skyline: { source, open_fraction, provenance }:source为preset:<name>、preset:<name>+overrides或custom;open_fraction是上半球立体角中高于max(mask_deg, skyline)的部分所占比例(即1 − sin(cut)在方位角上的均值:遮蔽角为零时为1,平坦的30° 截止角为0.5);provenance是预设的说明行或场景自己的说明行。单位与出处类别见units块。

自带示例(kshana example <name>):

示例 其展示的内容(删去[skyline]段即可对比)
orbit-urban-canyon-skyline GPS + Galileo位于city-street底部:289个采样中有17个保持定位解,PDOP中位数为70.5(开阔天空下为1.14)。
integrity-harbour-approach 双星座ARAIM驶入港口:70个卫星历元被遮蔽,可用性不变(145中的145)。
gnss-sim-container-terminal-skyline 码头上的伪距和RAIM:44个卫星历元被遮蔽;RAIM可用性为0.59(开阔天空下为0.85)。
jamming-harbour-approach-skyline 港口中一台2 W的干扰机:83个卫星历元被遮蔽,跟踪不变(这些卫星已被干扰机压制)。
leo-pvt-fjord-skyline 峡湾中的GPS + Galileo + LEO层:融合PDOP中位数为1.14(开阔天空下为0.93)。
leo-vertical-autonomous-vehicle-skyline leo-vertical-autonomous-vehicle峡谷分别按平坦的35° 截止角和按沿车辆航向转向的city-street处理:GPS和Galileo卫星数为8对4至5;两种情形下融合平均误差均为2.1 m;1.5 m告警分别出现在51 % 和59 % 的历元。

天空几何#

五个引擎函数(src/geometry.rs),在每个界面上都相同:

函数 输入 → 输出
sky_geometry(request) 每颗卫星:id、system、az_deg、el_deg、cut_deg、visible、masked;n_visible、n_masked、open_fraction;dop(GDOP、PDOP、HDOP、VDOP、TDOP、tdop_by_clock);states、cofactor_enu(单位方差)、covariance_enu_m2;在所请求置信度下的ellipse_1sigma和ellipse;label、statement、advisory
sky_monte_carlo(request, seed, n) n个(最多5000个,为输入上限)最小二乘误差,在独立高斯测距误差σ_UERE之下,由以seed为种子的ChaCha8流生成:samples_enu_m、经验协方差、水平和3-D RMS(与σ_UERE × HDOP和σ_UERE × PDOP并列),以及落在95 % 椭圆内的比例
skyline_presets() 各预设,含标签、说明、出处、每度一个值的遮挡截止角以及open_fraction
skyline_profile(skyline) 将天际线段化简为引擎所用的360项表,并附source、provenance、open_fraction
skyplot_svg(request) 以静态SVG绘制的天空图(无脚本、无外部引用,每个输入字符串均经转义)

一个请求:

{
  "site": {"lat_deg": 59.91, "lon_deg": 10.75, "height_m": 5},
  "time_s": 3600,
  "systems": ["gps-baseline", "galileo", "beidou-meo", "xona-pulsar"],
  "mask_deg": 5,
  "skyline": {"preset": "fjord"},
  "clock": "per-system",
  "sigma_uere_m": 1.5,
  "confidence": 0.95
}

systems是引擎的星座预设(constellation-design的gps-baseline、galileo、beidou-meo、glonass等;LEO预设xona-pulsar、iridium-stl等)或完整的leo-pvt[[system]]表,传播到time_s(带长期J2项的开普勒传播,即leo-pvt联合模式的轨道)。它们的相对相位来自不同的参考历元,因此该天空是一种具代表性的几何,而不是那一天在那个地点的真实天空。卫星也可以改为(或同时)直接给出:"satellites": [{"id": "G05", "system": "GPS", "az_deg": 120, "el_deg": 35}, ...],或使用"ecef_m": [x, y, z]加site或user_ecef_m。默认值:各系统自身的遮蔽角(GNSS为5°,LEO为10°;直接给出的卫星为5°),每个系统一个接收机时钟("common"表示共用一个时钟),σ_UERE为1 m(一条具代表性的双频预算行),置信度0.95。输入上限:地平线以上最多2000颗卫星(要求更多的系统表在构建之前即被拒绝)和16个接收机时钟。

由轨道根数集得到的带日期的天空。 "tle"接受两行根数集文本(每组前的名称行可选;最大4 MiB,为输入上限),由引擎的SGP4(WGS-72,即orbit-real-tle所用的传播器)传播到"epoch"加time_s,以UT1取作UTC且不计极移的方式旋转到地固系,并从site观测。"epoch"为UTC ISO 8601(2026-06-07T12:00:00Z),仅为根数集标注日期(预设不带日期,因此没有tle的epoch会被拒绝);"tle_system"为它们标注各系统时钟所属系统(默认为TLE)。每个结果都在sky_source和sky_statement中说明它是什么样的天空:

sky_source 天空
presets 引擎的星座预设:一种具代表性的几何
tle-at-epoch 传播到所述历元的根数集:这些根数集在该历元所给出的天空,而不是对该天空的测量(其自身精度取决于SGP4和根数集的龄期)
tle-at-element-epoch 没有epoch:根数集传播到最新一组自身历元加time_s,为一种具代表性的天空
satellites 直接给出的卫星,按所述使用

混合方式用+将它们连接。epoch_utc是根数集所传播到的时刻,tle_skipped列出文本中未被使用的部分及原因:格式错误或孤立的根数集行(附行号)、解析器拒绝的根数集,以及SGP4无法传播到该时刻的根数集(已衰减或超出其限制);总计最多100条,之后用最后一条记录其余的数量。空的systems列表不增加任何预设。天空图在页脚中说明其依据。

同一个核。余因子矩阵为orbit::cofactor_from_los,即orbit::dop背后的设计矩阵组装与高斯-若尔当求逆。orbit::dop_cov给出协方差,orbit::dop是其约化,因此VALIDATED的标量不变,并仍由tests/dop_reference.rs固定。不存在第二套DOP实现。

椭圆。半轴为k σ √λ,对应东-北分块的特征值λ,其中k = √(−2 ln(1 − p))(√5.991 = 2.448对应95 %,1对应39.35 %),长轴的方位角为½ atan2(2 Q_EN, Q_NN − Q_EE),在[0, 180)内自正北起算。

界面 入口
CLI kshana sky <request.json|toml>或kshana sky --site <lat,lon[,h]> (--systems <a,b> | --tle <file>) [--epoch] [--tle-system] [--time] [--mask] [--skyline-preset] [--uere] [--clock],配以--monte-carlo <n> --seed <s>或--svg;kshana skyline --preset <name> | --presets | --profile <file>
Rust kshana::geometry::{sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile, skyplot_svg},以及同名的kshana::surface::*
Python kshana.sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile, skyplot_svg
WASM sky_geometry(request_json), sky_monte_carlo(request_json, seed, n), skyline_presets(), skyline_profile(skyline_json), skyplot_svg(request_json)
MCP sky_geometry(request,或skyline_preset);MCP上没有蒙特卡罗(智能体应汇总而非携带的大批量样本)

每个结果都带有label(MODELLED)、statement(在所述误差模型下的几何:独立、等方差、零均值的高斯测距误差;不是对接收机真实误差的预测,真实误差还包含偏差、多路径和非视距误差;也不是完好性界限),以及咨询性声明:仅供参考的软件,不是经型式认可的导航设备(IEC 61108、IEC 61162):船舶航行的责任仍由操作人员承担。

证据#

五行台账(docs/VERIFICATION-MATRIX.md),按设计说明所界定的范围:

行 状态 参考基准
随方位角变化的天际线遮蔽:可见集合、方位角与高度角,以及遮蔽下的DOP VALIDATED Orekit 12.2(TopocentricFrame观测角,ElevationMask)与gnss_lib_py 1.0.4(get_dop和DOP矩阵),在二者运行之前已在xval/orekit-skyline/PREREGISTRATION.md中预先登记(提交e4b9d912):六个站点、四个历元上的1173个观测角,六张表,142个可见集合;最大高度角偏差1.3e-13°,方位角2.3e-13°,遮蔽角1.1e-12°,对照1e-9°;可见集合完全一致,没有落在边界带内的;DOP为3.3e-13(相对值),余因子为矩阵量级的6.6e-13,对照1e-9。范围:表格遮蔽角、大地观测角、被遮蔽的集合及其共用时钟的DOP和余因子。
街道峡谷、扇区和地形归约为表 MODELLED 手工计算的值;上面的比较把它们的表格当作输入读取,并不对其进行核对
天际线预设 MODELLED 无:选定并声明的尺寸(仅与自身核对)
由几何协方差得到的水平误差椭圆与分系统协因数 VALIDATED numpy 2.5.4的linalg.inv和linalg.eigh(标准P2),作用于已提交的142个可见集合,分共用时钟和每系统一个时钟两种情形,在xval/numpy-ellipse/PREREGISTRATION.md中预先登记(提交0bbeeaee):270个用例,半轴为5.1e-13(相对值),方位为5.3e-12°,余因子为矩阵量级的1.0e-12,对照1e-9和1e-6°
天空几何函数 MODELLED 组合:预设传播得到具代表性的天空、蒙特卡罗点云(与其所采样的几何核对)、各界面

没有[skyline]段的情形,已与0.35.0的输出逐字节核对,这说明的是向后兼容,并不验证任何内容。gnss_lib_py只应用单一的高度截止角,因此它在这里是DOP的参考基准(oracle),而不是遮蔽角的参考基准。

天际线没有建模的内容:墙体边缘的衍射、真实接收机仍可能跟踪的反射信号和非视距信号(它们被丢弃,而不是被降级)、部分透明(格构式起重机在其扇区内是不透明的)、给定点之外的地形,以及峡谷和扇区形式内部的地球曲率。