Visualizzazione post con etichetta RTKLib. Mostra tutti i post
Visualizzazione post con etichetta RTKLib. Mostra tutti i post

mercoledì 4 novembre 2020

GPS differenziale con RTL-SDR

Un progetto molto interessante che sto provando e' GNSS-SDR , un sistema per usare un modulo RTL-SDR v3 da circa 20 ed una antenna GPS da 5 euro per poter ricevere i dati GPS ed utilizzarli per la correzione differenziale (ovviamente il dispositivo agisce come se fosse in banda L1.. per avere la banda L2 bisognerebbe avere un'altra RTL-SDR sintonizzata sulla frequenza L2 ....ed in ogni caso il software non prevede questa decodifica)


Il computer puo' essere un comune portatile...l'unico problema e' che il programma apre un thread per ogni satellite osservato quindi la memoria e' sempre benvenuta

Oltre alla libreria si devono scaricare anche 

http://www.rtklib.com/rtklib.htm

https://github.com/rtlsdrblog/rtl-sdr/releases/tag/v1.1

Per far funzionare il software prima si devono configurare i driver della scheda, lanciare il file bat bias_tee_on e successivamente gnss-sdrgui

(il bias tee e' un circuito inserito nell'elettronica dell'RTL-SDR per alimentare l'antenna attiva esterna patch)

Istruzioni nel video 


Questa e' la configurazione che ha funzionato per me


Per semplicita' io ho abilitato come output la configurazione di rete e l'output su file Rinex
Il file Rinex sembra registrare solo la costellazione GPS anche se nella finestra di monitor vengono mostrati anche i dati di Galileo e Glonass

ATTENZIONE: deve essere impostata la coordinata il piu' precisa possibile del punto di misura

Per monitorare la applicazione si puo' premere il pulsante M a fianco del pulsante Start 

Attenzione : se si usa Windows in italiano il file Rinex in uscita avra' i punti decimali sostituiti da virgole e cio' rende impossibile fare il postprocessing con RTKLib. (con editor di testo si puo' fare Find/Replace per la modifica da virgola a punto)

Questo il risultato finale del post processing

% program   : RTKPOST ver.2.4.3 b33

% inp file  : C:\Users\lucai\Desktop\gpssdr\sdr_20201015113400.obs

% inp file  : C:\Users\lucai\Desktop\gpssdr\cal\cala289h00.rnx\cala289h00.20o

% inp file  : C:\Users\lucai\Desktop\gpssdr\cal\cala289h00.rnx\cala289h00.20n

% obs start : 2020/10/15 11:34:36.1 GPST (week2127 387276.1s)

% obs end   : 2020/10/15 11:44:20.1 GPST (week2127 387860.1s)

% pos mode  : static

% freqs     : L1+L2

% solution  : forward

% elev mask : 15.0 deg

% dynamics  : off

% tidecorr  : off

% ionos opt : broadcast

% tropo opt : saastamoinen

% ephemeris : broadcast

% amb res   : continuous

% val thres : 3.0

% antenna1  :                       ( 0.0000  0.0000  0.0000)

% antenna2  :                       ( 0.0000  0.0000  0.0000)

% ref pos   : 43.854470000   11.166080000   -50.0000

%

% (lat/lon/height=WGS84/ellipsoidal,Q=1:fix,2:float,3:sbas,4:dgps,5:single,6:ppp,ns=# of satellites)

%  GPST                  latitude(deg) longitude(deg)  height(m)   Q  ns   sdn(m)   sde(m)   sdu(m)  sdne(m)  sdeu(m)  sdun(m) age(s)  ratio

2020/10/15 11:36:42.068   43.745316827   11.292427977   -63.6904   2   6   1.0450   0.1566   0.2377  -0.3671   0.0280   0.0864   0.07    1.8

2020/10/15 11:36:48.068   43.745347458   11.292425620   -64.6534   2   6   0.4222   0.1009   0.2274  -0.1555   0.0559  -0.1237   0.07    1.5

2020/10/15 11:36:57.068   43.745340452   11.292424419   -65.2242   2   6   0.3162   0.0907   0.2193  -0.1200   0.0539  -0.1264   0.07    1.1

2020/10/15 11:37:03.068   43.745306097   11.292430701   -65.7996   1   6   0.0136   0.0063   0.0206  -0.0056   0.0036  -0.0125   0.07    3.6

2020/10/15 11:37:09.068   43.745293252   11.292432728   -66.0801   2   6   0.2346   0.0797   0.2056  -0.0921   0.0490  -0.1221   0.07    1.1

2020/10/15 11:37:15.068   43.745286998   11.292432314   -66.6728   2   6   0.2129   0.0759   0.1997  -0.0845   0.0468  -0.1193   0.07    1.2

2020/10/15 11:37:21.068   43.745275726   11.292432226   -66.5496   2   6   0.1968   0.0726   0.1943  -0.0787   0.0449  -0.1166   0.07    1.3

2020/10/15 11:37:27.068   43.745263392   11.292434190   -66.5540   2   6   0.1841   0.0698   0.1893  -0.0741   0.0432  -0.1139   0.07    2.3

2020/10/15 11:37:33.068   43.745263939   11.292432314   -65.8761   2   6   0.1737   0.0673   0.1847  -0.0703   0.0417  -0.1114   0.07    1.9

2020/10/15 11:37:39.068   43.745263809   11.292432072   -65.3947   2   6   0.1651   0.0651   0.1804  -0.0670   0.0403  -0.1090   0.07    1.1

2020/10/15 11:37:45.068   43.745260600   11.292432193   -64.7574   2   6   0.1577   0.0631   0.1764  -0.0642   0.0390  -0.1068   0.07    1.2

2020/10/15 11:37:51.068   43.745257360   11.292431499   -64.6951   2   6   0.1513   0.0613   0.1727  -0.0618   0.0379  -0.1047   0.07    2.2

2020/10/15 11:37:57.068   43.745257344   11.292430153   -64.7047   2   6   0.1457   0.0596   0.1691  -0.0596   0.0369  -0.1027   0.07    1.0

2020/10/15 11:38:03.068   43.745249007   11.292431368   -64.0611   2   6   0.1408   0.0580   0.1658  -0.0577   0.0359  -0.1008   0.07    1.9

2020/10/15 11:38:09.068   43.745238433   11.292434035   -64.0050   2   6   0.1363   0.0566   0.1627  -0.0560   0.0350  -0.0990   0.07    1.1

2020/10/15 11:38:15.068   43.745230377   11.292436913   -63.8980   2   6   0.1323   0.0553   0.1598  -0.0544   0.0342  -0.0973   0.07    1.2

2020/10/15 11:38:21.068   43.745228652   11.292439258   -63.8676   2   6   0.1286   0.0541   0.1570  -0.0529   0.0335  -0.0957   0.07    1.3

2020/10/15 11:38:27.068   43.745224795   11.292441520   -63.8227   2   6   0.1253   0.0529   0.1543  -0.0516   0.0328  -0.0942   0.07    1.1

2020/10/15 11:38:34.068   43.745218911   11.292444739   -63.9953   2   6   0.1222   0.0518   0.1518  -0.0504   0.0322  -0.0928   0.07    2.3

2020/10/15 11:38:40.068   43.745218438   11.292447546   -64.5331   2   6   0.1194   0.0508   0.1494  -0.0492   0.0316  -0.0914   0.07    1.0

2020/10/15 11:38:46.068   43.745214867   11.292448732   -64.9767   2   6   0.1170   0.0499   0.1471  -0.0484   0.0310  -0.0900   0.07    2.1

2020/10/15 11:38:52.068   43.745207694   11.292451080   -65.1364   2   6   0.1145   0.0490   0.1450  -0.0474   0.0305  -0.0888   0.07    1.6

2020/10/15 11:38:58.068   43.745204558   11.292451150   -65.2057   2   6   0.1122   0.0482   0.1429  -0.0464   0.0300  -0.0876   0.07    1.2

2020/10/15 11:39:04.068   43.745206265   11.292447041   -65.3471   2   6   0.1100   0.0474   0.1409  -0.0456   0.0295  -0.0864   0.07    2.6

2020/10/15 11:39:10.068   43.745204921   11.292445771   -65.5508   2   6   0.1080   0.0466   0.1390  -0.0448   0.0291  -0.0853   0.07    2.3

2020/10/15 11:39:17.068   43.745200520   11.292445390   -65.8156   2   6   0.1064   0.0459   0.1371  -0.0442   0.0286  -0.0842   0.07    1.0

2020/10/15 11:39:25.068   43.745196791   11.292446870   -65.6732   1   6   0.0141   0.0063   0.0205  -0.0059   0.0042  -0.0129   0.07    7.5

2020/10/15 11:39:31.068   43.745192898   11.292447003   -65.8577   2   6   0.1029   0.0446   0.1337  -0.0428   0.0279  -0.0822   0.07    2.2

2020/10/15 11:39:37.068   43.745192144   11.292447887   -65.9236   2   6   0.1012   0.0439   0.1320  -0.0421   0.0276  -0.0813   0.07    1.9

2020/10/15 11:39:43.068   43.745191371   11.292448821   -66.2033   1   6   0.0141   0.0063   0.0205  -0.0059   0.0043  -0.0130   0.07   29.7

2020/10/15 11:39:49.068   43.745193313   11.292449696   -66.5907   2   6   0.0982   0.0427   0.1289  -0.0409   0.0269  -0.0795   0.07    1.1

2020/10/15 11:39:55.068   43.745198138   11.292449984   -67.2350   1   6   0.0142   0.0063   0.0205  -0.0059   0.0043  -0.0130   0.07    3.3

2020/10/15 11:40:01.068   43.745195988   11.292452579   -67.6868   2   6   0.0955   0.0416   0.1260  -0.0398   0.0263  -0.0779   0.07    1.1

2020/10/15 11:40:07.068   43.745194796   11.292453940   -68.0674   2   6   0.0942   0.0411   0.1247  -0.0392   0.0261  -0.0771   0.07    1.5

2020/10/15 11:40:13.068   43.745194622   11.292454531   -68.3254   2   6   0.0930   0.0406   0.1233  -0.0387   0.0258  -0.0763   0.07    1.8

2020/10/15 11:40:19.068   43.745194780   11.292455399   -68.2927   1   6   0.0142   0.0063   0.0205  -0.0060   0.0044  -0.0131   0.07    7.1

2020/10/15 11:40:25.068   43.745198122   11.292453471   -67.9572   2   6   0.0907   0.0396   0.1208  -0.0378   0.0253  -0.0749   0.07    2.3

2020/10/15 11:40:31.068   43.745200144   11.292452410   -67.7198   1   6   0.0143   0.0063   0.0205  -0.0060   0.0045  -0.0131   0.07    6.3

giovedì 16 novembre 2017

Nexus 5x / RTKLib / Geo++ / DGPS

Stessa prova vista in questo post ma con un Nexus 5X.
L'applicazione Geo++ non e' quella presente sul market ma si tratta di una beta ricevuta dallo sviluppatore perche' Nexus 5x ha delle particolarita' (in realta' non e' molto chiaro se sia Nexus 5X oppure l'implementazione delle API perche' su Android Oreo stock la beta Geo++ non funziona mentre si ottengono risultati con Oreo beta)


Il punto topografico di riferimento e' sempre il solito come il post processing

Il punto calcolato risulta essere
43.833026632 11.307094997 201.0573

in precedenza i dati erano
dalla scheda del punto topografico
43.83304783 11.30706278 203.3

I dati post processati con RTKLib ed acquisiti con Nexus 9
43.833068271 11.307051667 184.74

da segnalare su questo argomento la seguente pubblicazione scientifica che riporta dei risultati decisamente interessanti

Precise GNSS Positioning Using Smart Devices
Eugenio Realini, Stefano Caldera Lisa Pertusini,Daniele Sampietro
Geomatics Research & Development s.r.l. (GReD), via Cavour 2, c/o ComoNExT, 22074 Lomazzo (Como), Italy

mercoledì 15 novembre 2017

Nexus 9 / RTKLIB/ Geo++ / DPGS

Dopo la prova del precedente post ho provato ad usare l'applicazione Geo++ su Nexus 9 con RTKLIB in postprocessing per vedere se era possibile ottenere una correzione DGPS



Il punto trigonometrico di riferimento e' sempre il solito visto qui . La novita' e' che l'antenna GPS della Provincia di Firenze che usavo come antenna base per la correzione DGPS non fornisce piu' dati probabilmente a seguito della dismissione della Provincia stessa. Un sostituto e' stato trovato nell'antenna base dell'IGM posta in via Baracca a Firenze i cui dati possono essere scaricati a questo link

http://www.epncb.oma.be/_networkdata/siteinfo4onestation.php?station=IGMI00ITA

e piu' in dettaglio qui (la sigla della stazione e' igmi. i dati sono ordinati per cartelle del giorno dell'anno progressivo e dell'ora di acquisizione. I dati del giorno 311 per esempio ora T avranno un nome file del tipo igmi311t.17d.Z)

ftp://igs.bkg.bund.de/EUREF/nrt/

I dati relativi dalla scheda del punto topografico indicano una posizione di riferimento
43.83304783 11.30706278 203.3
I dati post processati con RTKLib vengono indicate le seguenti coordinate
43.833068271 11.307051667 184.74

La cosa che mi disturba e' che RTKLib non fornisce l'errore di posizionamento

I dati post processati dalla ditta che fornisce Geo ++ forniscono un punto (nessun errore di posizionamento fornito)
43,833042 11,307012 171.7541

Gli stessi dati processati con Leica GeoOffice di Leica portano una posizione completamente differente, in particolare e' completamente sballato il dato di quota
11° 22' 52".68555 -43° 49' 59".11283 1023.8346

considerando che le differenze nella posizione si trovano nella quinta posizione decimale dopo la virgola non sembra proprio male (lasciando perdere la quota che pero' non e' di mio interesse)

mercoledì 8 novembre 2017

Precise Point Positioning con Nexus 9 ed Android 7.1.1

Con l'introduzione delle API di misura Raw Gnss avevo gia' provato qualche tempo fa la applicazione di test fornita da Google, ovvero GnssLogger, ma senza un programma per gestire il file di log l'esperimento non era andato molto in la'

Adesso ho trovato su questo link uno script in Python che converte il file di log in un formato Rinex che puo' essere dato in pasto ad RTKLib per il post processing dei dati 

Attenzione: lo script funziona su Python 3.x e non su Python 2.x

Per la prova ho usato un tablet Nexus 9 (senza supporto cellulare) che come riportato da questo link e'
uno dei pochi dispositivi certificati per funzionare con le API Raw Gnss (anzi e' uno dei pochi con la piena funzionalita')

Si usa quindi GnssLogger (vedi link per l'apk) per l'acquisizione dei dati, lo script android_to_rinex.py per la conversione in Rinex ed RTKPost in modalita' PPP per il post processing


Il risultato finale non e' niente male perche' l'errore si riduce a circa 1 m sui tre assi ed i dati riescono a convergere in meno di un minuto

venerdì 13 maggio 2016

Ublox M8T + Intel Edison + RTKLib

Collegare un Ublox M8T e processare i dati direttamente all'interno della Edison con RTKLib e' un procedimento estremamente lineare e simile a quello di un normale PC


Il GPS, al contrario di YUN, viene riconosciuto immediatamente e le librerie RTKLib si compilano direttamente sulla Intel, complice anche l'assenza di dipendenze da altre librerie

L'unica accortezza e' quella di spostare lo switch SW1 verso la porta USB tipo A per abilitare questa porta (e conseguentemente disabilitare la porta microUsb OTG)

martedì 19 aprile 2016

DGPS con Ublox M8T e RTKLib a 5Hz e 10Hz

In caso di utilizzo di GPS Differenziale in modalita' dinamica puo' essere utile avere una frequenza di campionamento piu' veloce dello standard di una acquisizione al secondo, in particolar modo se il rover si muove rapidamente.
L'Ublox M8T permette questa funzionalita' almeno fino al valore di campionamento di 10Hz (piu' veloce non ho provato ma il file di configurazione permette di inserire il tempo di campionamento in millisecondi, il che fa pensare che si posssano inserire valori inferiori ai 100 millisecondi



L'unica accortezza, per permettere il campionamento piu' veloce, e' quello di modificare la velocita' della porta seriale (anche se si acquisisce via USB) modificando il valore standard di 9600 bps portandolo a 115200 bps. Si deve tenere anche conto che il file di configurazione di RTKLib, nonostante si chiami ubx_m8t_glo_raw_5hz.cmd non modifica la velocita' della porta per cui, cosi' come e', e' sostanzialmente inutile


-----------------------------------
# RTKNAVI options (2016/02/08 17:25:54, v.2.4.3 b8)

pos1-posmode       =single     # (0:single,1:dgps,2:kinematic,3:static,4:movingbase,5:fixed,6:ppp-kine,7:ppp-static,8:ppp-fixed)
pos1-frequency     =l1         # (1:l1,2:l1+l2,3:l1+l2+l5,4:l1+l5)
pos1-soltype       =forward    # (0:forward,1:backward,2:combined)
pos1-elmask        =15         # (deg)
pos1-snrmask_r     =off        # (0:off,1:on)
pos1-snrmask_b     =off        # (0:off,1:on)
pos1-snrmask_L1    =0,0,0,0,0,0,0,0,0
pos1-snrmask_L2    =0,0,0,0,0,0,0,0,0
pos1-snrmask_L5    =0,0,0,0,0,0,0,0,0
pos1-dynamics      =off        # (0:off,1:on)
pos1-tidecorr      =off        # (0:off,1:on,2:otl)
pos1-ionoopt       =brdc       # (0:off,1:brdc,2:sbas,3:dual-freq,4:est-stec,5:ionex-tec,6:qzs-brdc,7:qzs-lex,8:stec)
pos1-tropopt       =saas       # (0:off,1:saas,2:sbas,3:est-ztd,4:est-ztdgrad,5:ztd)
pos1-sateph        =brdc       # (0:brdc,1:precise,2:brdc+sbas,3:brdc+ssrapc,4:brdc+ssrcom)
pos1-posopt1       =off        # (0:off,1:on)
pos1-posopt2       =off        # (0:off,1:on)
pos1-posopt3       =off        # (0:off,1:on,2:precise)
pos1-posopt4       =off        # (0:off,1:on)
pos1-posopt5       =off        # (0:off,1:on)
pos1-posopt6       =off        # (0:off,1:on)
pos1-exclsats      =           # (prn ...)
pos1-navsys        =1          # (1:gps+2:sbas+4:glo+8:gal+16:qzs+32:comp)
pos2-armode        =continuous # (0:off,1:continuous,2:instantaneous,3:fix-and-hold)
pos2-gloarmode     =off        # (0:off,1:on,2:autocal)
pos2-bdsarmode     =off        # (0:off,1:on)
pos2-arthres       =3
pos2-arthres1      =0.9999
pos2-arthres2      =0.25
pos2-arthres3      =0.1
pos2-arthres4      =0.05
pos2-arlockcnt     =0
pos2-arelmask      =0          # (deg)
pos2-arminfix      =10
pos2-armaxiter     =1
pos2-elmaskhold    =0          # (deg)
pos2-aroutcnt      =5
pos2-maxage        =30         # (s)
pos2-syncsol       =off        # (0:off,1:on)
pos2-slipthres     =0.05       # (m)
pos2-rejionno      =30         # (m)
pos2-rejgdop       =30
pos2-niter         =1
pos2-baselen       =0          # (m)
pos2-basesig       =0          # (m)
out-solformat      =llh        # (0:llh,1:xyz,2:enu,3:nmea)
out-outhead        =off        # (0:off,1:on)
out-outopt         =off        # (0:off,1:on)
out-timesys        =gpst       # (0:gpst,1:utc,2:jst)
out-timeform       =hms        # (0:tow,1:hms)
out-timendec       =3
out-degform        =deg        # (0:deg,1:dms)
out-fieldsep       =
out-height         =ellipsoidal # (0:ellipsoidal,1:geodetic)
out-geoid          =internal   # (0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000)
out-solstatic      =all        # (0:all,1:single)
out-nmeaintv1      =0          # (s)
out-nmeaintv2      =0          # (s)
out-outstat        =off        # (0:off,1:state,2:residual)
stats-eratio1      =100
stats-eratio2      =100
stats-errphase     =0.003      # (m)
stats-errphaseel   =0.003      # (m)
stats-errphasebl   =0          # (m/10km)
stats-errdoppler   =1          # (Hz)
stats-stdbias      =30         # (m)
stats-stdiono      =0.03       # (m)
stats-stdtrop      =0.3        # (m)
stats-prnaccelh    =10         # (m/s^2)
stats-prnaccelv    =10         # (m/s^2)
stats-prnbias      =0.0001     # (m)
stats-prniono      =0.001      # (m)
stats-prntrop      =0.0001     # (m)
stats-prnpos       =0          # (m)
stats-clkstab      =5e-12      # (s/s)
ant1-postype       =llh        # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant1-pos1          =90         # (deg|m)
ant1-pos2          =0          # (deg|m)
ant1-pos3          =-6335367.6285 # (m|m)
ant1-anttype       =
ant1-antdele       =0          # (m)
ant1-antdeln       =0          # (m)
ant1-antdelu       =0          # (m)
ant2-postype       =llh        # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant2-pos1          =90         # (deg|m)
ant2-pos2          =0          # (deg|m)
ant2-pos3          =-6335367.6285 # (m|m)
ant2-anttype       =
ant2-antdele       =0          # (m)
ant2-antdeln       =0          # (m)
ant2-antdelu       =0          # (m)
misc-timeinterp    =off        # (0:off,1:on)
misc-sbasatsel     =0          # (0:all)
misc-rnxopt1       =
misc-rnxopt2       =
misc-pppopt        =
file-satantfile    =
file-rcvantfile    =
file-staposfile    =
file-geoidfile     =
file-ionofile      =
file-dcbfile       =
file-eopfile       =
file-blqfile       =
file-tempdir       =/tmp
file-geexefile     =
file-solstatfile   =
file-tracefile     =
file-cmdfile1      =ubx_m8t_glo_raw_10hz.cmd




inpstr1-type       =serial     # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr3-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr1-path       =ttyACM0:115200:8:n:1:off
inpstr2-path       =
inpstr3-path       =
inpstr1-format     =ubx        # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-format     =rtcm2      # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr3-format     =rtcm2      # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-nmeareq    =off        # (0:off,1:latlon,2:single)
inpstr2-nmealat    =0          # (deg)
inpstr2-nmealon    =0          # (deg)
outstr1-type       =file       # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr1-path       =./ufast2.txt
outstr2-path       =
outstr1-format     =llh        # (0:llh,1:xyz,2:enu,3:nmea)
outstr2-format     =llh        # (0:llh,1:xyz,2:enu,3:nmea)
logstr1-type       =file       # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr3-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr1-path       =./ufast2.ubx
logstr2-path       =
logstr3-path       =
misc-svrcycle      =10         # (ms)
misc-timeout       =10000      # (ms)
misc-reconnect     =10000      # (ms)
misc-nmeacycle     =5000       # (ms)
misc-buffsize      =32768      # (bytes)
misc-navmsgsel     =all        # (0:all,1:rover,2:base,3:corr)
misc-proxyaddr     =
misc-fswapmargin   =30         # (s)

-----------------------------------

File di configurazione per acquisizione raw a 10Hz. Nella prima riga evidenziata in giallo si imposta la velocita' della seriale, nella seconda il passo di campionamento (100 ms)
-----------------------------------
!UBX CFG-GNSS 0 32 32 1 3 16 16 0 0

!UBX CFG-GNSS 0 32 32 1 6 16 16 0 1

!UBX CFG-MSG 2 21 0 0 0 1 0 0

!UBX CFG-MSG 2 19 0 0 0 1 0 0

!UBX CFG-PRT 1 0 0 2256 115200 7 7 0

!UBX CFG-RATE 100 1 1

@
!UBX CFG-MSG 2 21 0 0 0 0 0 0

!UBX CFG-MSG 2 19 0 0 0 0 0 0

!UBX CFG-RATE 100 1 1
-----------------------------------

Rtkrcv, per il post processing, si deve essere sicuri di impostare il corretto valore del passo di campionamento



Questi sono i risultati di due prove di DGPS con rover e stazione entrambi con Ublox M8T. Le condizioni di misure non erano ottimali data la presenza di palazzi ed ambiente urbano ma si ottiene comunque un fix piuttosto stabile 

Prova a 5Hz
Prova a 10Hz




venerdì 8 aprile 2016

Unire file Rinex

Accade spesso di dover utilizzare dati di stazioni base GPS che sono distributi in file Rinex con i dati divisi per giorno o per fascia oraria. Ovviamente,come dice Murphy, la misura che noi stiamo effettuando andra' a cavallo tra due file ed e' quindi necessario trovare il sistema per unire due o piu' file Rinex. La soluzione risiede nel programma teqc compreso nel pacchetto RTKLib (anche se e' sviluppato esternamente alla libreria)

Per prima cosa se i file RINEX sono in formato compresso devono essere scompattati con crx2rnx

RTKLIB-rtklib_2.4.3\bin>crx2rnx.exe fipr098i.16d

poi si possono unire i vari Rinex per crearne uno di unione

RTKLIB-rtklib_2.4.3\bin>teqc.exe fipr098i.16o fipr098j.16o fipr098k.16o > unione.16o

si puo' procedere allo stesso modo per i file .nav e .gnav

Ublox M8T : sensibilita' in DGPS con RTKLib

Premessa : come in qualunque caso conoscere la  riposta aiuta nel risolvere una domanda. In un caso reale non conoscendo l'ora e l'entita' dello spostamento diventa difficile estrapolare i reali movimenti nascosti all'interno del rumore della misura


Ho voluto provare a vedere quale fosse il minimo  spostamento che e' possibile registrare usando il modulo Ublox M8T in modalita' differenziale usando RTK-Lib in modalita' cinematica (usando come base sia una Ublox M8T che un Leica 1200)

(allargare le immagini per vedere il dettaglio)
Prova 1:
in questo caso il sensore e' stato spostato di 9 cm. Lo spostamento calcolato e' di circa 6.9 cm (76% dello spostamento reale)



Prova 2:
Lo spostamento reale e' stato di 8 cm. Lo spostamento calcolato e' di circa 6.2 cm (77% dello spostamento reale)

Prova 3: 
Qui lo spostamento reale e' stato di 4 cm. Dopo l'elaborazione dei dati GPS lo spostamento e' calcolabile in 3.1 cm (77% dello spostamento reale)


Lo spostamento calcolato e' sempre sottostimato (circa 76-77%) ma si nota che e' possibile avere misure sostanzialmente affidabili fino ai 4 cm

martedì 5 aprile 2016

DGPS cinematico con RTKLib e Ublox M8T

Una prova di usare l'Ublox M8T in modalita' differenziale e dinamica.
L'antenna fissa e' stata quella della ex Provincia di Firenze mentre il rover e' stato l'Ublox con parametri di acquisizione in modalita' raw 1 dato al secondo

La modalita' di acquisizione e' stata identica a quella illustrata qui tranne per il fatto che il rover non era fermo ma in movimento. L'elaborazione e' stata fatta in post-processing


Dal punto di vista del software la modifica da effettuare e' di andare in Options di RTKPost e modificare da Static a Kinematic 


Questo invece e' il plot con il fix differenziale



per avere un riferimento ho camminato sul bordo dei sentieri in asfalto e percorso il bordo della circonferenza. C'e' una discreta discrepanza con l'immagine di Google Earth ma credo che il problema sia principalmente relativo alla georefenziazione dell'immagine e non ai dati del GPS anche perche' le linee risultano rettilinee ed il cerchio ha una ottima forma

giovedì 18 febbraio 2016

RTKLib su Raspberry

Allo scopo di usare una attrezzatura piu' leggera e di maggiore durata di batteria ho provato ad accoppiare l'UBlox M8T ad una Raspberry B alimentando il tutto con un power bank da 10000 mAh


Per fare cio' era necessario compilare le RTKLib sulla Raspbian. La compilazione e' avvenuta senza nessuna modifica rispetto a quella che si esegue su desktop e rtkrcv funziona correttamente anche su Raspberry (ovviamente ci vuole molta pazienza per compilare i sorgenti data la velocita' del processore)

Per scaricare i dati e' stato sufficiente abilitare l'SFTP e connettersi con un cavo cross da portatile

mercoledì 10 febbraio 2016

RTKLib e Ublox M8T su Debian

RTKLib e' un software per gestire dati GPS in modalita' avanzata. Viene fornita una versione gia' compilata per Windows ma e' possibile farlo funzionare anche su Linux compilando i sorgenti (su Linux non e' prevista l'interfaccia grafica ma solo i programmi a linea di comando)

Sistema di acquisizione Toughbook CF-18 con Debian collegato a Ublox M8T


Si parte scaricando il pacchetto da GitHub (questo perche' e' disponibile una versione piu' avanzata rispetto a quella linkata sul sito.

 Prima di iniziare si devono soddisfare le dipendenze

sudo apt-get install build-essential
sudo apt-get install automake
sudo apt-get install checkinstall
sudo apt-get install liblapack3gf
sudo apt-get install libblas3gf


dopo aver scompattato il pacchetto di GitHub si entra nella directory app e si lancia la compilazione con
makeall.sh
in questo modo si compila la versione 2.4.2 p11, ho avuto invece problemi con la 2.4.3

Connettendo la USB dell'Ublox M8T questo viene riconosciuto come seriale virtuale su /dev/ttyACM0

il programma per effettuare l'acquisizione dati si chiama rtkrcv e si configura mediante un file testo (io ho un po' barato nel senso che prima ho creato un file di configurazione con RTKNavi su Windows e poi lo ho importato, ovviamente modificando alcune parti, sulla Linux box)

Il file compilato si trova in RTKLIB-master/app/rtkrcv/gcc

File M8T.conf
--------------------------------------------------------
# RTKNAVI options (2016/02/08 17:25:54, v.2.4.3 b8)pos1-posmode       =single     # (0:single,1:dgps,2:kinematic,3:static,4:movingbase,5:fixed,6:ppp-kine,7:ppp-static,8:ppp-fixed)
pos1-frequency     =l1         # (1:l1,2:l1+l2,3:l1+l2+l5,4:l1+l5)
pos1-soltype       =forward    # (0:forward,1:backward,2:combined)
pos1-elmask        =15         # (deg)
pos1-snrmask_r     =off        # (0:off,1:on)
pos1-snrmask_b     =off        # (0:off,1:on)
pos1-snrmask_L1    =0,0,0,0,0,0,0,0,0
pos1-snrmask_L2    =0,0,0,0,0,0,0,0,0
pos1-snrmask_L5    =0,0,0,0,0,0,0,0,0
pos1-dynamics      =off        # (0:off,1:on)
pos1-tidecorr      =off        # (0:off,1:on,2:otl)
pos1-ionoopt       =brdc       # (0:off,1:brdc,2:sbas,3:dual-freq,4:est-stec,5:ionex-tec,6:qzs-brdc,7:qzs-lex,8:stec)
pos1-tropopt       =saas       # (0:off,1:saas,2:sbas,3:est-ztd,4:est-ztdgrad,5:ztd)
pos1-sateph        =brdc       # (0:brdc,1:precise,2:brdc+sbas,3:brdc+ssrapc,4:brdc+ssrcom)
pos1-posopt1       =off        # (0:off,1:on)
pos1-posopt2       =off        # (0:off,1:on)
pos1-posopt3       =off        # (0:off,1:on,2:precise)
pos1-posopt4       =off        # (0:off,1:on)
pos1-posopt5       =off        # (0:off,1:on)
pos1-posopt6       =off        # (0:off,1:on)
pos1-exclsats      =           # (prn ...)
pos1-navsys        =1          # (1:gps+2:sbas+4:glo+8:gal+16:qzs+32:comp)
pos2-armode        =continuous # (0:off,1:continuous,2:instantaneous,3:fix-and-hold)
pos2-gloarmode     =off        # (0:off,1:on,2:autocal)
pos2-bdsarmode     =off        # (0:off,1:on)
pos2-arthres       =3
pos2-arthres1      =0.9999
pos2-arthres2      =0.25
pos2-arthres3      =0.1
pos2-arthres4      =0.05
pos2-arlockcnt     =0
pos2-arelmask      =0          # (deg)
pos2-arminfix      =10
pos2-armaxiter     =1
pos2-elmaskhold    =0          # (deg)
pos2-aroutcnt      =5
pos2-maxage        =30         # (s)
pos2-syncsol       =off        # (0:off,1:on)
pos2-slipthres     =0.05       # (m)
pos2-rejionno      =30         # (m)
pos2-rejgdop       =30
pos2-niter         =1
pos2-baselen       =0          # (m)
pos2-basesig       =0          # (m)
out-solformat      =llh        # (0:llh,1:xyz,2:enu,3:nmea)
out-outhead        =off        # (0:off,1:on)
out-outopt         =off        # (0:off,1:on)
out-timesys        =gpst       # (0:gpst,1:utc,2:jst)
out-timeform       =hms        # (0:tow,1:hms)
out-timendec       =3
out-degform        =deg        # (0:deg,1:dms)
out-fieldsep       =
out-height         =ellipsoidal # (0:ellipsoidal,1:geodetic)
out-geoid          =internal   # (0:internal,1:egm96,2:egm08_2.5,3:egm08_1,4:gsi2000)
out-solstatic      =all        # (0:all,1:single)
out-nmeaintv1      =0          # (s)
out-nmeaintv2      =0          # (s)
out-outstat        =off        # (0:off,1:state,2:residual)
stats-eratio1      =100
stats-eratio2      =100
stats-errphase     =0.003      # (m)
stats-errphaseel   =0.003      # (m)
stats-errphasebl   =0          # (m/10km)
stats-errdoppler   =1          # (Hz)
stats-stdbias      =30         # (m)
stats-stdiono      =0.03       # (m)
stats-stdtrop      =0.3        # (m)
stats-prnaccelh    =10         # (m/s^2)
stats-prnaccelv    =10         # (m/s^2)
stats-prnbias      =0.0001     # (m)
stats-prniono      =0.001      # (m)
stats-prntrop      =0.0001     # (m)
stats-prnpos       =0          # (m)
stats-clkstab      =5e-12      # (s/s)
ant1-postype       =llh        # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant1-pos1          =90         # (deg|m)
ant1-pos2          =0          # (deg|m)
ant1-pos3          =-6335367.6285 # (m|m)
ant1-anttype       =
ant1-antdele       =0          # (m)
ant1-antdeln       =0          # (m)
ant1-antdelu       =0          # (m)
ant2-postype       =llh        # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm)
ant2-pos1          =90         # (deg|m)
ant2-pos2          =0          # (deg|m)
ant2-pos3          =-6335367.6285 # (m|m)
ant2-anttype       =
ant2-antdele       =0          # (m)
ant2-antdeln       =0          # (m)
ant2-antdelu       =0          # (m)
misc-timeinterp    =off        # (0:off,1:on)
misc-sbasatsel     =0          # (0:all)
misc-rnxopt1       =
misc-rnxopt2       =
misc-pppopt        =
file-satantfile    =
file-rcvantfile    =
file-staposfile    =
file-geoidfile     =
file-ionofile      =
file-dcbfile       =
file-eopfile       =
file-blqfile       =
file-tempdir       =C:\Temp
file-geexefile     =
file-solstatfile   =
file-tracefile     =
file-cmdfile1      =ubx_m8t_glo_raw_1hz.cmd


#

inpstr1-type       =serial     # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr3-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,7:ntripcli,8:ftp,9:http)
inpstr1-path       =ttyACM0:9600:8:n:1:off
inpstr2-path       =
inpstr3-path       =
inpstr1-format     =ubx        # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-format     =rtcm2      # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr3-format     =rtcm2      # (0:rtcm2,1:rtcm3,2:oem4,3:oem3,4:ubx,5:ss2,6:hemis,7:skytraq,8:gw10,9:javad,10:nvs,11:binex,12:rt17,15:sp3)
inpstr2-nmeareq    =off        # (0:off,1:latlon,2:single)
inpstr2-nmealat    =0          # (deg)
inpstr2-nmealon    =0          # (deg)
outstr1-type       =file       # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
outstr1-path       =./soluzioni.txt
outstr2-path       =
outstr1-format     =llh        # (0:llh,1:xyz,2:enu,3:nmea)
outstr2-format     =llh        # (0:llh,1:xyz,2:enu,3:nmea)
logstr1-type       =file       # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr2-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr3-type       =off        # (0:off,1:serial,2:file,3:tcpsvr,4:tcpcli,6:ntripsvr)
logstr1-path       =./raw_data.ubx
logstr2-path       =
logstr3-path       =
misc-svrcycle      =10         # (ms)
misc-timeout       =10000      # (ms)
misc-reconnect     =10000      # (ms)
misc-nmeacycle     =5000       # (ms)
misc-buffsize      =32768      # (bytes)
misc-navmsgsel     =all        # (0:all,1:rover,2:base,3:corr)
misc-proxyaddr     =
misc-fswapmargin   =30         # (s)

--------------------------------------------------------
Per abilitare la trasmissione dei pacchetti Ublox si deve chiamare il file ubx_mt8_glow_raw_1hz.cmd. Nella directory data di RTKLib sono presenti anche altri file a diversi passi di campionamento (5Hz e 10Hz) e da differenti impostazioni (ubx_m8t_bds_raw_1hz.cmd). Il file ubx_raw_1hz.cmd serve solo per cambiare il passo di campionamento ed e' sostanzialmente inutile


I dati vengono salvati in due file
soluzioni.txt e' un semplice file testo in cui vengono salvati i dati della posizione gia' elaborati (sono presenti anche le colonne sdn,sde,sdu,sdne,sdeu,sdun che sono rispettivamente la standard deviation nelle componenti Nord, Est, Z e quelle sulla componente Nord-Est, Est-Z e Z-Nord ). Questo fase e' sostanzialmente inutile per il postprocessing

In raw_data.ubx  vengono salvati tutti i dati in uscita dalla seriale senza elaborazione ovvero le stringhe NMEA ed i pacchetti UBX binari. Questi ultimi possono essere utilizzati per il postprocessing convertendo i dati in Rinex mediante il programma convbin.

./convbin -od -os -oi -ot -f 1 data.ubx
Una volta creato il file M8T.conf si lancia ./rtkrcv e si apre una shell (altrimenti ./rtkrcv -o M8T.conf) . Si digita
load M8T.conf 
restart

il sensore entra in acquisizione
per vedere l'avanzamento si puo' digitare status. Altrimenti si puo' digitare solution per vedere l'aggiornamento del punto GPS con i relativi errori. Spesso aggiungendo un numero alla fine del comando si setta il tempo di refresh del comando per esempio solution 1 aggiorna la posizione una volta al secondo

file .ubx con le stringhe NMEA e pacchetti binari UBX

status

satellite

solution


Per terminare il comando e' shutdown
Con questa soluzione e' possibile evitare di usare U-Center e Windows


Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata