NMEA treeningvoogud: kshana nmea-scenario
Merendusakadeemiad ja simulaatorikeskused saavad söötta Kshana loodud NMEA 0183 laevasimulaatorisse või kaardiplotterisse, et õpetada meeskondi GNSS-i segamist ja spuufimist ära tundma.
Ainult treeninguks ja testimiseks. Loodud voogud on sünteetilised. Neid ei tohi kunagi söötta laeva elavatesse navigatsioonisüsteemidesse. Kshana on nõuandev, mitte tüübikinnitust omav navigatsiooniseade. Iga voog algab omaette märgilausega
$PKSHT,TRAINING,SYNTHETIC,NOT-FOR-NAVIGATIONja kordab seda iga kümne sekundi järel; vastuvõtjad ignoreerivad seda;--no-markereemaldab selle simulaatori jaoks, mis lükkab tundmatud laused tagasi. See kirjutab ainult NMEA teksti: RF-, IQ- ega lainekujuväljundit ei ole ja midagi ei edastata peale teksti aadressile, mille nimetate.
Joonis on joonistatud faili scenarios/training/coastal-drag-off.toml õppejõu logist.
Kasutus#
# 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
| Valik | Tähendus |
|---|---|
--out <file> |
kirjuta voog faili; kui võrguväljundit ei ole, on vaikeväärtus <name>.nmea |
--instructor-log <prefix> |
kirjuta <prefix>.instructor.json ja <prefix>.instructor.txt (vaikimisi: faili kõrvale) |
--tcp <addr:port> või <port> |
TCP-server; käitamine algab, kui klient on ühendunud (--wait-clients <n>). Üksik port kuulab ainult aadressil 127.0.0.1 |
--udp <addr:port> või <port> |
UDP, üks lause datagrammi kohta; --broadcast lubab leviaadressi. Üksik port saadab aadressile 127.0.0.1 |
--realtime, --speed <x> |
voo tempo; --speed 0 on nii kiiresti kui võimalik. Võrguväljundi vaikeväärtus on reaalaeg, failidel nii kiiresti kui võimalik |
--seed <n> |
asenda stsenaariumi algväärtus |
--no-marker |
jäta märgilause välja |
Autentimist ei ole. TCP-server, millele on antud mittekohalik aadress, serveerib voogu igaühele, kes sellele ligi pääseb, ja UDP saadab ükskõik millisele aadressile, mille nimetate. TCP-klient, mis ei võta oma andmeid kahe sekundi jooksul vastu, jäetakse välja, nii et üks soiku jäänud tarbija ei saa teisi kinni hoida.
Sama algväärtus annab ühel platvormil samad baidid ja tempo ei muuda kunagi baite. Platvormide vahel on generaatori enda aritmeetika bitthaaval identne (see kasutab teisaldatavat matemaatikakihti), kuid satelliitide asukohad ja vaatenurgad tulevad mootori funktsioonidest, mis kutsuvad hosti matemaatikateeki, seega võib haruldasel piirjuhul GSV-s ümardatud kõrgusnurga, asimuudi või C/N0 numbrikoht platvormide vahel erineda.
Mida kirjutatakse#
Iga epohh (1, 2, 5 või 10 sekundis) kannab: RMC, GGA, GNS (fiks, asukoht, aeg), GSA (kasutatud satelliidid ja DOP, üks konstellatsiooni kohta), GSV (nähtavad satelliidid koos kõrgusnurga, asimuudi ja SNR-iga dB-Hz-des, üks komplekt konstellatsiooni kohta, NMEA 4,10 signaali ID), VTG (kurss ja kiirus maa suhtes), ZDA (aeg ja kuupäev), HDT (güroskoobi suund) ja VBW (vee- ja maakiirus logilt). Talker on GN mitme konstellatsiooni korral, muidu konstellatsiooni enda oma. Read lõpevad CRLF-iga ja on kontrollsumma poolest kehtivad.
HDT ja VBW esindavad sõltumatuid andureid (güroskoopkompass ja Doppleri logi). Ükski sündmus neid ei puuduta, mis on tahtlik: vahe selle vahel, mida GNSS teatab, ja selle vahel, mida güro ja logi ütlevad, on arutelu vihje.
Kui fiks kaob, on GGA kvaliteet 0, RMC olek V, asukohaväljad on tühjad ja ajaväljad jätkuvad (vastuvõtja kell käib edasi), nagu päris vastuvõtjatel.
Laev#
[vessel] ja [[waypoint]] annavad alguspunkti, kiiruse ja punktid, mille kaudu suunata. Laeva suunatakse järgmise teekonnapunkti poole pöördekiiruse piirangu (max_rot_deg_per_min, vaikimisi 30), piirangu all selle kohta, kui kiiresti pöördekiirus kasvab (max_rot_accel_deg_per_s2), ja kiiruse muutmise piirangu (max_accel_kn_per_min) all. Lõigu kiirus on teekonnapunkti speed_kn. [environment] lisab hoovuse, nii et maa suhtes kiirus erineb veekiirusest ja suund erineb kursist maa suhtes, ning magnetilise deklinatsiooni. stop_at_end peatab laeva viimasel teekonnapunktil.
Satelliidigeomeetria#
Satelliidid tulevad mootori enda nominaalsetest konstellatsioonidest (GPS-i pesatabel, Galileo ja BeiDou MEO Walkeri mustrid, GLONASS ICD), levitatuna funktsiooniga constellation::satellite_positions_fixed (kahekeha pluss sekulaarne J2, Maa pöörlemine) ja nähtuna laevalt mootori WGS-84 vaatenurkadega. GSV-s olevad nähtavate arv, kõrgusnurgad ja asimuudid on koha ja kellaaja jaoks usutavad. See on nominaalne taevas, mitte voo kuupäeva efemeriid: PRN-id määratakse pesa järjekorras ja iga konstellatsioon säilitab oma avaldatud pesapaigutuse, levitatuna pidevalt GPS-i pesatabeli epohhist (2016-12-31) J2 all, seega on paigutus terve, kuid selle orientatsioon ei ole päris taeva oma voo kuupäeval. C/N0 järgib kõrgusnurka (nominaalne seniiditase, seatud failis [receiver]), fikseeritud satelliidipõhise nihkega, aeglase tuhmumise ja müraga. Satelliidil alla track_threshold_dbhz on SNR-väli tühi; alla use_threshold_dbhz jälgitakse, kuid ei kasutata. Kuni max_used (vaikimisi 12, NMEA GGA lagi) kasutatavat satelliiti kasutatakse, valituna geomeetria põhjal (igas 30 kraadises asimuudisektoris esmalt kõrgeim satelliit). Vähem kui neli kasutatavat satelliiti kaotab fiksi ja see naaseb pärast reacquire_s kasutatavat signaali.
Sündmused#
Igal [[event]] on kind, alguse start_s, duration_s (algusest vabastuse alguseni), alguse tõusuramp ramp_s ja vabastuse ramp recovery_s. Tugevus tõuseb lineaarselt üle ramp_s, püsib, siis langeb üle recovery_s; 0 on aste. Kõik mõjud skaleeruvad selle tugevusega. Parameetrid, mis ei kuulu liigile, lükatakse tagasi.
| liik | parameetrid | mõju |
|---|---|---|
jamming |
cn0_drop_db, spread_db (vaikimisi 6) |
iga satelliidi C/N0 langeb kuni cn0_drop_db võrra (satelliidipõhine hajuvus), satelliidid langevad välja madalaimast alates, fiks kaob, kui kasutatavaid on alla nelja, ja taastub pärast vabastust ja reacquire_s |
drag-off |
final_offset_m, üks väärtustest bearing_deg (tõene) või relative_bearing_deg (kursini alguses, siis hoitud), valikuline max_accel_mps2, counterfeit_cn0_dbhz |
vastuvõtja säilitab kehtiva fiksi, mille asukoht kõnnib tõest eemale; SOG ja COG sisaldavad eemaletõmmet. Eemaletõmme järgib ramplitel smoothstepi, seega vale rada algab ja lõpeb ilma kiirusastmeta; selle tipud on 1.5 D/T m/s ja 6 D/T^2 m/s ruudus rampi T s korral üle D m (mõlemad logitud), ja stsenaarium, mis ületaks max_accel_mps2, lükatakse tagasi. Aste (ramp_s = 0) liigutab asukohta kiirust puudutamata |
time-spoof |
offset_s, counterfeit_cn0_dbhz |
RMC, GGA, GNS ja ZDA aeg nihutatakse tõelisest UTC-st; asukoht jääb tõeseks |
replay-delay |
delay_s, affect_time (vaikimisi true), counterfeit_cn0_dbhz |
asukoht, kiirus (ja aeg) on laeval delay_s tagasi olnud; viivitus järgib tõusude ajal sujuvat astmefunktsiooni (smoothstep) ning teatatud kiirust skaleeritakse teguriga 1 - d(delay)/dt, kuni see muutub: lihtsustatud, meaconing-laadne abstraktsioon, mitte levimudel |
counterfeit_cn0_dbhz: kui drag-off, aja spuufimine või taasesituse viivitus on aktiivne, näitab iga jälgitav satelliit seda üht tõstetud taset, mis on klassikaline tunnus. Peene sündmuse korral, kus säilitatakse tegelik C/N0 muster, jäetakse see ära. Kuni mis tahes võltssündmus on aktiivne, järgib vastuvõtja võltssignaali, mistõttu segamine seda ei katkesta; varasema segamise tõttu kaotatud fiks naaseb võltssignaalil reacquire_s pärast (vt combined-event). Ajamuutus, mille tõttu teatatud aeg seiskuks või jookseks tagurpidi (kiirus 1 s sekundis või rohkem), lükatakse tagasi, kui see ei ole samm (ramp_s = 0).
Sündmused võivad kattuda; nende mõjud liituvad (nihked, ajamuutused, viivitused) või kehtib tugevaim (segamine). Ajajoone onset on esimene epohh, mil sündmusel on mõju, üks epohh pärast skriptitud start_s, kui sündmus tõuseb järk-järgult.
Instruktori logi#
Voo kõrval annavad <prefix>.instructor.json ja <prefix>.instructor.txt:
- sündmused sellisena, nagu need süstiti, lihtsas keeles koos iga parameetriga, ja nende UTC algusaeg;
- ajajoone: algus, täielik mõju, taastumise algus, taastumine ning vastuvõtja enda
fix-lostjafix-regained; - tõelise raja teatatuga võrreldes
log_interval_ssammuga: tõene ja teatatud asukoht, kiirus ja kurss, asukohaviga meetrites, ajanihe, kasutatud ja jälgitud satelliidid, keskmine C/N0 ning millised sündmused olid aktiivsed; - tõelise ja teatatud raja tippkiirus ja -kiirendus;
- stsenaariumi
trainer_note.
Näita logi alles lõppanalüüsil.
JSON-väljad (skeem kshana-nmea-training/1)#
| väli | tüüp, ühik | tähendus |
|---|---|---|
schema |
string | kshana-nmea-training/1 |
warning |
string | ainult koolituseks mõeldud väide |
scenario, description, trainer_note |
string | stsenaariumist |
seed |
täisarv | kasutatud algväärtus (seed) |
start_utc |
ISO 8601 UTC | käitamise algus |
duration_s |
s | käitamise kestus |
summary.true_peak_sog_kn, summary.reported_peak_sog_kn |
sõlme | suurim tõene ja teatatud kiirus maa suhtes |
summary.true_peak_accel_mps2, summary.reported_peak_accel_mps2 |
m/s ruudus | kiiruse suurim muutus sekundis, tõene ja järjestikuste teatatud fikside vahel |
events[] |
üks iga skriptitud sündmuse kohta | |
events[].id |
täisarv | 1-põhine; kasutavad timeline[].event ja track[].active_events |
events[].description |
string | lihtsas keeles kirjeldus koos parameetritega |
events[].start_utc |
ISO 8601 UTC | skriptitud algus |
events[].parameters |
objekt | sündmus täpselt nii, nagu see on kirjutatud (kind, start_s, duration_s, ramp_s, recovery_s ja liigi enda parameetrid; puuduvad jäetakse välja) |
events[].resolved_bearing_deg |
kraadi tõene või null | drag-off: rakendatud suund (suhteline suunanurk lahendatakse alguses) |
events[].peak_drag_speed_mps, events[].peak_drag_accel_mps2 |
m/s, m/s ruudus või null | drag-off: tipud, mille nihe võltsrajale lisab |
timeline[] |
hetked lõppanalüüsi jaoks, ajalises järjekorras | |
timeline[].t_s, .utc |
s algusest, ISO 8601 UTC | millal (tõene aeg) |
timeline[].event |
täisarv või null | sündmuse id; null vastuvõtja oleku muutuste korral |
timeline[].what |
string | onset, full-effect, recovery-begins, recovered (sündmused); fix-lost, fix-regained (vastuvõtja) |
timeline[].text |
string | selgitus |
track[] |
üks rida iga log_interval_s kohta |
|
track[].t_s, .utc |
s, ISO 8601 UTC | millal (tõene aeg) |
track[].true_lat_deg, .true_lon_deg |
kraadid | tõene asukoht |
track[].true_sog_kn, .true_cog_deg, .true_heading_deg |
sõlme, kraadi tõene | tõene kiirus ja kurss maa suhtes ning güroskoobi suund |
track[].fix_valid |
tõeväärtus | vastuvõtja teatas fiksist |
track[].reported_lat_deg, .reported_lon_deg, .reported_sog_kn, .reported_cog_deg |
kraadid, sõlmed, kraadi tõene või null | mida vastuvõtja teatas; null, kuni fiks on kadunud |
track[].position_error_m |
m või null | horisontaalne kaugus tõelisest teatatud asukohani |
track[].time_offset_s |
s | teatatud UTC miinus tõene UTC |
track[].n_used, .n_tracked |
täisarvud | fiksis kasutatud ja jälgitud satelliidid |
track[].mean_cn0_dbhz |
dB-Hz või null | jälgitud satelliitide keskmine C/N0 |
track[].active_events |
täisarvud | sündmuste id-d, millel on sel hetkel mõju |
Välja lisamine ei muuda skeemi silti. Välja ümbernimetamine või eemaldamine või välja tähenduse või ühiku muutmine suurendab numbrit (/2).
Stsenaariumiteek#
scenarios/training/, kumbki mõne minuti pikkune reis koos treeneri märkusega oma TOML-is:
| fail | mida see näitab |
|---|---|
open-sea-jamming.toml |
C/N0 langeb koos, satelliidid kaovad, fiks läheb kaduma ja naaseb |
coastal-drag-off.toml |
kehtiv, terve väljanägemisega fiks nihkub 1,4 km kalda poole; ühtlaselt tõstetud C/N0 |
port-approach-time-spoof.toml |
asukoht õige, UTC triivib aeglase sadamasse sisenemise ajal 45 s ette |
combined-event.toml |
segamine, seejärel võltssignaali ülevõtt koos drag-off-i ja ajanihkega, seejärel taasesituse viivitus |
fjord-natural-degradation.toml |
blokeeritud taevas, mitte häire: fjordi kaljuseinad (REPRESENTATIVE fjord horisondijoone eelseadistus) varjavad satelliite idas ja läänes, seejärel kanal avaneb taas (sündmus natural-degradation, koos skyline tabeliga) |
Asukohad, kuupäevad ja rajad on väljamõeldud; teek ei sisalda ühtki tegelikku laeva, operaatorit ega salvestist. See ei väida midagi selle kohta, kuidas ükski vastuvõtja või süsteem häire korral toimiks.
Modelleerimisvalikud#
Generaator on koolitusvahend, millel puudub väline sõltumatu etalon, ja selle arvud on modelleerimisvalikud, mitte ühegi vastuvõtja mõõtmised. Need on valitud nii, et need näeksid välja nagu tavalise vastuvõtja logi: C/N0 kalle 14 dB seniidist horisondini alla seniiditaseme (vaikimisi 47 dB-Hz) ja satelliidipõhine nihe +/-1,5 dB, aeglane hajumine 0,8 dB 97 s jooksul ja 0,5 dB 31 s jooksul, 0,3 dB värin; jälgimise (20 dB-Hz) ja kasutamise (28 dB-Hz) läved; asukohamüra (1,5 m HDOP-i 1 korral, korreleeritud 30 s jooksul, vertikaalselt kaks korda suurem); 0,05 kraadi güroskoobi müra ja 0,03 kn triivimüra; 20 s roolimise ajakonstant ja laeva mudeli teekonnapunktide saabumisraadiused; ning asimuudisektori põhine satelliidivalik. Vaikeväärtused asuvad [receiver] ja [vessel] ning neid kõiki saab stsenaariumis muuta.
Tagasilugemine#
kshana receiver-trust oskab neid faile sisse lugeda (format = "nmea"). Testid kontrollivad iga teegi stsenaariumi iga lauset selle enda väljade arvu ja kontrollsumma reeglite vastu ning käitavad failid läbi selle lugeja, mis tõlgendab GGA, RMC ja GSV lauseid ning laseb teised tüübid läbi, jätmata ühtki vahele. Testid fikseerivad stsenaariumi kohta kuldse väljavõtte (tests/fixtures/nmea_training/); pärast kavatsetud muutust genereeritakse uuesti käsuga KSHANA_BLESS_GOLDEN=1.