Vastaanottimen luottamus: todellisen GNSS-vastaanottimen lokin arviointi
kshana receiver-trust lukee todellisen maailmanlaajuisen satelliittinavigointijärjestelmän (GNSS) vastaanottimen lokin, ajaa sen yli luottamusvalvonnat epookki kerrallaan ja kertoo, milloin ja miksi vastaanottimen ratkaisusta tuli epäluotettava. Se voi myös pisteyttää lokin tapahtumia ja ennusteita vasten, jotka ilmoitat ennen ajoa: havaittiinko kukin tapahtuma ajoissa ja vastaako mallinnettu kantoaalto-kohinatiheyden (C/N0) lasku sitä, mitä vastaanotin mittasi.
Havaittavat suureet ovat vastaanottimen omia; valvonnat ja niiden kynnysarvot ovat moottorin ja sinun. Jokainen tulos kantaa tuon merkinnän, lokin SHA-256-tiivisteen ja jokaisen käytetyn kynnysarvon, joten ajon voi toistaa ja auditoida.
Matkalla olevalle alukselle, jossa on live-pistemäärä ja valinnainen portti karttajärjestelmän edessä, ks. MARITIME-TRUST.md.
Aja se#
kshana receiver-trust examples/receiver-trust/session.toml
Tämä kirjoittaa tiedostot session.result.json, session.trust.csv (yksi rivi epookkia kohti) ja session.trust.svg (keskimääräinen C/N0 ajan funktiona, luottamustila alla) skenaarion viereen ja tulostaa yksirivisen tuomion. Esimerkkiloki on synteettinen, tehty näyttämään muoto; osoita path oman vastaanottimesi lokiin.
Yllä oleva kuva on tiedoston MARITIME-TRUST.md alusdemo: keksitty loki, ohjeellinen pistemäärä.
Sama skenaario ajetaan Pythonista (kshana.receiver_trust(toml)), WebAssembly-paketista (receiver_trust(toml), loki sisällytettynä) ja Model Context Protocol (MCP) -palvelimen työkalusta assess_receiver_log.
Lokit, jotka se lukee#
format |
Lähde | Mitä luetaan |
|---|---|---|
ubx |
u-blox-binääri | NAV-SAT satelliittikohtainen C/N0, korkeuskulma ja atsimuutti, NAV-PVT-paikka, MON-RF automaattinen vahvistuksensäätö (AGC) ja häirintäindikaattori jamInd, NAV-TIMEGPS-viikko sekä vastaanottimen omat liput: NAV-STATUS spoofDetState ja SEC-SIG (self_report, ks. RECEIVER-PROTOCOLS.md) |
rinex |
RINEX 3 -havaintotiedosto | S-koodit (C/N0) satelliittia ja signaalia kohti; lähetetyn navigointitiedoston (nav) kanssa pseudoetäisyydet moottorin omaa ratkaisua varten |
android |
Android GnssLogger CSV | rivit Raw: C/N0 ja AgcDb satelliittia kohti; rivit Fix: paikka |
nmea |
NMEA 0183 -teksti | GSV signaali-kohinasuhde satelliittia kohti (dB-Hz, signaalitunnuksella 4,10 tai ilman) sekä sen korkeuskulma ja atsimuutti, GSA tarkkuuden heikkenemiskerroin ja käytetyt satelliitit, GGA ja RMC aika ja paikka |
sbf |
Septentrio-binääri (0,38, vain luku) | PVTGeodetic-paikka, MeasEpoch C/N0 satelliittia ja signaalia kohti, RFStatus-kaistamäärä; ks. RECEIVER-PROTOCOLS.md |
rtklib-pos |
RTKLIB-ratkaisutiedosto (.pos) |
aika, paikka (leveys-/pituusaste tai ECEF, muunnettuna) ja käytetyt satelliitit epookkia kohti; aste-minuutti-sekunti-tiedostot hylätään ilmoituksella |
novatel |
NovAtel OEM7 ASCII- tai binäärilokit | BESTPOS-paikka (vain lasketut ratkaisut), RANGE C/No satelliittia ja signaalia kohti; viestin RXSTATUS häirintälaitteen liput muuttuvat epookin kentäksi self_report (häirintätila 2, kun vastaanotin lippuaa häirintälaitteen, 1, kun ei; kentässä RXSTATUS ei ole harhautuslippua), asetettuna Kshanan hälytyksiä vasten vertailulla receiver-self-report |
gnss-sdr |
GNSS-SDR Monitor- ja PVT-monitor-virrat JSON-riveinä | kanavakohtainen C/N0, ratkaisu, käytetyt satelliitit, HDOP, atsimuutti ja korkeuskulma; tuottaa integrations/gnss-sdr/relay.py |
Näiden kolmen yksityiskohdat, lähteet ja rajat: MACHINE-INPUTS.md.
Jokainen lukijoiden tuottama epookki kantaa myös kentät source_span, [start, end) eli tavusiirtymät syötteeseen: pienin yhtenäinen alue, joka sisältää siihen vaikuttaneet tietueet, jotta tarkka raakaleike voidaan tiivistää tapahtumaikkunalle. NMEA: jokainen rivi, joka luetaan epookin ollessa voimassa (ylijoukko, jos asiaan kuulumaton rivi on sen lauseiden välissä). UBX: epookin kehykset. RINEX 3: epookkitietueet jokaisesta rivistä > seuraavaan. Android: epookin rivit Raw (rivi Fix vain epookille, jolla ei ole rivejä Raw). Puuttuu live-virralta ja kaikkialta, missä sitä ei ole hyvin määritelty (RINEX 2).
Tiedosto annetaan kentällä path (ratkaistaan skenaarion oman kansion suhteen) tai suoraan sisällytettynä kentällä text tai base64 (ainoat vaihtoehdot selaimessa).
IMU-loki toisena anturina#
[log.imu] lisää inertialokin samalle kellolle:
[log.imu]
format = "csv" # or "euroc"
path = "imu.csv" # or text / base64
heading0_deg = 90.0 # heading at the first IMU sample
yaw_axis_down = true # body z down (NED/FRD); false for z up (ENU/FLU)
time_offset_s = 0.0 # added to the IMU clock to reach the log's t_s
Kääntönopeus integroidaan kentästä heading0_deg ja se täyttää suuntiman kaikkialla, missä vastaanottimen loki ei sisällä sitä, joten valvonta heading-course (joka tarvitsee alustalle asetuksen heading_sensor = true) vertaa gyrosuuntimaa maahan nähden kulkemaan kurssiin. Gyro ajautuu: suuntima on vain niin hyvä kuin integrointi-ikkuna, ja hdg_cog_tol_deg ratkaisee, mikä lasketaan erimielisyydeksi. Muoto csv on dokumentoitu tiedostossa MACHINE-INPUTS.md. IMU-tavut ovat osa skenaariotiivistettä ja todistepaketin skenaariotiivistettä. Sisällytetty (text/base64) toimii kaikilla pinnoilla; path hylätään siellä, missä tiedostoja ei lueta.
Alusta: staattinen tai alus#
Yllä olevat valvonnat olettavat kiinteän antennin. Skenaario ilmoittaa alustan ennen ajoa ylätason taulussa [platform]; ilman sitä alusta on static eikä mikään muutu.
[platform]
kind = "vessel" # "static" (default) or "vessel"
max_speed_kn = 30.0 # default 30
max_accel_mps2 = 0.5 # default 0.5
max_turn_rate_dps = 6.0 # default 6
antenna_height_m = 18.0 # no default: without it the sea-level monitor does not run
heading_sensor = false # true: the stream carries a gyro heading (HDT or THS)
| Avain | Oletus | Miksi tämä arvo |
|---|---|---|
max_speed_kn |
30 | Kauppa-alusten ja useimpien matkustaja-alusten palvelunopeuden yläpuolella, joten todellinen alus ei koskaan saavuta sitä; selvästi alle nopeuden, jonka paikan vetäminen pois (drag-off) edellyttää. Hitaamman aluksen tulee ilmoittaa matalampi raja: mitä matalampi raja, sitä aiemmin vetäminen havaitaan. |
max_accel_mps2 |
0.5 | Suuri alus muuttaa nopeuttaan selvästi alle 0,1 m/s²; pieni nopea alus saavuttaa muutaman kymmenesosan voimakkaassa kaasunmuutoksessa. |
max_turn_rate_dps |
6 | Suuri alus kääntyy selvästi alle 1 astetta sekunnissa ja pieni alus jyrkässä käännöksessä muutaman. |
antenna_height_m |
ei mitään | Asennuksen ominaisuus; arvaus olisi piilotettu kynnysarvo. |
heading_sensor |
false | Ilmoitettu true ja lokista puuttuva on virhe, joten puuttuva anturi ei voi läpäistä puhtaana tarkistuksena. |
Alusavaimet hylätään tyypillä kind = "static". Alukselle valvontaa position-jump ei ajeta, koska se mittaa etäisyyttä kalibroinnin keskiarvosta, mikä on väärin liikkuvalle antennille; tuloksen monitor_config tallentaa alustan ja käytetyt rajat.
Synteettiset NMEA-virrat komennosta kshana nmea-scenario, tehty miehistön koulutukseen, NMEA-lukija hyväksyy, ja ne voi ajaa tämän tyypin läpi kuten minkä tahansa NMEA-lokin.
Valvonnat#
Jokainen valvonta tarvitsee datansa; valvontaa, jonka dataa ei ole lokissa, ei ajeta eikä sitä luetella kentässä monitors_run. Ensimmäiset calibration_s sekuntia (oletus 60) määrittävät lähtötason, eikä niiden aikana hälytetä koskaan.
| Valvonta | Hälyttää, kun | Tarvitsee |
|---|---|---|
cn0-drop |
lähtötason kanssa yhteisten satelliittien keskimääräinen C/N0 laskee arvon cn0_drop_db verran tai enemmän (oletus 6 dB) |
C/N0 |
loss-of-lock |
seurattuja satelliitteja on vähintään sats_lost vähemmän kuin lähtötason mediaani (oletus 4) |
C/N0 |
agc |
AGC-lukema poikkeaa lähtötasostaan yli agc_k_sigma keskihajontaa (oletus 5) |
UBX MON-RF tai Android AgcDb |
jam-ind |
u-blox-vastaanottimen arvo jamInd ylittää arvon jam_ind_threshold (oletus 80 / 255) |
UBX MON-RF |
position-jump |
vastaanottimen oma ratkaisu on yli position_jump_m päässä kalibroinnin keskiarvosta (oletus 50 m) |
ilmoitettu paikka |
raim |
moottorin oman yhden pisteen ratkaisun pariteettiin perustuva vastaanottimen autonominen eheyden valvonta (RAIM) hylkää mittausjoukon | RINEX-loki, jossa on nav |
solve-failure |
moottorin yhden pisteen ratkaisu epäonnistuu, vaikka satelliitteja on viisi tai enemmän | RINEX-loki, jossa on nav |
clock |
vastaanottimen kello poikkeaa ennustetusta enemmän kuin sen kalibrointikohinan pienin havaittava siirtymä | RINEX-loki, jossa on nav |
Kalibroitu profiili (valinnainen). [monitors] profile = "jammertest-2024-calibrated" korvaa kolme häiriökynnystä arvoilla, jotka on kalibroitu julkisella JammerTest 2024 -aineistolla (yksi u-blox ZED-F9P skenaariota kohti; Zenodo 15911589): cn0_drop_db = 1.5, agc_k_sigma = 3.5, jam_ind_threshold = 29. Kalibrointi ennakkorekisteröitiin (xval/jammertest-trust/PREREGISTRATION.md), ja profiili on MODELLED, sovitettu yhteen julkiseen kampanjaan: sen kynnys cn0_drop_db ei täyttänyt ennakkorekisteröityä holdout-kynnystä väärille hälytyksille (0,0231 vastaan 0,02); AGC- ja häirintäindikaattorikynnykset sekä yhdistelmäkynnys (väärät hälytykset 0,033, havaitseminen 0,81) täyttyivät (xval/jammertest-trust/RESULTS.md). Se pätee tälle vastaanotintyypille tässä tapahtumassa, ajastettuja hyökkäysjaksoja vasten, ja se kalibroitiin aineiston CSV-lokeilla (sen UBX-lokit antavat enemmän vääriä hälytyksiä kahdessa kansiossa). Profiililla ajettu tulos toistaa käytetyt kynnykset ja sisältää kentän profile_note, joka kertoo kaiken tämän. Ilman profiilia yllä olevat oletukset pätevät ja kaikki tulosteet ovat ennallaan.
Kun alusta on vessel, ajetaan myös liikkuvan alustan valvonnat (kynnykset ylätason taulussa [maritime], jokainen oletus dokumentoitu tiedostossa src/receiver_trust/maritime.rs); kukin tarvitsee datansa ja luetellaan kentässä monitors_run vain, kun se on tehnyt päätöksen:
| Valvonta | Hälyttää, kun | Tarvitsee |
|---|---|---|
kinematic |
paikan muutos on ristiriidassa ilmoitetun nopeuden ja kurssin kanssa tai viittaa nopeuteen, kiihtyvyyteen tai kääntönopeuteen, joka ylittää aluksen rajat | paikkaratkaisut; nopeus ja kurssi (RMC tai VTG) dead reckoning -osaa varten |
heading-course |
gyrosuuntima ja maahan nähden kulkema kurssi eroavat yli hdg_cog_tol_deg (nopeus yli min_speed_kn) |
HDT-, THS- tai VHW-suuntima, heading_sensor = true |
speed-log |
nopeus veden suhteen ja nopeus maahan nähden eroavat yli stw_sog_tol_kn |
VHW tai VBW sekä nopeus maahan nähden |
sea-level |
GGA-korkeus poikkeaa arvosta antenna_height_m yli sea_level_tol_m |
GGA-korkeus, antenna_height_m |
cn0-spread |
C/N0:n hajonta satelliittien yli laskee osuuteen cn0_spread_frac kalibroinnin mediaanistaan |
GSV |
cn0-rise |
yhteisten satelliittien C/N0 nousi keskimäärin cn0_rise_db ja niistä osuus cn0_rise_frac nousi |
GSV |
time-consistency |
peräkkäiset epookkiajat hyppivät epäsäännöllisesti, kulkevat taaksepäin tai poikkeavat isäntäkellosta | NMEA-aika; isäntäkello viimeistä osaa varten |
osnma |
vastaanotin ilmoittaa OSNMA-todennuksen epäonnistumisesta (ilmoitettu tila luetaan; mitään ei varmenneta; OSNMA:n varmentamiseksi suoraan I/NAV-sivuista ks. docs/OSNMA.md) | $PKSOS-tilalause |
Epookki on epäluotettava, kun RAIM, kellovalvonta, ratkaisun epäonnistuminen tai paikan hyppy hälyttää tai C/N0:n lasku saavuttaa kaksinkertaisen kynnyksensä; heikentynyt mistä tahansa muusta hälytyksestä; ja muuten nimellinen.
Moottoripolku (raim, solve-failure, clock) on sama laskenta kuin JammerTest 2024 -harhautusoraakkeli tiedostossa tests/jammertest_spoof_oracle_support: tests/receiver_trust_jammertest.rs tarkistaa, että kaikilla kahdeksalla julkaistulla alkuhetkellä ensimmäinen hälytys osuu samalle epookille ja on samaa lajia.
Luottamuspistemäärä (alustatyyppi vessel)#
Aluksen jokainen kalibroinnin jälkeinen epookki saa myös pistemäärän välillä 0–100 ja syyt siihen, miksi se ei ole 100. Kuvaus on deterministinen ja kiinnitetty ennen kuin yhtäkään lokia pisteytetään: ei oppimista, mitään ei sovitettu tapahtumiin. Kukin valvonta tiivistää todisteensa suhdeluvuksi statistic / threshold (hälytys arvolla 1 tai suuremmalla); suhdeluku maksaa pistemäärälle
points = weight * clamp((ratio - onset_ratio) / (full_ratio - onset_ratio), 0, 1)
score = round_to_0.1( clamp(100 - sum of points, 0, 100) )
joten valvonta ei maksa mitään, kun se on alle kynnyksensä osuuden onset_ratio (oletus 0,5), maksaa puolet painostaan kynnyksellään ja koko painonsa, kun arvo on full_ratio kertaa kynnys (oletus 1,5); pistemäärä ei kasva missään tunnusluvussa. Lähde, joka ei raportoi epookilla, säilyttää viimeisen tunnuslukunsa ajan evidence_hold_s (oletus 10 s: kaksi C/N0-lauseen sykliä, kun lause lähetetään 5 s välein), sekä hälytyksenä että vähennyksenä.
Pyöristys tehdään puolikkaasta ylöspäin (floor(x * 10 + 0.5) / 10), vyöhyke määräytyy pyöristetyn pistemäärän mukaan, ja rajaus tehdään ennen pyöristystä. Vain valvonnat, joiden pisteet ovat nollan yläpuolella, luetellaan vähennyksissä suhdelukuineen ja pyöristämättömine pisteineen, suurimmat pisteet ensin; yhtä suuret vähennykset luetellaan valvontojen nimien järjestyksessä cn0-drop, agc, jam-ind, loss-of-lock, position-jump, raim, clock, solve-failure, kinematic, heading-course, speed-log, sea-level, cn0-spread, cn0-rise, time-consistency, osnma, geometry. Valvonnalle, jonka testi on läpäisy tai hylkäys (epäonnistunut ratkaisu, epäonnistunut todennus), annetaan suhdeluku 1,5, eli täysi paino. Luetellut pisteet ovat rajausta 0 edeltäviä.
[score]
nominal_min = 90.0 # score >= 90: nominal
degraded_min = 55.0 # 55 <= score < 90: degraded; below 55: untrusted
onset_ratio = 0.5
full_ratio = 1.5
evidence_hold_s = 10.0
[score.weights] # overrides; a monitor not listed keeps its default
sea-level = 30.0
| Paino (pisteet) | Valvonnat | Miksi |
|---|---|---|
| 70 | osnma |
todennuksen epäonnistuminen on toteamus, ei tunnusluku |
| 60 | kinematic, raim, clock, position-jump, time-consistency |
väärennetyn paikan on oltava ristiriidassa fysiikan tai vastaanottimen omien tarkistusten kanssa, eikä aika voi kulkea taaksepäin; yksi rikkomus täydellä voimakkuudella (kun suure on 1,5 kertaa kynnys: 60 pistettä, pistemäärä 40) on epäluotettava, ja kynnyksellä (30 pistettä, pistemäärä 70) heikentynyt |
| 40 | heading-course, speed-log, solve-failure |
yksi riippumaton anturi eri mieltä on heikentynyt; kaksi täydellä voimakkuudella on epäluotettava |
| 30 | sea-level, cn0-spread, cn0-rise, cn0-drop |
signaaliympäristö tai heikosti informatiivinen tarkistus |
| 25 | loss-of-lock, agc, jam-ind |
ympäristö on vihamielinen; se yksin ei osoita, että ratkaisu on väärä |
enintään 15, [geometry] |
geometry (0.36) |
ei paino tässä rampissa: ei mitään, ellei taivas ole huono, silloin enintään cap_points (15); geometria yksin yltää heikentyneeseen tilaan, ei koskaan epäluotettavaan, eikä anna hälytystä (ks. alla ”Geometria”) |
Vyöhykkeiden rajat seuraavat painoista: kevyin hälyttävä valvonta maksaa 12,5 pistettä kynnyksellään, joten mikä tahansa hälytys jättää nimellisen vyöhykkeen; mikään yksittäinen valvonta alle 60 pisteen ei yksin yllä epäluotettavaan vyöhykkeeseen (useampi yhdessä voi). Tulos tallentaa pisteytysmallin (score_model) ja jokainen epookki kantaa kentän score.deductions: mitkä valvonnat vähensivät, niiden suhdeluvut ja pisteet. Aluksella epookin tila on sen pistemäärän vyöhyke.
Geometria: luonnollinen heikkeneminen erillään hyökkäyksen kaltaisesta ristiriitaisuudesta#
Laiturinosturin vieressä, sulkuammeessa tai korkean rungon alla oleva vastaanotin menettää satelliitteja ja sen ratkaisu huononee syystä, joka ei ole hyökkäys. Versiosta 0,36 alkaen, geometrian suunnittelumuistion (docs/design/2026-10-12-geometry-and-skyline-design.md, osio 4) mukaan, jokainen epookki kantaa satelliittigeometriansa, aluksen pistemäärässä on geometriavalvonta ja jokaisella vähennyksellä on luokka: geometry (taivas), environment (signaaliympäristö) tai inconsistency (hyökkäyksen kaltainen todiste).
Mistä geometria tulee. Kunkin seuratun satelliitin korkeuskulma ja atsimuutti (NMEA GSV, UBX NAV-SAT), joista tarkkuuden heikkenemiskerroin (DOP) johdetaan moottorin yhdellä DOP-ytimellä (orbit::dop, VALIDATED gnss_lib_py:tä vasten): source = derived. Jos se ei onnistu, vastaanottimen ilmoittama DOP ja käytetyt satelliitit (NMEA GSA): source = reported. Taivaan paikat ja GSA lasketaan pistemäärän ajaksi evidence_hold_s (oletus 10 s), koska monet väylät lähettävät GSV:n muutaman sekunnin välein; epookilla vajaaksi jäänyttä GSV-joukkoa (katkelman loppu, kadonnut lause) ei käytetä. Loki, jossa ei ole kumpaakaan, kuten NMEA, jossa on vain GGA ja RMC, tai tällä hetkellä Android- ja RINEX-lokit, saa tilan unknown ja huomautuksen ”geometry unknown”: moottori ei arvaa geometriaa, jota sille ei annettu, eikä geometriavalvontaa ajeta.
geometry.status |
Merkitys |
|---|---|
good |
riittävästi satelliitteja ja DOP kynnysten sisällä |
degraded |
yksi tai useampi syy: few-satellites, high-pdop, high-hdop ja (informatiivinen, ei pistemäärässä) sky-blocked, kun jokainen seurattu satelliitti on horisontin toisella puoliskolla |
unknown |
loki ei anna satelliittigeometriaa tälle epookille |
Tila on kuvaileva, ja pistemäärän kannalta merkitsevää on merkintä (alla): degraded sisältää informatiivisen tapauksen sky-blocked, joka voi esiintyä hyvän tai kohtalaisen DOP:n kanssa, ja pisteytetään vain merkintä poor.
Merkintä (raportoidaan aina, ei koskaan pisteytetä). Jokaisen epookin geometry.label on good (HDOP enintään hdop_good 2, PDOP enintään pdop_good 3 ja vähintään used_good 6 satelliittia), poor (HDOP yli hdop_max 4, PDOP yli pdop_max 6 tai alle min_used 5 satelliittia), fair näiden välillä tai unknown. Epookin huomautus alkaa aina merkinnällä ja luvuilla, esimerkiksi ”geometry fair: HDOP 1,105, PDOP 1,831, VDOP 1,410, 8 satellites; not scored (the score deducts only above HDOP 4, PDOP 6 or below 5 satellites)”, ja siihen lisätään ”, signal loss”, kun se pätee.
Geometriavalvonta (aluksen pistemäärä). Se vähentää ei mitään, ellei geometria ole huono: sen suhdeluku on max(hdop / hdop_max, pdop / pdop_max, min_used / n_used), ja niin kauan kuin se on enintään 1 (hyvä tai kohtalainen geometria, mukaan lukien 8 satelliitin vain GPS:n avoin taivas) se ei maksa mitään, joten tällainen loki saa täsmälleen saman pistemäärän kuin versiossa 0,35. Arvon 1 yläpuolella vähennys nousee lineaarisesti arvoon cap_points (15) kohdassa full_ratio (1,5 kertaa kynnykset: HDOP 6, PDOP 9, 3 satelliittia): 7,5 pistettä suhdeluvulla 1,25 (HDOP 5 tai 4 satelliittia), 15 arvosta 1,5 alkaen (pistemäärä 85, heikentynyt). Yksinään se ei voi koskaan viedä pistemäärää alle arvon floor (oletus: pistemäärän degraded_min, 55), joten geometria yksin yltää enintään heikentyneeseen vyöhykkeeseen eikä koskaan epäluotettavaan: voimassa oleva katto on min(cap_points, 100 - floor), joten taulu [score], joka nostaa arvoa degraded_min (esimerkiksi 0,35-taulu, jossa degraded_min 90), laskee katon arvoon 100 - degraded_min sen sijaan, että se hylättäisiin, ja arvo floor, joka asetetaan alle arvon degraded_min, hylätään. Valvonta ei anna hälytystä; se luetellaan viimeisenä kentässä monitors_run, kun se teki päätöksen millä tahansa epookilla (alus, jonka loki antaa geometrian), eikä sitä lasketa mukaan 0,35-identiteettiin; se ei ole kohta taulussa [score.weights] (sen asettaminen hylätään), ja voimassa oleva katto ja alaraja tallennetaan kenttiin geometry_model.cap_in_force ja geometry_model.floor_in_force. Huonon epookin huomautus kertoo syyn, esimerkiksi ”geometry poor: HDOP 5,200, PDOP 7,900, VDOP 4,100, 7 satellites; degraded by geometry: HDOP 5,200 above 4 (derived from 7 logged satellites); not an inconsistency”.
Luokat. Jokainen vähennys (score.deductions[].class):
| Luokka | Valvonnat |
|---|---|
geometry |
geometry (huono geometria); loss-of-lock, kun jokainen kalibroinnin lähtötasoa vasten menetetty satelliitti oli viimeisimmän raportin hetkellä alle arvon low_elev_deg |
environment |
cn0-drop, cn0-spread, cn0-rise, agc, jam-ind, loss-of-lock muuten; geometry signaalin menetyksen aikana (alla) |
inconsistency |
kinematic, heading-course, speed-log, sea-level, time-consistency, clock, raim, position-jump, osnma, solve-failure; ja geometry, kun geometria on huono ja ilmoitettu HDOP on ristiriidassa ilmoitetun taivaan kanssa (alla) |
Suoja väärennettyä huonoa taivasta vastaan. Harhauttaja voisi lähettää ohuen GSV:n tai ilmoittaa korkean HDOP:n ostaakseen toleranssia. Moottori merkitsee eikä anna anteeksi: mitään muuta tarkistusta ei väljennetä huonon geometrian vuoksi, ja vastaanottimen ilmoittamaa HDOP:ia (GSA pitoajan sisällä, muuten GGA) verrataan sen ilmoittamasta taivaasta johdettuun HDOP:iin. Kun ne eroavat enemmän kuin max(reported_vs_derived_tol, reported_vs_derived_rel × derived HDOP) (1,0 tai 25 % johdetusta HDOP:sta, sen mukaan kumpi on suurempi), epookki kantaa merkinnän reported_derived_mismatch: true ja, kun geometria on huono, sen vähennys luokitellaan inconsistency. Hyvällä tai kohtalaisella geometrialla ristiriita raportoidaan eikä pisteytetä: mitään ei vähennetä, ellei geometria ole huono. Tämä on harkittu valinta (0,36): ”nolla, ellei huono” pätee jokaiselle epookille, joten hyvä ja kohtalainen geometria pisteytetään täsmälleen kuten versiossa 0,35, eikä väärennetty HDOP ole koskaan äänetön. Lippu (reported_derived_mismatch) on tuloksen jokaisella epookilla ja jokaisella live-rivillä, huomautus sanoo ”…beyond the tolerance: reported, not scored (the geometry is not poor)” tai ”…: the geometry deduction is classed an inconsistency”, geometry_summary.hdop_mismatch laskee epookit, ja todisteiden yhteenvetosivu näyttää lukumäärän nolla mukaan lukien. Luku 25 % on REPRESENTATIVE suunnitteluvalinta, ei mitattu eikä standardin mukainen luku: vastaanotin, joka ratkaisee yhden kellon tähdistöä kohti tai seuraamiensa satelliittien osajoukolla (korkeuskulmamaski, C/N0-raja, RAIM-poissulkeminen), ilmoittaa HDOP:n, joka eroaa kaikkien seurattujen satelliittien yhden kellon HDOP:sta määrällä, joka kasvaa HDOP:n mukana, joten kiinteä toleranssi yksin tulkitsisi luonnollisen huonon geometrian ristiriitaisuudeksi. Suurempi ero tulkitaan yhä sellaiseksi. Luokan geometry vähennys on toteamus taivaasta, ei havainto siitä, ettei hyökkäystä tapahtunut.
Signaalin menetys ei ole taivas. Kun satelliitteja, jotka vastaanotin listaa näkyviin (yli low_elev_deg), ei seurata, moottori johtaa myös kaikkien näkyvien satelliittien DOP:n. Jos tämä näkyvien DOP on kynnysten sisällä ja joko mitään ei seurata tai seuraamattomat satelliitit ovat levittäytyneet horisontin ympärille (eivät rajoitu sen toiselle puoliskolle), taivas oli paikallaan ja signaali ei: epookki kantaa merkinnän signal_loss: true, huomautuksen ”satellites in view but not tracked: signal environment, not geometry”, ja geometriavähennys luokitellaan environment. Seuraamattomat satelliitit, jotka rajoittuvat horisontin toiselle puoliskolle, tulkitaan yhä estyneeksi taivaaksi (seinä, kallio, laituri). Kaksipuolinen este (kanjoni tai kapea fjordi) tulkitaan signaalin menetykseksi, kunnes horisonttiprofiili on määritetty. Vastaanottimen ei-ratkaisua ilmaisevat arvot eivät ole DOP:ia: ilmoitettu HDOP tai PDOP 99 tai enemmän, GGA-laatu 0 ja GSA-tila 1 eivät anna ilmoitettua DOP:ia.
Avain [geometry] |
Oletus | Alkuperä |
|---|---|---|
hdop_max |
4 | valittu (suunnittelumuistio 4,2): kun sigma_uere_m on 1,5 m, HDOP 4 on 2drms-arvo 12 m, eli kinemaattisen tarkistuksen kin_pos_tol_m. IEC 61108-1:n kerrotaan yleisesti esittävän tarkkuusvaatimuksensa HDOP:lle ≤ 4 (tai PDOP:lle ≤ 6): muistinvaraisesti GNSS-vastaanotinkirjallisuudesta, tiettyä toissijaista lähdettä ei tarkistettu eikä standardia ole luettu; tarkistettava standardin tekstistä |
pdop_max |
6 | PDOP-saatavuuskynnys kohteessa scenarios/polar-arctic-leo-coverage.toml; GPS SPS Performance Standard, 5. painos (2020), PDOP ≤ 6, kuten kohteessa tests/constellation_availability_published_spec_oracle.rs siteerataan; tarkistettava standardin tekstistä |
min_used |
5 | yksi enemmän kuin ratkaisu tarvitsee, jotta yksittäinen menetys ei lopeta ratkaisua; vähimmäismäärä, jolla RAIMille jää yksi ylimääräinen mittaus |
sigma_uere_m |
1.5 | ilmoitettu syöte 2drms-linkille arvon hdop_max kanssa; aseta vastaanottimen oma luku |
reported_vs_derived_tol |
1,0 HDOP | valittu (suunnittelumuistio 4,2): toleranssin absoluuttinen osa; toleranssin ylittävä ristiriita ei ole geometriaa |
reported_vs_derived_rel |
0.25 | REPRESENTATIVE suunnitteluvalinta: suhteellinen osa vastaanottimille, joilla on tähdistökohtaiset kellot tai osajoukkoratkaisut |
low_elev_deg |
15 | suunnittelumuistio 4,3: sen alle menetetyt satelliitit on menetetty taivaalle; horisonttiprofiili (0,36 kohta 1) laajentaa tätä |
azimuth_gap_deg |
180 | geometrinen, informatiivinen: jokainen satelliitti horisontin toisella puoliskolla |
cap_points |
15 | suunnittelumuistio 4,2: geometria yksin siirtää pistemäärän nimellisestä heikentyneeseen eikä koskaan epäluotettavaan; vähennetään vain, kun geometria on huono (perustajan päätös B1, 0,36) |
full_ratio |
1.5 | pistemäärän oma full_ratio: ramppi yltää arvoon cap_points kohdassa 1,5 kertaa huonon geometrian kynnykset |
floor |
pistemäärän degraded_min (55) |
geometria yksin ei koskaan yllä epäluotettavaan vyöhykkeeseen; voimassa oleva katto on min(cap_points, 100 - floor); alle arvon degraded_min asetettu alaraja hylätään |
hdop_good |
2 | REPRESENTATIVE, vain merkintä: puolet arvosta hdop_max (0,35-pistemäärän alkusuhde) |
pdop_good |
3 | REPRESENTATIVE, vain merkintä: puolet arvosta pdop_max |
used_good |
6 | REPRESENTATIVE, vain merkintä: yksi enemmän kuin min_used, jotta yksittäinen menetys jättää silti ylimääräisen mittauksen |
Mikä tulosteissa muuttui ja mikä ei. Mikään pistemäärä ei muutu, ellei geometria ole huono; merkintä raportoidaan aina. Lisätyt avaimet: epochs[].geometry (status, reasons, source, n_used, hdop, pdop, vdop pyöristettynä arvoon 0,001, open_fraction (null, kunnes horisonttiprofiili on määritetty), max_azimuth_gap_deg, age_s, reported_hdop, reported_derived_mismatch, note, in_view (satelliitit, jotka on listattu yli arvon low_elev_deg), signal_loss, label), class jokaisella vähennyksellä ja lopussa geometry_model (kynnykset, pito, voimassa oleva katto ja alaraja, alkuperätiedot, luokkasäännöt) ja geometry_summary (epookit tilan, merkinnän ja vähennysluokan mukaan sekä epookit, joilla ilmoitettu HDOP on ristiriidassa); score_model.weights on kuten versiossa 0,35. Kaksi testiä sitoo tämän tavuihin asti ”0,36 portable” -vertailuversioon, kun nämä avaimet on poistettu (versioiden 0.35.0 tiivisteet, uudelleenperustettu, kun moottori siirtyi siirrettävään matematiikkaan ja säilytetty testeissä merkkinä siitä, mitä 0.35.0 julkaisi: docs/revisions/STUDIO15-portable-math-rebaseline.md). tests/geometry_trust_no_change.rs sitoo kaikki molempien esimerkki-istuntojen tulosteet (tulos-JSON, CSV, SVG, tuomio, toistetut live-rivit, $PKSHT, Prometheus, CEF, LEEF). tests/geometry_corpus_identity.rs sitoo jokaisen tallennetun aluksen NMEA-korpuksen erätuloksen, yhteenvedon, live-rivit ja $PKSHT (demon ja merellisen käytön vertailutestiaineistot, kukin myös vain GPS:n avoimena taivaana 8 satelliitilla, sekä siemenluvuistaan generoidut miehistön koulutusskenaariot); niissä kahdessa koulutusskenaariossa, joiden häirintä tekee geometriasta huonon, jokainen epookki, joka ei ole huono, on identtinen ja jokainen huono eroaa pelkän geometriavähennyksen verran. Loki, jonka geometria on huono, menettää enintään 15 pistettä, joita se ei menettänyt versiossa 0,35; se on tarkoitettu muutos. Demossa drag-off tulkitaan inconsistency; tests/geometry_trust.rs muokkaa lokia peittämään läntisen taivaan (kohtalainen: merkitty, ei pisteytetty), peittämään sen ja kaksi itäistä satelliittia (huono: geometriavähennykset, lukituksen menetys environment, koska myös korkeat satelliitit katosivat), menettämään vain satelliitit alle 15° (lukituksen menetys geometry) ja ilmoittamaan HDOP:n, jota taivas ei selitä (huonon geometrian vähennyksestä tulee inconsistency). Kynnykset ovat MODELLED: valittu, ei sovitettu mihinkään lokiin; mikään tässä ei väitä, kuinka usein luonnollinen heikkeneminen ja hyökkäykset erotetaan toisistaan todellisessa datassa.
Tapahtumien ja ennusteiden ilmoittaminen#
[[events]]
label = "jammer on"
kind = "jamming" # jamming, spoofing or other
onset_s = 120.0 # seconds since the first epoch of the log
end_s = 240.0 # optional; otherwise onset_s + compare.horizon_s
predicted_cn0_drop_db = 12.0 # optional, e.g. from a `jamming` scenario's link budget
[compare]
detect_tol_s = 10.0 # an alarm this soon after onset counts as a detection
cn0_tol_db = 3.0 # predicted and observed drops agree within this
Kustakin tapahtumasta tulos antaa väärät hälytykset kalibroinnin ja alkuhetken välillä, ensimmäisen hälytyksen ja sen valvonnat, viiveen, lopputuloksen (detected, late, missed tai not-evaluable) sekä havaitun C/N0:n laskun mediaanin ennustetta vasten (agree, disagree, no-prediction tai not-evaluable). Ristiriita raportoidaan, sitä ei koskaan viritetä pois: toleranssit ovat skenaariossa, ja skenaario on tuloksen tiivisteessä.
Mitä tämä ei väitä#
Luottamusvalvonnat ovat MODELLED: niiden kynnykset ovat syötteitä, ja niiden havaitsemiskyky todellisessa häiriössä on se, mitä tapahtumapisteytys mittaa, ei jotain, mitä tämä tyyppi väittää. JammerTest 2024 -harhautusistunnoissa moottoripolun valvonnat saavat osan alkuhetkistä kiinni 10 s:n sisällä ja ovat myöhässä toisilla; luvut ks. rivi ”Clock-aided χ², RAIM, AGC, SQM fused per-epoch security FoM” tiedostossa VERIFICATION-MATRIX.md. Ennuste, joka on sopusoinnussa yhden lokin kanssa, on yksi datapiste, ei validointi.