NMEA-harjoitusvirrat: kshana nmea-scenario
Merenkulkuakatemiat ja simulaattorikeskukset voivat syöttää Kshanan tuottamaa NMEA 0183 -dataa siltasimulaattoriin tai merikarttaplotteriin, jotta miehistöt oppivat tunnistamaan GNSS-häirinnän (jamming) ja harhautuksen (spoofing).
Vain harjoitus- ja testauskäyttöön. Tuotetut virrat ovat synteettisiä. Niitä ei saa koskaan syöttää aluksen todellisiin navigointijärjestelmiin. Kshana on ohjeellinen, ei tyyppihyväksytty navigointilaite. Jokainen virta alkaa ja toistaa kymmenen sekunnin välein oman merkkilauseensa
$PKSHT,TRAINING,SYNTHETIC,NOT-FOR-NAVIGATION, jonka vastaanottimet ohittavat; valitsin--no-markerpoistaa sen simulaattorista, joka hylkää tuntemattomat lauseet. Tämä kirjoittaa NMEA-vain tekstiä: RF-, IQ- tai aaltomuotolähtöä ei ole, eikä mikään lähetä muuta kuin tekstin nimeämääsi osoitteeseen.
Kuva on piirretty tiedoston scenarios/training/coastal-drag-off.toml ohjaajalokista.
Käyttö#
# write a file (default <name>.nmea) and the instructor log next to it
kshana nmea-scenario scenarios/training/coastal-drag-off.toml --out drag.nmea
# serve over TCP in real time on this machine only (waits for the simulator to connect)
kshana nmea-scenario scenarios/training/open-sea-jamming.toml --tcp 10110
# reachable from the bridge-simulator host: name the address in full
kshana nmea-scenario scenarios/training/open-sea-jamming.toml --tcp 192.168.1.20:10110
# UDP, one sentence per datagram, ten times faster than real time
kshana nmea-scenario scenarios/training/combined-event.toml --udp 192.168.1.50:10110 --speed 10
# UDP broadcast
kshana nmea-scenario scenarios/training/combined-event.toml --udp 192.168.1.255:10110 --broadcast
| Valitsin | Merkitys |
|---|---|
--out <file> |
kirjoita virta tiedostoon; ilman verkkolähtöä oletus on <name>.nmea |
--instructor-log <prefix> |
kirjoita <prefix>.instructor.json ja <prefix>.instructor.txt (oletus: tiedoston viereen) |
--tcp <addr:port> tai <port> |
TCP-palvelin; ajo alkaa, kun asiakas on yhdistänyt (--wait-clients <n>). Pelkkä portti kuuntelee vain osoitteessa 127.0.0.1 |
--udp <addr:port> tai <port> |
UDP, yksi lause per datagrammi; --broadcast sallii yleislähetysosoitteen. Pelkkä portti lähettää osoitteeseen 127.0.0.1 |
--realtime, --speed <x> |
säädä virran tahtia; --speed 0 tarkoittaa mahdollisimman nopeaa. Verkkolähtö käyttää oletuksena reaaliaikaa, tiedostot mahdollisimman nopeaa |
--seed <n> |
korvaa skenaarion siemenluku |
--no-marker |
jätä merkkilause pois |
Todennusta ei ole. TCP-palvelin, jolle on annettu ei-paikallinen osoite, tarjoaa virran kenelle tahansa, joka sen tavoittaa, ja UDP lähettää mihin tahansa nimeämääsi osoitteeseen. TCP-asiakas, joka ei ota dataansa vastaan kahden sekunnin kuluessa, pudotetaan, jotta yksi jumiin jäänyt kuluttaja ei pysäytä muita.
Sama siemenluku tuottaa samat tavut yhdellä alustalla, eikä tahdistus koskaan muuta tavuja. Alustojen välillä generaattorin oma aritmetiikka on bittitarkasti identtistä (se käyttää siirrettävää matematiikkakerrosta), mutta satelliittien paikat ja katselukulmat tulevat moottorifunktioista, jotka kutsuvat isännän matematiikkakirjastoa, joten harvinaisessa rajatapauksessa GSV:n pyöristetty korkeuskulma-, atsimuutti- tai C/N0-numero voi poiketa alustojen välillä.
Mitä kirjoitetaan#
Jokainen epookki (1, 2, 5 tai 10 sekunnissa) sisältää: RMC, GGA, GNS (paikkaratkaisu, paikka, aika), GSA (käytetyt satelliitit ja DOP, yksi per satelliittitähdistö), GSV (näkyvät satelliitit korkeuskulmineen, atsimutteineen ja SNR:ineen dB-Hz, yksi joukko per satelliittitähdistö, NMEA 4,10 -signaalitunnus), VTG (kurssi ja nopeus maan suhteen), ZDA (aika ja päivämäärä), HDT (gyrosuunta) ja VBW (nopeus veden ja maan suhteen lokista). Talker on GN, kun satelliittitähdistöjä on useita, muuten tähdistön oma. Rivit päättyvät CRLF:ään ja niiden tarkistussummat ovat kelvollisia.
HDT ja VBW edustavat riippumattomia antureita (gyrokompassi ja Doppler-loki). Mikään tapahtuma ei vaikuta niihin, mikä on tarkoituksellista: ero GNSS:n ilmoittaman ja gyron sekä lokin kertoman välillä on purun vihje.
Kun paikkaratkaisu menetetään, GGA-laatu on 0, RMC-tila on V, paikkakentät ovat tyhjiä ja aikakentät jatkuvat (vastaanottimen kello käy edelleen), kuten oikeilla vastaanottimilla.
Alus#
[vessel] ja [[waypoint]] antavat lähtöpaikan, nopeuden ja pisteet, joiden kautta ohjataan. Alus ohjataan kohti seuraavaa reittipistettä käännösnopeusrajan (max_rot_deg_per_min, oletus 30), käännösnopeuden kasvun rajan (max_rot_accel_deg_per_s2) ja nopeudenmuutosrajan (max_accel_kn_per_min) alaisena. Osuuden nopeus on reittipisteen speed_kn. [environment] lisää virran, jolloin nopeus maan suhteen eroaa nopeudesta veden suhteen ja suunta eroaa kurssista maan suhteen, sekä magneettisen poikkeaman. stop_at_end pysäyttää aluksen viimeiseen reittipisteeseen.
Satelliittigeometria#
Satelliitit tulevat moottorin omista nimellisistä satelliittitähdistöistä (GPS:n paikkataulukko, Galileon ja BeiDoun MEO-Walker-kuviot, GLONASS ICD), ja ne etenevät funktiolla constellation::satellite_positions_fixed (kahden kappaleen malli sekä sekulaarinen J2, Maan pyöriminen) ja näkyvät alukselta moottorin WGS-84-katselukulmilla. GSV:n näkyvien satelliittien määrä, korkeuskulmat ja atsimutit ovat uskottavia paikalle ja vuorokaudenajalle. Tämä on nimellinen taivas, ei virran päivämäärän efemeridi: PRN:t annetaan paikkajärjestyksessä ja jokainen satelliittitähdistö säilyttää julkaistun paikkajärjestelynsä, joka etenee jatkuvasti GPS-paikkataulukon epookista (2016-12-31) J2:n vaikutuksesta, joten järjestely säilyy ehjänä mutta sen suuntaus ei vastaa todellista taivasta virran päivämääränä. C/N0 seuraa korkeuskulmaa (nimellinen zeniittitaso, asetetaan kohdassa [receiver]) sekä kiinteää satelliittikohtaista poikkeamaa, hidasta häipymää ja kohinaa. Satelliitilla, joka on alle track_threshold_dbhz, SNR-kenttä on tyhjä; alle use_threshold_dbhz oleva satelliitti seurataan mutta sitä ei käytetä. Käytettäviä satelliitteja käytetään enintään max_used (oletus 12, NMEA GGA:n yläraja), ja ne valitaan geometrian perusteella (korkein satelliitti kussakin 30 asteen atsimuuttisektorissa ensin). Alle neljä käytettävää satelliittia menettää paikkaratkaisun, ja se palaa käytettävän signaalin reacquire_s jälkeen.
Tapahtumat#
Jokaisella tapahtumalla ([[event]]) on laji (kind), alkuhetki (start_s), kesto (duration_s, alkuhetkestä vapautuksen alkuun), alkunousu (ramp_s) ja vapautusnousu (recovery_s). Voimakkuus nousee lineaarisesti ajan ramp_s kuluessa, pysyy, ja laskee sitten ajan recovery_s kuluessa; arvo 0 on askel. Kaikki vaikutukset skaalautuvat tämän voimakkuuden mukana. Parametrit, jotka eivät kuulu lajiin, hylätään.
| laji | parametrit | vaikutus |
|---|---|---|
jamming |
cn0_drop_db, spread_db (oletus 6) |
jokaisen satelliitin C/N0 laskee enintään arvon cn0_drop_db verran (satelliittikohtainen hajonta), satelliitit putoavat pois heikoin ensin, paikkaratkaisu menetetään, kun käytettäviä on alle neljä, ja se palautuu vapautuksen ja arvon reacquire_s jälkeen |
drag-off |
final_offset_m, jompikumpi arvoista bearing_deg (todellinen) tai relative_bearing_deg (kurssiin alkuhetkellä, sitten pidetty), valinnaiset max_accel_mps2, counterfeit_cn0_dbhz |
vastaanotin pitää voimassa olevan paikkaratkaisun, jonka paikka etääntyy totuudesta; SOG ja COG sisältävät vedon. Veto noudattaa smoothstep-käyrää nousuissa, joten väärä reitti alkaa ja päättyy ilman nopeusaskelta; sen huiput ovat 1.5 D/T m/s ja 6 D/T^2 m/s neliössä nousulle T s matkalla D m (molemmat kirjataan lokiin), ja skenaario, joka ylittäisi arvon max_accel_mps2, hylätään. Askel (ramp_s = 0) siirtää paikkaa koskematta nopeuteen |
time-spoof |
offset_s, counterfeit_cn0_dbhz |
RMC-, GGA-, GNS- ja ZDA-aikaa siirretään todellisesta UTC:stä; paikka pysyy todellisena |
replay-delay |
delay_s, affect_time (oletus true), counterfeit_cn0_dbhz |
paikka, nopeus (ja aika) ovat aluksen vastaavat arvot ajalta delay_s sitten, kun viive noudattaa smoothstep-käyrää nousuissaan ja ilmoitettu nopeus skaalataan kertoimella 1 - d(delay)/dt viiveen muuttuessa: yksinkertaistettu, meaconing-tyylinen abstraktio, ei etenemismalli |
counterfeit_cn0_dbhz: kun drag-off, aikaharhautus tai toistoviive on aktiivinen, jokainen seurattu satelliitti näyttää tämän yhden korotetun tason, mikä on klassinen merkki. Jätä se pois hienovaraisesta tapahtumasta, jossa aito C/N0-kuvio säilytetään. Kun mikä tahansa väärennetty tapahtuma on aktiivinen, vastaanotin seuraa väärennettyä signaalia, joten häirintä ei pudota sitä; aiemman häirinnän vuoksi menetetty paikkaratkaisu palaa ajan reacquire_s jälkeen väärennetyllä signaalilla (ks. combined-event). Ajan muutos, joka pysäyttäisi ilmoitetun ajan tai panisi sen kulkemaan taaksepäin (nopeus 1 s sekunnissa tai enemmän), hylätään, ellei se ole askel (ramp_s = 0).
Tapahtumat voivat limittyä; niiden vaikutukset summautuvat (poikkeamat, ajan muutokset, viiveet) tai voimakkain jää voimaan (häirintä). Aikajanan onset on ensimmäinen epookki, jossa tapahtumalla on vaikutus, yksi epookki käsikirjoitetun start_s:n jälkeen, kun tapahtuma nousee asteittain.
Ohjaajan loki#
Virran rinnalla <prefix>.instructor.json ja <prefix>.instructor.txt antavat:
- tapahtumat sellaisina kuin ne syötettiin, selkokielellä kaikkine parametreineen, sekä niiden UTC-alkuhetken;
- aikajanan: alkuhetki, täysi vaikutus, palautuminen alkaa, palautunut sekä vastaanottimen oma
fix-lostjafix-regained; - todellisen reitin ja ilmoitetun reitin välein
log_interval_s: todellinen ja ilmoitettu paikka, nopeus ja kurssi, paikkavirhe metreinä, aikapoikkeama, käytetyt ja seuratut satelliitit, keskimääräinen C/N0 sekä aktiiviset tapahtumat; - todellisen ja ilmoitetun reitin huippunopeus ja -kiihtyvyys;
- skenaarion
trainer_note.
Näytä loki vasta purussa.
JSON-kentät (skeema kshana-nmea-training/1)#
| kenttä | tyyppi, yksikkö | merkitys |
|---|---|---|
schema |
merkkijono | kshana-nmea-training/1 |
warning |
merkkijono | vain harjoituskäyttöä koskeva lausuma |
scenario, description, trainer_note |
merkkijono | skenaariosta |
seed |
kokonaisluku | käytetty siemenluku |
start_utc |
ISO 8601 UTC | ajon alku |
duration_s |
s | ajon pituus |
summary.true_peak_sog_kn, summary.reported_peak_sog_kn |
solmua | suurin todellinen ja ilmoitettu nopeus maan suhteen |
summary.true_peak_accel_mps2, summary.reported_peak_accel_mps2 |
m/s neliössä | suurin nopeuden muutos sekunnissa, todellinen sekä peräkkäisten ilmoitettujen paikkaratkaisujen välillä |
events[] |
yksi per käsikirjoitettu tapahtuma | |
events[].id |
kokonaisluku | 1-pohjainen; käytetään kentissä timeline[].event ja track[].active_events |
events[].description |
merkkijono | selkokielinen kuvaus parametreineen |
events[].start_utc |
ISO 8601 UTC | käsikirjoitettu alkuhetki |
events[].parameters |
objekti | tapahtuma täsmälleen kirjoitettuna (kind, start_s, duration_s, ramp_s, recovery_s sekä lajin omat parametrit; puuttuvat jätetään pois) |
events[].resolved_bearing_deg |
astetta todellisessa suunnassa tai null | drag-off: käytetty suunta (suhteellinen suunta ratkaistaan alkuhetkellä) |
events[].peak_drag_speed_mps, events[].peak_drag_accel_mps2 |
m/s, m/s neliössä tai null | drag-off: huiput, jotka veto lisää väärälle reitille |
timeline[] |
puruun tarkoitetut hetket aikajärjestyksessä | |
timeline[].t_s, .utc |
s alusta, ISO 8601 UTC | milloin (todellinen aika) |
timeline[].event |
kokonaisluku tai null | tapahtuman tunnus; null vastaanottimen tilan muutoksille |
timeline[].what |
merkkijono | onset, full-effect, recovery-begins, recovered (tapahtumat); fix-lost, fix-regained (vastaanotin) |
timeline[].text |
merkkijono | selitys |
track[] |
yksi rivi per log_interval_s |
|
track[].t_s, .utc |
s, ISO 8601 UTC | milloin (todellinen aika) |
track[].true_lat_deg, .true_lon_deg |
astetta | todellinen paikka |
track[].true_sog_kn, .true_cog_deg, .true_heading_deg |
solmua, astetta todellisessa suunnassa | todellinen nopeus ja kurssi maan suhteen sekä gyrosuunta |
track[].fix_valid |
totuusarvo | vastaanotin ilmoitti paikkaratkaisun |
track[].reported_lat_deg, .reported_lon_deg, .reported_sog_kn, .reported_cog_deg |
astetta, solmua, astetta todellisessa suunnassa tai null | mitä vastaanotin ilmoitti; null paikkaratkaisun ollessa menetetty |
track[].position_error_m |
m tai null | vaakasuuntainen etäisyys todellisesta ilmoitettuun paikkaan |
track[].time_offset_s |
s | ilmoitettu UTC miinus todellinen UTC |
track[].n_used, .n_tracked |
kokonaisluvut | paikkaratkaisussa käytetyt ja seuratut satelliitit |
track[].mean_cn0_dbhz |
dB-Hz tai null | seurattujen satelliittien keskimääräinen C/N0 |
track[].active_events |
kokonaisluvut | niiden tapahtumien tunnukset, joilla on vaikutus tällä hetkellä |
Kentän lisääminen ei muuta skeematunnistetta. Kentän uudelleennimeäminen tai poistaminen tai kentän merkityksen tai yksikön muuttaminen kasvattaa numeroa (/2).
Skenaariokirjasto#
scenarios/training/, kukin muutaman minuutin matka, jonka TOML sisältää ohjaajan muistiinpanon:
| tiedosto | mitä se näyttää |
|---|---|
open-sea-jamming.toml |
C/N0 laskee kaikilla yhtä aikaa, satelliitit putoavat pois, paikkaratkaisu menetetään ja palaa |
coastal-drag-off.toml |
voimassa oleva, terveeltä näyttävä paikkaratkaisu vetäytyy 1,4 km rantaa kohti; tasaisesti korotettu C/N0 |
port-approach-time-spoof.toml |
paikka oikea, UTC ajautuu 45 s edelle hitaassa satamaan lähestymisessä |
combined-event.toml |
häirintä, sitten väärennetty ylitys drag-off-vedolla ja aikapoikkeamalla, sitten toistoviive |
fjord-natural-degradation.toml |
tukkeutunut taivas, ei häiriö: vuonon seinämät (REPRESENTATIVE-esiasetus fjord taivaanrantaprofiilille) peittävät satelliitit idässä ja lännessä, minkä jälkeen väylä aukeaa jälleen (tapahtuma natural-degradation, taulukolla skyline) |
Paikat, päivämäärät ja reitit ovat keksittyjä; kirjasto ei sisällä oikeaa alusta, toimijaa tai tallennetta. Se ei esitä mitään siitä, miten mikään vastaanotin tai järjestelmä suoriutuisi häiriötä vastaan.
Mallinnusvalinnat#
Generaattori on harjoitustyökalu ilman ulkoista oraakkelia, ja sen luvut ovat mallinnusvalintoja, eivät minkään vastaanottimen mittauksia. Ne on valittu näyttämään tavalliselta vastaanottimen lokilta: C/N0-kulmakerroin 14 dB zeniitistä horisonttiin zeniittitason alapuolella (oletus 47 dB-Hz) ja satelliittikohtainen poikkeama +/-1.5 dB, hidas häipyminen 0,8 dB 97 s:n yli ja 0,5 dB 31 s:n yli, 0,3 dB:n värinä; seurannan (20 dB-Hz) ja käytön (28 dB-Hz) kynnykset; paikkakohina (1,5 m arvolla HDOP 1, korreloitu 30 s:n ajan, pystysuunnassa kaksinkertainen); 0,05 asteen gyrokohina ja 0,03 solmun ajelehtimiskohina; 20 s:n ohjauksen aikavakio ja aluksen mallin reittipisteiden saapumissäteet; sekä satelliittien valinta atsimuuttisektoreittain. Oletukset ovat kohdissa [receiver] ja [vessel], ja ne kaikki voi muuttaa skenaariossa.
Lukeminen takaisin#
kshana receiver-trust osaa lukea nämä tiedostot (format = "nmea"). Testit tarkistavat jokaisen kirjastoskenaarion jokaisen lauseen sen omia kenttämäärä- ja tarkistussummasääntöjä vastaan ja ajavat tiedostot tämän lukijan läpi, joka tulkitsee GGA:n, RMC:n ja GSV:n ja ohittaa muut tyypit hylkäämättä yhtäkään. Testit lukitsevat kultaisen otteen skenaariota kohden (tests/fixtures/nmea_training/); luo ne uudelleen komennolla KSHANA_BLESS_GOLDEN=1 aiotun muutoksen jälkeen.