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

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


venerdì 5 febbraio 2016

Raw data da Ublox M8T

Per migliorare il mio sistema GPS portatile ho deciso che le antenne a basso costo non raggiungono i risultati attesi e mi sono comprato un UBlox M8T che, pur essendo ancora un dispositivo L1, permette di ottenere i dati raw della fase

Il costo del dispositivo, compreso di antenna e' sui 100 euro (in particolare ho comprato questo modello)


Diametro circa 10 cm

L'interfaccia con il software U-Center funziona perfettamente senza l'installazione dei driver (peraltro il dispositivo e' giunto senza nessuna indicazione ne' scritta ne' su supporto informatico) via Usb anche se e' disponibile una serie TTL per l'uso con Arduino.

Una volta lanciato il programma si deve collegare la seriale premendo il primo pulsante a sinistra nella seconda toolbar (dal menu a tendina si deve prima  scegliere la COM)

A questo punto inizia il collegamento. Di default il GPS spedisce dati NMEA. Per abilitare la trasmissione dei pacchetti binari UBX, dove sono contenute le informazioni si deve cliccare sul quarto pulsante da sinistra (si vedra' una finestra Enable con una progressbar ed i messaggi che abilitano l'UBX)



Con il tasto F6 si apre la finestra di visualizzazione dei pacchetti ricevuti (Packet Console) mentre con F7 si vede il dettaglio del contenuto del pacchetto (ovviamente essendo i pacchetti UBX binari sara' poco chiaro il significato)

In questo momento sono mischiati i pacchetti binari UBX ed i pacchetti NMEA (stringhe). Per vedere solo i dati UBX si clicca F9  (Message View), poi si clicca destra sulla radice NMEA e Disable Child Message.
I pacchetti dei dati raw sono inclusi nel pacchetto UBX-RXM-RAWX

Esempio dei pacchetti UBX

Da dentro U-Center si puo' attivare la registrazione dei dati su file mediante il pulsante Save (il cerchio rosso nella seconda toolbar)

A questo punto si deve passare, per il postprocessing,  dal formato UBX a Rinex. Per fare cio' si deve usare il programma RTKLib  facendo attenzione ad utilizzare la versione beta 2.4.3 (scaricabile da qui) perche' le precedenti versioni stable non leggono l'attuale formato UBX.
La conversione si fare a riga di comando con convbin.exe oppure con la GUI mediante rtkconv.exe



il risultato finale in Rinex e' il seguente
-----------------------------------------------
     2.10           OBSERVATION DATA    M (MIXED)           RINEX VERSION / TYPE
RTKCONV 2.4.3 b8                        20160204 132837 UTC PGM / RUN BY / DATE 
log: C:\Documents and Settings\l.innocenti\Desktop\rtkli\b  COMMENT             
format: u-blox                                              COMMENT             
                                                            MARKER NAME         
                                                            MARKER NUMBER       
                                                            OBSERVER / AGENCY   
                                                            REC # / TYPE / VERS 
                                                            ANT # / TYPE        
  4523854.9454   898262.0665  4390882.1912                  APPROX POSITION XYZ 
        0.0000        0.0000        0.0000                  ANTENNA: DELTA H/E/N
     1     1                                                WAVELENGTH FACT L1/2
     4    C1    L1    D1    S1                              # / TYPES OF OBSERV 
  2016     2     4    10    46   37.0000000     GPS         TIME OF FIRST OBS   
  2016     2     4    11     2   34.0000000     GPS         TIME OF LAST OBS    
                                                            END OF HEADER       
 16  2  4 10 46 37.0000000  0  6G 9G 6G23G 2G 3G16
  20353149.445       31374.2421       -629.648          48.250  
  21171326.688      101805.5401      -2189.004          42.000  
  21715976.480      221495.1331      -4711.816          50.750  
  22754433.179     -230913.3121       5015.303          39.500  
  23778302.177      352639.2231      -7537.764          42.000  
  24278781.122      -34942.1271       2639.141          29.250  



venerdì 22 gennaio 2016

Ublox NEO M8N su Arduino

Dopo aver provato vari moduli GPS (qui e qui) per il mio acquisitore, ho comprato un UBlox Neo-M8N che dovrebbe garantire prestazioni un po' piu' professionali mantenendo il costo attorno ai 20-30 euro

In realta' il chip Ublox da solo e' sostanzialmente inutile perche' ha bisogno di elettronica di contorno e non e' banale da saldare in quanto e' SMD, quindi conviene comprare una scheda gia' assemblata. Ho preso quindi su Aliexpress il modulo sottostante, comprensivo di antenna passiva, che giunge con uno strano connettore a 4 fili ed uno a due fili


con un po' di ricerca ho scoperto che questo tipo di connettore e' compatibile con gli autopilot PixHawk, in pratica si tratta di un  modulo pronto per essere montato su un drone. Il mio obbiettivo era quello invece di usarlo con Arduino e visti i cavi sottili ho dovuto usare una millefori per fare una stabile di collegamento tra due tipi di fili di spessore differente 




Per testare il modulo e' disponibile il software Ucenter  per Windows. Non avendo a portata di mano una cavo FTDI ho connesso la seriale TTL dell'Ublox ad una Arduino su una seriale software per poi ridigere tutto sulla porta USB della Arduino (attenzione : il Neo-M8N ha una alimentazione massima a 3.3 V)

Questo e' lo sketch impiegato disponibile tra gli esempi della IDE di Arduino
----------------------------------------

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }

  mySerial.begin(9600);
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

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

Con il software Ucenter e' semplice avere una rappresentazione grafica della distribuzione dei punti. La nuvola dei punti e' rimasta nell'intorno di +/- 2 m con una standard deviation  inferiore al metro
Si vede chiaramente anche con l'Ublox riceva segnali sia GPS che Glonass


Questa e' la traccia invece plottata sul terreno. La posizione reale era al centro del rettangolo marrone


Questa e' la variazione in altezza registrata

Il modulo testato e' decisamente veloce nell'acquisizione ed ha delle caratteristiche migliori di Adafuit ad un prezzo comparabile. Cio' che manca e' la presenza di un Pin che permetta di spengere l'antenna per risparmiare energia

Opencv camera calibration in cpp

Oltre che con uno script Python come visto qui la calibrazione della camera si puo' fare anche con il programma in CPP Questo il proce...