Maskinoversættelse, ikke gennemgået af en modersmålstalende. Engelsk er referencen.

Modtagertillid og maritimRedigér på GitHubKilde: docs/SKYLINE.md

Skylinemasker og himmelgeometri

Indtil 0,36 var hver sigtbarhedstest for Jorden i motoren ét elevationsafskæringspunkt, mask_deg: en satellit talte med, når den var på eller over ét tal, uanset sin retning. En gade, en kaj, en fjord eller en kran blokerer en del af himlen og lader resten stå åben. En skyline er et elevationsafskær, der afhænger af azimut; himmelgeometrifunktionerne omsætter et sted, et tidspunkt, konstellationer og en skyline til det synlige sæt, dilution of precision (DOP), geometrikovariansen, den horisontale fejlellipse, en Monte Carlo-sky og et skyplot. Udformningen er docs/design/2026-10-12-geometry-and-skyline-design.md (punkt 1 og 2).

Evidens: beslutningen om maskeret sigtbarhed (geodætiske sigtevinkler, tabelmasken, det synlige sæt og dets DOP) er VALIDATED mod Orekit 12,2 og gnss_lib_py 1.0.4 i en sammenligning, der er registreret på forhånd, og det samme gælder fejlellipsen og kofaktoren for hvert system (numpy, registreret på forhånd); reduktionerne for kløft, sektor og terræn, forudindstillingerne og resten af himmelgeometrifunktionerne er MODELLED (Evidens). En skyline fjerner satellitter i sigtelinjen og intet mere. Forudindstillingerne er REPRESENTATIVE geometrier, ikke opmålinger.

Horisontprofilen#

En horisontprofil er det punktvise maksimum af fire beskrivelser. Azimut er grader med uret fra sand nord i stedets lokale øst-nord-op-system; elevationer er i [0, 90).

Beskrivelse TOML Hvad det er
Tabel table = [[az, el], ...] Elevationer interpoleret lineært i azimut, ombrudt ved 360°. Azimutter strengt voksende i [0, 360); højst 3600 rækker.
Gadekløft street_az_deg, width_m, height_left_m, height_right_m, antenna_m, length_m To lige, parallelle vægge (nedenfor).
Sektorer sectors = [{ az_from, az_to, el_deg }] Skarpt afgrænsede intervaller, med uret fra az_from (inkluderet) til az_to (ekskluderet), som kan løbe gennem nord; højst 360.
Terræn terrain = [{ az, distance_m, height_m }] Punkter reduceret til en tabel: elevation atan((height_m − d²/(2 R_eff)) / d), med krumningsfaldet for R_eff = 4/3 × 6371 km (en valgt, angivet konstant). height_m er over antennen.

preset = "<name>" starter fra en navngiven geometri; kløftens felter tilsidesætter derefter forudindstillingens kløft felt for felt, og table, sectors og terrain føjes til den.

Modtagerens mask_deg bevarer sin betydning: den er en flad horisontprofil. Det effektive snit ved azimut az er max(mask_deg, skyline(az)), og en satellit er synlig, når dens elevation er ved eller over det: det samme >=, som den flade maske altid har brugt. En satellit over mask_deg men under horisontprofilen er skjult af horisontprofilen.

Gadekløften#

En gade løber langs azimut s, w meter mellem væggene, antennen a meter oppe på midterlinjen. Langs azimut az, med θ = az − s, når strålen en væg efter d(az) = (w/2) / |sin θ|, så en væg med højden h skærer ved

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

Den åbne strimmel ligger langs gaden. Med length_m = L (antennen på midten) forlader en stråle gaden gennem en åben ende, og væggen skærer intet, når d(az) · |cos θ| > L/2. En væg, der ikke er højere end antennen, skærer intet. antenna_m er som standard 1,5 m (et biltag eller en håndholdt modtager, et angivet valg); en ny kløft kræver width_m.

Forudindstillinger#

Valgte og angivne mål (designnotatets), ikke opmålinger af noget virkeligt sted. kshana skyline --preset <name> udskriver en med dens proveniens og dens snit for hver grad.

Forudindstilling Geometri Proveniens
city-street Kløft: gade 0°, bredde 20 m, vægge 30 m og 30 m, antenne 1,5 m. 70,7° på tværs af gaden, åben langs den. Forhold mellem højde og bredde 1,5, inden for båndet 0,5–2 af billedforhold for gadekløfter hos Oke (1988), Street design and urban canopy layer climate, Energy and Buildings 11, 103–113.
harbour-approach Sektorer: åben mod havet over 090–270 (180°); kajbygninger 8° over 315–045 (90°); bølgebryderen og dens fyr 3° over 045–090 og 270–315. Angivne valg (for eksempel 40 m lagerhaller omkring 285 m væk).
fjord Terræn: vægge 600 m over antennen i 1500 m afstand på hver side af en nord-syd-kanal, ét punkt pr. grad (ved 1500/|sin az| m), krumningsfald anvendt. 21,8° på tværs, under 1° langs aksen. Af samme størrelsesorden som bredden og relieffet i de dybe vestnorske fjorde (Holtedahl (1967), Notes on the formation of fjords and fjord-valleys, Geografiska Annaler 49A, 193–203).
container-terminal Sektorer: containerstakke 12° over den landvendte halvdel 000–180; kranbomme 35° over 245–255 og 25° over 285–295; ellers åben mod vandet. Fem ISO 668 high-cube-containere (14,5 m) omkring 60 m væk fra en antenne 2 m oppe; en bom omkring 50 m over kajen i 70 m og 100 m, af størrelsesordenen for en post-Panamax-kran. En kransektor er uigennemsigtig.

I et scenarie#

Et valgfrit afsnit [skyline], over typens egen afskæringsvinkel:

Type Hvad horisontprofilen ændrer Pr. sampel
orbit (med user_site) Synlighedstidslinjen (GNSS-tilgængelighed) og DOP-oversigten. —
integrity (med user_site) De satellitter, som RAIM og ARAIM (araim_dual) bruger. epochs[].masked_by_skyline
gnss-sim De satellitter, hvis pseudoafstande simuleres og bruges af RAIM. gnss_measurements[].masked_by_skyline
jamming De satellitter, modtageren kan følge, før jammeren. epochs[].masked_by_skyline
leo-pvt Hver tilstands synlige mængde over hvert systems egen maske, polarsvinget medregnet (den samme horisontprofil på hvert sted). Doppler-tilstandens omhylling og det udformede enkeltpassage er grænser for, hvad en modtager skal kunne håndtere, og beholder hvert systems maske. joint.epochs[].masked_by_skyline
leo-pass Hvilke epoker der tæller som over masken, tiden over den og GNSS-sammenligningens satellitter. satellites[].pass.epochs_masked_by_skyline
nmea-scenario (trænings-NMEA) Satellitterne i GSV og i positionsbestemmelsen. Azimutter er sande pejlinger fastlagt i forhold til jorden, ikke fartøjets kurs. —

Jordstedet for orbit og integrity. Begge typer modellerer en kredsende bruger med en geocentrisk elevation og uden jordfast azimut, så de tager kun en horisontprofil med designnotatets jordstedstilstand: user_site = { lat_deg, lon_deg, height_m } i stedet for user (nøjagtigt en af de to). Hvert sampel er ét absolut tidspunkt, epoch + t: hver satellit propageres til det (et elementsæt, en broadcast-efemeride eller en SP3-fil fremføres fra sin egen epoke, en Walker-satellit tæller t fra epoch) og roteres til jordfast ved det, så stedet ser én sammenhængende himmel. epoch er orbitscenariets egen; uden en (og altid for integrity, som ikke har nogen) er den den nyeste epoke blandt de satellitter, der har en, eller J2000 kun for Walker-mønstre. Elevation og azimut er geodætiske (WGS-84). Opdelingen i vandret og lodret af integritetstypens ARAIM-beskyttelsesniveauer og Stanfords lodrette fejl bruger den samme geodætiske opretning (WGS-84-ellipsoidens normal, omkring 0,19° fra den geocentriske radiale ved 45° bredde); snapshot-RAIM brugte den allerede. En user_site uden horisontprofil er en almindelig jordbruger; stien for den kredsende user er uændret.

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

[skyline]
preset = "harbour-approach"

Bagudkompatibilitet. Uden et afsnit [skyline] er et scenarie byte-identisk med, hvad den samme motor gav, før horisontprofilkoden fandtes: tests/skyline_scenarios.rs kontrollerer JSON, diagram og oversigt for hvert medfølgende scenarie, der kører en af disse typer, og NMEA-teksten for hvert træningsscenarie, mod SHA-256-digests af "0,36 portable"-baselinen (digests fra release-committen for 0.35.0, genberegnet, da motoren skiftede til portabel matematik, og bevaret i testen som optegnelsen: docs/revisions/STUDIO15-portable-math-rebaseline.md). Et tomt afsnit [skyline] skærer intet; resultatet er da lig med kørslen uden det bortset fra den tilføjede blok skyline og nul-tallene for masked_by_skyline.

Hvad der afvises, med årsagen i meddelelsen: en horisontprofil på en kredsende user; user og user_site sammen; en ukendt forudindstilling; en kløft uden width_m; en tabel, der ikke er strengt voksende i [0, 360); en elevation uden for [0, 90); en tom sektor; en ikke-positiv terrænafstand; input over lofterne; enhver ukendt nøgle.

Resultatet får skyline: { source, open_fraction, provenance }, når afsnittet er til stede: source er preset:<name>, preset:<name>+overrides eller custom; open_fraction er den andel af den øvre halvkugles rumvinkel, der ligger over max(mask_deg, skyline) (middelværdien af 1 − sin(cut) over azimut: 1 for en nulmaske, 0,5 for et fladt snit på 30°); provenance er forudindstillingens linje eller scenariets egen. Enheder og proveniensklasser står i blokken units.

Medfølgende eksempler (kshana example <name>):

Eksempel Hvad det viser (fjern afsnittet [skyline] for at sammenligne)
orbit-urban-canyon-skyline GPS + Galileo nederst i city-street: 17 af 289 sampler beholder en positionsbestemmelse, median-PDOP 70,5 (1,14 under åben himmel).
integrity-harbour-approach ARAIM med to konstellationer ved indsejling til en havn: 70 satellitepoker skjult, tilgængeligheden uændret (145 af 145).
gnss-sim-container-terminal-skyline Pseudoafstande og RAIM på en kaj: 44 satellitepoker skjult; RAIM-tilgængelighed 0,59 (0,85 under åben himmel).
jamming-harbour-approach-skyline En jammer på 2 W i en havn: 83 satellitepoker skjult, sporingen uændret (jammeren havde allerede taget dem).
leo-pvt-fjord-skyline GPS + Galileo + et LEO-lag i en fjord: median for fusioneret PDOP 1,14 (0,93 under åben himmel).
leo-vertical-autonomous-vehicle-skyline Kløften i leo-vertical-autonomous-vehicle som et fladt snit på 35° og som city-street drejet langs bilens kurs: 8 mod 4 til 5 GPS- og Galileo-satellitter; fusioneret middelfejl 2,1 m i begge; alarmen på 1,5 m ved 51 % og 59 % af epokerne.

Himmelgeometri#

Fem motorfunktioner (src/geometry.rs), de samme på alle flader:

Funktion Input → output
sky_geometry(request) pr. satellit 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 (enhedsvarians), covariance_enu_m2; ellipse_1sigma og ellipse ved den ønskede konfidens; label, statement, advisory
sky_monte_carlo(request, seed, n) n (højst 5000, et inputloft) mindste kvadraters fejl under uafhængige gaussiske afstandsfejl på σ_UERE fra en ChaCha8-strøm med seed seed: samples_enu_m, den empiriske kovarians, vandret og 3D-RMS ved siden af σ_UERE × HDOP og σ_UERE × PDOP, andelen inden for 95 %-ellipsen
skyline_presets() forudindstillingerne med etiket, beskrivelse, proveniens, snittet for hver grad og open_fraction
skyline_profile(skyline) et horisontprofilafsnit reduceret til den tabel med 360 poster, som motoren bruger, med source, provenance, open_fraction
skyplot_svg(request) skyplottet som statisk SVG (uden script, uden eksterne referencer, hver inputstreng escapet)

En forespørgsel:

{
  "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 er motorens konstellationsforudindstillinger (constellation-designs gps-baseline, galileo, beidou-meo, glonass, ...; LEO-forudindstillingerne xona-pulsar, iridium-stl, ...) eller en fuld leo-pvt-tabel [[system]], propageret til time_s (keplersk med sekulær J2, de fælles tilstandsbaner i leo-pvt). Deres indbyrdes faser stammer fra forskellige referenceepoker, så himlen er en repræsentativ geometri, ikke den dags himmel på det sted. Satellitter kan i stedet (eller også) angives direkte: "satellites": [{"id": "G05", "system": "GPS", "az_deg": 120, "el_deg": 35}, ...], eller med "ecef_m": [x, y, z] og et site eller user_ecef_m. Standardværdier: hvert systems egen maske (5° for GNSS, 10° for LEO; 5° for direkte angivne satellitter), ét modtagerur pr. system ("common" for ét fælles ur), σ_UERE 1 m (en repræsentativ budgetlinje for to frekvenser), konfidens 0,95. Inputlofter: højst 2000 satellitter over horisonten (en systemtabel, der beder om flere, afvises, før den bygges) og 16 modtagerure.

En dateret himmel ud fra elementsæt. "tle" tager tekst med to-linjers elementsæt (en navnelinje før hvert sæt er valgfri; højst 4 MiB, et inputloft), propageret af motorens SGP4 (WGS-72, den propagator som orbit-real-tle bruger) til "epoch" plus time_s, roteret til jordfast med UT1 sat lig UTC og uden polbevægelse, og set fra site. "epoch" er UTC ISO 8601 (2026-06-07T12:00:00Z) og dater kun elementsættene (forudindstillingerne har ingen dato, så en epoch uden tle afvises); "tle_system" mærker dem til uret pr. system (standard TLE). Hvert resultat angiver, hvilken himmel det er, i sky_source og sky_statement:

sky_source Himlen
presets motorens konstellationsforudindstillinger: en repræsentativ geometri
tle-at-epoch elementsættene propageret til den angivne epoke: den himmel, som disse elementsæt giver på den epoke, ikke en måling af den (deres egen nøjagtighed er SGP4's og sættenes alder)
tle-at-element-epoch ingen epoch: elementsættene propageret til det nyeste sæts egen epoke plus time_s, en repræsentativ himmel
satellites satellitter angivet direkte, som angivet

En blanding forener dem med +. epoch_utc er det tidspunkt, elementsættene blev propageret til, og tle_skipped angiver, hvad af teksten der ikke blev brugt, med årsagen: forkerte eller forældreløse elementsætlinjer (med deres linjenumre), sæt som parseren afviste, og sæt som SGP4 ikke kunne propagere til det tidspunkt (henfaldet eller uden for sine grænser); højst 100 poster i alt, derefter en sidste post, der tæller resten. En tom liste systems tilføjer ingen forudindstillinger. Skyplottet angiver grundlaget i sin fod.

Én kerne. Kofaktormatricen er orbit::cofactor_from_los, designmatrixens opbygning og Gauss-Jordan-inversen bag orbit::dop. orbit::dop_cov udstiller kovariansen, og orbit::dop er dens reduktion, så de VALIDATED skalarer er uændrede og stadig fastholdt af tests/dop_reference.rs. Der er ingen anden DOP-implementering.

Ellipsen. Halvakser k σ √λ for egenværdierne λ af øst-nord-blokken, med k = √(−2 ln(1 − p)) (√5.991 = 2.448 ved 95 %, 1 ved 39,35 %), og hovedaksens azimut ½ atan2(2 Q_EN, Q_NN − Q_EE) i [0, 180) fra nord.

Flade Indgangspunkter
CLI kshana sky <request.json|toml> eller kshana sky --site <lat,lon[,h]> (--systems <a,b> | --tle <file>) [--epoch] [--tle-system] [--time] [--mask] [--skyline-preset] [--uere] [--clock], med --monte-carlo <n> --seed <s> eller --svg; kshana skyline --preset <name> | --presets | --profile <file>
Rust kshana::geometry::{sky_geometry, sky_monte_carlo, skyline_presets, skyline_profile, skyplot_svg}, kshana::surface::* med de samme navne
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, eller skyline_preset); ingen Monte Carlo over MCP (bulkdata, som en agent bør opsummere, ikke bære)

Hvert resultat bærer label (MODELLED), statement (geometri under en angiven fejlmodel: uafhængige, ens, middelværdinulstillede gaussiske afstandsfejl; ikke en forudsigelse af en modtagers virkelige fejl, som også har bias, flervejsudbredelse og fejl fra manglende sigtelinje; ikke en integritetsgrænse) og den vejledende linje: Vejledende software, ikke typegodkendt navigationsudstyr (IEC 61108, IEC 61162): operatøren er fortsat ansvarlig for fartøjets navigation.

Evidens#

Fem registerrækker (docs/VERIFICATION-MATRIX.md), som designnotatet afgrænser dem:

Række Status Uafhængig reference
Azimutafhængig horisontmaske: synligt sæt, azimut og elevation samt DOP under masken VALIDATED Orekit 12,2 (TopocentricFrame pejlevinkler, ElevationMask) med gnss_lib_py 1.0.4 (get_dop og DOP-matricen), præregistreret i xval/orekit-skyline/PREREGISTRATION.md (commit e4b9d912), før nogen af dem blev kørt: 1173 pejlevinkler på seks steder og fire epoker, seks tabeller, 142 synlige sæt; værste elevation 1.3e-13°, azimut 2.3e-13°, maske 1.1e-12° mod 1e-9°; identiske synlige sæt, ingen i grænsebåndet; DOP 3.3e-13 relativt og kofaktor 6.6e-13 af matricens skala mod 1e-9. Omfang: tabelmasker, geodætiske pejlevinkler, den maskerede mængde og dens DOP og kofaktor med fælles ur.
Reduktion af gadekløft, sektorer og terræn til en tabel MODELLED håndberegnede værdier; sammenligningen ovenfor læser deres tabeller som input og kontrollerer dem ikke
Forudindstillinger for horisontprofil MODELLED ingen: valgte, angivne mål (kun kontrolleret mod dem selv)
Horisontal fejlellipse og kofaktor for hvert system ud fra geometriens kovarians VALIDATED numpy 2.5.4 linalg.inv og linalg.eigh (standard P2) på de 142 indskrevne synlige sæt, fælles ur og ét ur pr. system, præregistreret i xval/numpy-ellipse/PREREGISTRATION.md (commit 0bbeeaee): 270 tilfælde, akser 5.1e-13 relativt, orientering 5.3e-12°, kofaktor 1.0e-12 af matricens skala, mod 1e-9 og 1e-6°
Funktioner for himmelgeometri MODELLED sammensætningen: propagering af forudindstillinger til en repræsentativ himmel, Monte Carlo-skyen (kontrolleret mod den geometri, den samples fra) og fladerne

Fraværet af et afsnit [skyline] kontrolleres byte for byte mod outputtet fra 0.35.0, hvilket viser bagudkompatibilitet og ikke validerer noget. gnss_lib_py anvender kun én enkelt elevationsmaske, så den er den uafhængige reference for DOP her, ikke for masken.

Hvad en horisontprofil ikke modellerer: diffraktion over en vægkant, refleksioner og signaler uden sigtelinje, som en virkelig modtager stadig kan følge (de udelades, de forringes ikke), delvis gennemsigtighed (en gitterkran er uigennemsigtig over hele sin sektor), terræn ud over de angivne punkter og jordkrumning inde i kløft- og sektorformerne.