Machinevertaling, niet beoordeeld door een moedertaalspreker. Engels is de referentie.

Ontvangervertrouwen en maritiemBewerken op GitHubBron: docs/SKYLINE.md

Skylinemaskers en hemelgeometrie

Tot 0,36 was elke zichtbaarheidstest voor de aarde in de engine één elevatiegrens, mask_deg: een satelliet telde mee als hij op of boven één getal stond, ongeacht zijn richting. Een straat, een kade, een fjord of een kraan blokkeert een deel van de hemel en laat de rest open. Een skyline is een elevatiegrens die van het azimut afhangt; de hemelgeometriefuncties maken van een locatie, een tijdstip, constellaties en een skyline de zichtbare set, de dilution of precision (DOP), de geometriecovariantie, de horizontale foutellips, een Monte Carlo-wolk en een skyplot. Het ontwerp is docs/design/2026-10-12-geometry-and-skyline-design.md (items 1 en 2).

Bewijs: de beslissing over gemaskeerde zichtbaarheid (geodetische kijkhoeken, het tabelmasker, de zichtbare set en haar DOP) is VALIDATED tegen Orekit 12,2 en gnss_lib_py 1.0.4 in een vooraf vastgelegde vergelijking, en dat geldt ook voor de foutellips en de cofactor per systeem (numpy, vooraf vastgelegd); de reducties voor canyon, sector en terrein, de voorinstellingen en de overige hemelgeometriefuncties zijn MODELLED (Bewijs). Een skyline verwijdert satellieten met zichtlijn en niets meer. De voorinstellingen zijn REPRESENTATIVE geometrieën, geen opmetingen.

De skyline#

Een skyline is het puntsgewijze maximum van vier beschrijvingen. Het azimut wordt in graden met de klok mee gemeten vanaf ware noord in het lokale east-north-up-stelsel van de locatie; elevaties liggen in [0, 90).

Beschrijving TOML Wat het is
Tabel table = [[az, el], ...] Elevaties lineair geïnterpoleerd over het azimut, omgeslagen bij 360°. Azimuts strikt oplopend in [0, 360); hoogstens 3600 rijen.
Stratenkloof street_az_deg, width_m, height_left_m, height_right_m, antenna_m, length_m Twee rechte, evenwijdige wanden (hieronder).
Sectoren sectors = [{ az_from, az_to, el_deg }] Intervallen met scherpe randen, met de klok mee van az_from (inbegrepen) tot az_to (uitgesloten), die door noord heen kunnen lopen; hoogstens 360.
Terrein terrain = [{ az, distance_m, height_m }] Punten teruggebracht tot een tabel: elevatie atan((height_m − d²/(2 R_eff)) / d), met de krommingsdaling voor R_eff = 4/3 × 6371 km (een gekozen, vermelde constante). height_m ligt boven de antenne.

preset = "<name>" start vanuit een benoemde geometrie; de velden van de kloof overschrijven daarna veld voor veld de kloof van de voorinstelling, en table, sectors en terrain komen erbij.

De mask_deg van de ontvanger behoudt zijn betekenis: het is een vlakke skyline. De effectieve grens bij azimut az is max(mask_deg, skyline(az)), en een satelliet is zichtbaar als zijn elevatie er op of boven ligt: dezelfde >= die het vlakke masker altijd gebruikte. Een satelliet boven mask_deg maar onder de skyline is door de skyline gemaskeerd.

De stratenkloof#

Een straat loopt langs azimut s, w meter tussen de wanden, met de antenne a meter hoog op de hartlijn. Langs azimut az, met θ = az − s, bereikt de straal na d(az) = (w/2) / |sin θ| een wand, dus een wand met hoogte h snijdt op

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

De open strook ligt langs de straat. Met length_m = L (de antenne in het midden) verlaat een straal de kloof via een open uiteinde, en snijdt de wand niets, wanneer d(az) · |cos θ| > L/2. Een wand die niet hoger is dan de antenne snijdt niets. antenna_m is standaard 1,5 m (een autodak of een handontvanger, een vermelde keuze); een nieuwe kloof heeft width_m nodig.

Voorinstellingen#

Gekozen en vermelde afmetingen (die van de ontwerpnotitie), geen opmetingen van een bestaande plek. kshana skyline --preset <name> toont er een met zijn herkomst en zijn grens per graad.

Voorinstelling Geometrie Herkomst
city-street Kloof: straat 0°, breedte 20 m, wanden 30 m en 30 m, antenne 1,5 m. 70,7° dwars op de straat, open langs de straat. Verhouding hoogte tot breedte 1,5, binnen de band van 0,5–2 voor de beeldverhoudingen van stratenkloven bij Oke (1988), Street design and urban canopy layer climate, Energy and Buildings 11, 103–113.
harbour-approach Sectoren: open naar zee over 090–270 (180°); kadegebouwen 8° over 315–045 (90°); de golfbreker en zijn licht 3° over 045–090 en 270–315. Vermelde keuzes (bijvoorbeeld pakhuizen van 40 m op ongeveer 285 m afstand).
fjord Terrein: wanden 600 m boven de antenne op 1500 m aan weerszijden van een noord-zuidkanaal, één punt per graad (op 1500/|sin az| m), met krommingsdaling toegepast. 21,8° dwars, onder 1° langs de as. Van de orde van grootte van de breedte en het reliëf van de diepe West-Noorse fjorden (Holtedahl (1967), Notes on the formation of fjords and fjord-valleys, Geografiska Annaler 49A, 193–203).
container-terminal Sectoren: containerstapels 12° over de landzijde 000–180; kraanbomen 35° over 245–255 en 25° over 285–295; elders open naar het water. Vijf ISO 668-high-cubecontainers (14,5 m) op ongeveer 60 m afstand van een antenne op 2 m hoogte; een giek op ongeveer 50 m boven de kade op 70 m en 100 m, van de orde van een post-Panamaxkraan. Een kraansector is ondoorzichtig.

In een scenario#

Een optionele sectie [skyline], boven de eigen elevatiegrens van de soort:

Type Wat de skyline verandert Per sample
orbit (met user_site) De zichtbaarheidstijdlijn (GNSS-beschikbaarheid) en de DOP-samenvatting. —
integrity (met user_site) De satellieten die RAIM en ARAIM (araim_dual) gebruiken. epochs[].masked_by_skyline
gnss-sim De satellieten waarvan de pseudoranges worden gesimuleerd en door RAIM worden gebruikt. gnss_measurements[].masked_by_skyline
jamming De satellieten die de ontvanger kan volgen, vóór de jammer. epochs[].masked_by_skyline
leo-pvt De set in zicht van elke modus boven het eigen masker van elk systeem, inclusief de polaire sweep (dezelfde skyline op elke locatie). De Doppler-modusenvelop en de ontworpen enkele passage zijn grenzen aan wat een ontvanger moet kunnen verwerken en behouden het masker van elk systeem. joint.epochs[].masked_by_skyline
leo-pass Welke epochs boven het masker tellen, de tijd erboven, de satellieten van de GNSS-vergelijking. satellites[].pass.epochs_masked_by_skyline
nmea-scenario (training-NMEA) De satellieten in GSV en in de positiebepaling. Azimuts zijn ware peilingen, vast aan de grond, niet de koers van het vaartuig. —

De grondlocatie van orbit en integrity. Beide soorten modelleren een gebruiker in een baan met een geocentrische elevatie en zonder aardvast azimut, dus ze nemen een skyline alleen aan met de grondlocatiemodus van de ontwerpnotitie: user_site = { lat_deg, lon_deg, height_m } in plaats van user (precies één van beide). Elk sample is één absoluut tijdstip, epoch + t: elke satelliet wordt ernaartoe gepropageerd (een elementenset, broadcast-efemeride of SP3-bestand wordt vanaf zijn eigen epoch voortgezet, een Walker-satelliet telt t vanaf epoch) en erop geroteerd naar aardvast, zodat de locatie één consistente hemel ziet. epoch is die van het baanscenario zelf; zonder (en altijd voor integrity, dat er geen heeft) is het de nieuwste epoch onder de satellieten die er een hebben, of J2000 voor alleen Walker-patronen. Elevatie en azimut zijn geodetisch (WGS-84). De horizontale en verticale splitsing van de ARAIM-beschermingsniveaus van de integriteitssoort en van de Stanford-verticale fout gebruikt dezelfde geodetische omhoogrichting (de normaal op de WGS-84-ellipsoïde, ongeveer 0,19° van de geocentrische radiaal op 45° breedte); snapshot-RAIM gebruikte die al. Een user_site zonder skyline is een gewone grondgebruiker; het pad van de user in een baan is ongewijzigd.

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

[skyline]
preset = "harbour-approach"

Achterwaartse compatibiliteit. Zonder sectie [skyline] is een scenario byte-identiek aan wat dezelfde engine gaf vóór er skylinecode bestond: tests/skyline_scenarios.rs controleert de JSON, de grafiek en de samenvatting van elk meegeleverd scenario dat een van deze soorten uitvoert, en de NMEA-tekst van elk trainingsscenario, tegen SHA-256-digests van de "0,36 portable"-basislijn (de digests van de releasecommit 0.35.0, opnieuw vastgesteld toen de engine overging op draagbare wiskunde en als vastlegging in de test bewaard: docs/revisions/STUDIO15-portable-math-rebaseline.md). Een lege sectie [skyline] snijdt niets; het resultaat is dan gelijk aan de run zonder haar, behalve het toegevoegde blok skyline en de nul-aantallen masked_by_skyline.

Wat wordt geweigerd, met de reden in de melding: een skyline op een user in een baan; user en user_site samen; een onbekende voorinstelling; een kloof zonder width_m; een tabel die niet strikt oplopend is in [0, 360); een elevatie buiten [0, 90); een lege sector; een niet-positieve terreinafstand; invoer boven de limieten; elke onbekende sleutel.

Het resultaat krijgt skyline: { source, open_fraction, provenance } erbij wanneer de sectie aanwezig is: source is preset:<name>, preset:<name>+overrides of custom; open_fraction is het aandeel van de ruimtehoek van het bovenste halfrond boven max(mask_deg, skyline) (het gemiddelde van 1 − sin(cut) over het azimut: 1 voor een nulmasker, 0,5 voor een vlakke grens van 30°); provenance is de regel van de voorinstelling of de eigen regel van het scenario. Eenheden en herkomstklassen staan in het blok units.

Meegeleverde voorbeelden (kshana example <name>):

Voorbeeld Wat het toont (verwijder de sectie [skyline] om te vergelijken)
orbit-urban-canyon-skyline GPS + Galileo onderaan city-street: 17 van 289 samples houden een positiebepaling, mediane PDOP 70,5 (1,14 onder open hemel).
integrity-harbour-approach ARAIM met twee constellaties bij het binnenvaren van een haven: 70 satelliet-epochs verborgen, beschikbaarheid ongewijzigd (145 van 145).
gnss-sim-container-terminal-skyline Pseudoranges en RAIM op een kade: 44 satelliet-epochs verborgen; RAIM-beschikbaarheid 0,59 (0,85 onder open hemel).
jamming-harbour-approach-skyline Een jammer van 2 W in een haven: 83 satelliet-epochs verborgen, tracking ongewijzigd (de jammer had ze al overgenomen).
leo-pvt-fjord-skyline GPS + Galileo + een LEO-laag in een fjord: mediane gefuseerde PDOP 1,14 (0,93 onder open hemel).
leo-vertical-autonomous-vehicle-skyline De kloof van leo-vertical-autonomous-vehicle als vlakke grens van 35° en als city-street gedraaid langs de koers van de auto: 8 tegen 4 tot 5 GPS- en Galileo-satellieten; gefuseerde gemiddelde fout 2,1 m in beide; het alarm van 1,5 m bij 51 % en 59 % van de epochs.

Hemelgeometrie#

Vijf enginefuncties (src/geometry.rs), op elk oppervlak dezelfde:

Functie Invoer → uitvoer
sky_geometry(request) per satelliet 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 (eenheidsvariantie), covariance_enu_m2; ellipse_1sigma en ellipse bij het gevraagde betrouwbaarheidsniveau; label, statement, advisory
sky_monte_carlo(request, seed, n) n (hoogstens 5000, een invoerlimiet) kleinstekwadratenfouten onder onafhankelijke Gauss-bereikfouten van σ_UERE uit een ChaCha8-stroom met seed seed: samples_enu_m, de empirische covariantie, horizontale en 3D-RMS naast σ_UERE × HDOP en σ_UERE × PDOP, het aandeel binnen de ellips van 95 %
skyline_presets() de voorinstellingen met label, beschrijving, herkomst, de grens per graad en open_fraction
skyline_profile(skyline) een skylinesectie teruggebracht tot de tabel met 360 items die de engine gebruikt, met source, provenance, open_fraction
skyplot_svg(request) de skyplot als statische SVG (geen script, geen externe verwijzing, elke invoerstring ge-escaped)

Een verzoek:

{
  "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 zijn de constellatievoorinstellingen van de engine (constellation-design met gps-baseline, galileo, beidou-meo, glonass, ...; de LEO-voorinstellingen xona-pulsar, iridium-stl, ...) of een volledige leo-pvt-tabel [[system]], gepropageerd naar time_s (Kepler met seculiere J2, de gezamenlijkemodusbanen van leo-pvt). Hun relatieve fasen komen uit verschillende referentie-epochs, dus de hemel is een representatieve geometrie, niet de hemel van die datum op die plek. Satellieten kunnen ook (of aanvullend) rechtstreeks worden opgegeven: "satellites": [{"id": "G05", "system": "GPS", "az_deg": 120, "el_deg": 35}, ...], of met "ecef_m": [x, y, z] en een site of user_ecef_m. Standaardwaarden: het eigen masker van elk systeem (5° GNSS, 10° LEO; 5° voor rechtstreeks opgegeven satellieten), één ontvangerklok per systeem ("common" voor één gedeelde klok), σ_UERE 1 m (een representatieve begrotingsregel voor twee frequenties), betrouwbaarheid 0,95. Invoerlimieten: hoogstens 2000 satellieten boven de horizon (een systeemtabel die er meer vraagt wordt geweigerd voordat hij wordt opgebouwd) en 16 ontvangerklokken.

Een gedateerde hemel uit elementensets. "tle" neemt tekst van two-line element sets aan (een naamregel vóór elke set is optioneel; hoogstens 4 MiB, een invoerlimiet), gepropageerd door de SGP4 van de engine (WGS-72, de propagator die orbit-real-tle gebruikt) naar "epoch" plus time_s, geroteerd naar aardvast met UT1 gelijkgesteld aan UTC en zonder poolbeweging, en gezien vanaf site. "epoch" is UTC ISO 8601 (2026-06-07T12:00:00Z) en dateert alleen de elementensets (de voorinstellingen dragen geen datum, dus een epoch zonder tle wordt geweigerd); "tle_system" labelt ze voor de klok per systeem (standaard TLE). Elk resultaat zegt welke hemel het is in sky_source en sky_statement:

sky_source De hemel
presets de constellatievoorinstellingen van de engine: een representatieve geometrie
tle-at-epoch de elementensets gepropageerd naar het vermelde epoch: de hemel die die elementensets op dat epoch geven, geen meting ervan (hun eigen nauwkeurigheid is die van SGP4 en de ouderdom van de sets)
tle-at-element-epoch geen epoch: de elementensets gepropageerd naar het eigen epoch van de nieuwste set plus time_s, een representatieve hemel
satellites rechtstreeks opgegeven satellieten, zoals vermeld

Een mix voegt ze samen met +. epoch_utc is het tijdstip waarnaar de elementensets zijn gepropageerd, en tle_skipped noemt wat van de tekst niet is gebruikt, met de reden: misvormde of verweesde regels van elementensets (met hun regelnummers), sets die de parser heeft geweigerd, en sets die SGP4 niet naar dat tijdstip kon propageren (vervallen, of voorbij hun grenzen); in totaal hoogstens 100 items, plus één laatste item dat de rest telt. Een lege lijst systems voegt geen voorinstellingen toe. De skyplot vermeldt de grondslag in zijn voettekst.

Eén kernel. De cofactormatrix is orbit::cofactor_from_los, de opbouw van de ontwerpmatrix en de Gauss-Jordan-inverse achter orbit::dop. orbit::dop_cov maakt de covariantie beschikbaar en orbit::dop is de reductie ervan, dus de VALIDATED scalairen zijn ongewijzigd en worden nog steeds vastgepind door tests/dop_reference.rs. Er is geen tweede DOP-implementatie.

De ellips. Halve assen k σ √λ voor de eigenwaarden λ van het oost-noordblok, met k = √(−2 ln(1 − p)) (√5.991 = 2.448 bij 95 %, 1 bij 39,35 %), en het azimut van de hoofdas ½ atan2(2 Q_EN, Q_NN − Q_EE) in [0, 180) vanaf noord.

Onderdeel Toegangspunten
CLI kshana sky <request.json|toml> of kshana sky --site <lat,lon[,h]> (--systems <a,b> | --tle <file>) [--epoch] [--tle-system] [--time] [--mask] [--skyline-preset] [--uere] [--clock], met --monte-carlo <n> --seed <s> of --svg; kshana skyline --preset <name> | --presets | --profile <file>
Rust kshana::geometry::{sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile, skyplot_svg}, kshana::surface::* met dezelfde namen
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, of skyline_preset); geen Monte Carlo via MCP (bulksamples die een agent moet samenvatten en niet moet meedragen)

Elk resultaat draagt label (MODELLED), de statement (geometrie onder een vermeld foutmodel: onafhankelijke, gelijke Gauss-bereikfouten met gemiddelde nul; geen voorspelling van de werkelijke fout van een ontvanger, die ook biases, multipath en non-line-of-sight-fouten heeft; geen integriteitsgrens) en de adviserende melding: Adviserende software, geen typegoedgekeurde navigatieapparatuur (IEC 61108, IEC 61162): de gezagvoerder of exploitant blijft verantwoordelijk voor de navigatie van het vaartuig.

Bewijs#

Vijf registerrijen (docs/VERIFICATION-MATRIX.md), zoals de ontwerpnotitie ze afbakent:

Rij Status Onafhankelijke referentie
Azimutafhankelijk skylinemasker: zichtbare verzameling, azimut en elevatie, en DOP onder het masker VALIDATED Orekit 12,2 (TopocentricFrame-kijkhoeken, ElevationMask) met gnss_lib_py 1.0.4 (get_dop en de DOP-matrix), vooraf vastgelegd in xval/orekit-skyline/PREREGISTRATION.md (commit e4b9d912) voordat een van beide was uitgevoerd: 1173 kijkhoeken op zes locaties en vier epochs, zes tabellen, 142 zichtbare sets; ongunstigste elevatie 1.3e-13°, azimut 2.3e-13°, masker 1.1e-12° tegen 1e-9°; identieke zichtbare sets, geen in de grensband; DOP 3.3e-13 relatief en cofactor 6.6e-13 van de matrixschaal tegen 1e-9. Bereik: tabelmaskers, geodetische kijkhoeken, de gemaskeerde set en haar DOP en cofactor met gemeenschappelijke klok.
Reducties van straatcanyon, sector en terrein tot een tabel MODELLED met de hand berekende waarden; de vergelijking hierboven leest hun tabellen als invoer en controleert ze niet
Skyline-voorinstellingen MODELLED geen: gekozen, vermelde afmetingen (alleen aan zichzelf getoetst)
Horizontale foutellips en cofactor per systeem uit de geometriecovariantie VALIDATED numpy 2.5.4 linalg.inv en linalg.eigh (standaard P2) op de 142 vastgelegde zichtbare sets, gemeenschappelijke klok en één klok per systeem, vooraf vastgelegd in xval/numpy-ellipse/PREREGISTRATION.md (commit 0bbeeaee): 270 gevallen, assen 5.1e-13 relatief, oriëntatie 5.3e-12°, cofactor 1.0e-12 van de matrixschaal, tegen 1e-9 en 1e-6°
Hemelgeometriefuncties MODELLED de samenstelling: propagatie van de voorinstelling naar een representatieve hemel, de Monte Carlo-wolk (gecontroleerd tegen de geometrie die hij bemonstert), de oppervlakken

De afwezigheid van een sectie [skyline] wordt byte voor byte gecontroleerd tegen de uitvoer van 0.35.0, wat achterwaartse compatibiliteit aantoont en niets aan een externe referentie toetst. gnss_lib_py past alleen één elevatiemasker toe, dus het is hier de onafhankelijke referentie voor DOP, niet voor het masker.

Wat een skyline niet modelleert: diffractie over een wandrand, reflecties en non-line-of-sight-signalen die een echte ontvanger nog kan tracken (ze worden verwijderd, niet verslechterd), gedeeltelijke doorzichtigheid (een traliekraan is ondoorzichtig over zijn sector), terrein voorbij de opgegeven punten, en de aardkromming binnen de vormen kloof en sector.