User:RTK Kinematic and more than 1Hz frequency workflow with Ublox M8T receivers
(Redirected from Workflow with M8T receivers)
Jump to navigation
Jump to search
Prerequisites
- UBLOX NEO-M8T TIME & RAW receiver USB dongle with SMA (RTK ready)
- UBLOX ANN-MS-0-005 antenna
- optional for real-time processing: register a free account at EUREF NTRIP server
- [1]
- rtklibexplorer version of the RTKLIB
- crx2rnx
- ubx2nmea
Setup
Antenna setup
- The roof of the car makes for a good base plate for a patch antenna (ANN-MS-0-005 antenna).
- For bicycle setup, there is typically not sufficient base plate and ANN-MS-0-005 antenna produces signal with insufficient multi-path rejection to provide good data for RTK fix.
Configuring GPS
- Use UBLOX u-center version 8.x to configure the GPS receiver:
- Configuration changes from defaults (hit Send button at the bottom of the window after configuring each option):
- CFG-DGNSS: 3 = RTK fixed
- CFG-GNSS: enable GPS, SBAS, Galielo, GLONASS and set 32 channels to be used
- CFG-NAV5: 8-Airborne <4g
- CFG-NMEA: NMEA version 4.1
- CFG-MSG: F0-00 NMEA GxGGA - select enable on USB
- CFG-PMS: 0-Full power
- CFG-RATE: Measurement period - 250ms, Navigation rate - 1 cycle
- Save configuration
- CFG-CFG: select all devices (including SPI-FLASH) and Save current configuration and Send
- Configuration changes from defaults (hit Send button at the bottom of the window after configuring each option):
Collecting data for post processing
Obtaining real-time solution
- after registering with EUREF, you should have an account to be used with the EUREF NTRIP server
Configuring rtkpost from RTKLIB
- Options:
- Setting1: Kinematic, L1, Combined, 15, ..., ON, OFF, SBAS, SBAS, Broadcast ..... and select GPS, GLO, Galileo
- Setting2: Continuous, Fix and hold
- Output: NMEA0183
- Misc: time interpolation of base data ON
Getting Results
Extracting NMEA of of UBX
If the NMEA messages are enabled on USB port (u-center: View -> Configuration View -> UBX-CFG-MSG -> F0-00 NMEA GxGGA -> USB On), you can get them like this:
for i in *.ubx; get-ubx-nmea.sh $i; done
Postprocessing of raw data
- Generate OBS and SBS files:
for i in *.ubx; do convbin -od -os -oi -ot -f 1 $i; done
- Get base station measurements
mkdir base-meas && cd base-meas get-euref.sh
- Run rtkpost
- RINEX OBS data: rover - set to the OBS file generated above using convbin
- RINEX OBS base: base-meas\*.18o
- SBS data - forth field - set to the SBS file generated above using convbin
- Execute
Scripts
get-euref.sh
#!/bin/bash -x STATION=tubo YEAR=$(date '+%Y') DAY=$(date '+%j') j=0 for i in a b c d e f g h i j k l m n o p q r s t u v w x; do jstring=$(printf '%02d' "$j"); wget ftp://igs.bkg.bund.de/EUREF/nrt/${DAY}/${jstring}/tubo${DAY}${i}.18d.Z; j=$((j+1)) done uncompress *.Z for i in *.18d; do crx2rnx.exe $i; done rm *.18d
get-euref-hires.sh
#!/bin/bash -x STATION=tubo YEAR=$(date '+%Y') DAY=$(date '+%j') j=0 for i in a b c d e f g h i j k l m n o p q r s t u v w x; do jstring=$(printf '%02d' "$j"); for k in 00 15 30 45; do wget ftp://igs.bkg.bund.de/EUREF/highrate/${YEAR}/${DAY}/${i}/tubo${DAY}${i}${k}.18d.Z done j=$((j+1)) done uncompress *.Z for i in *.18d; do ../crx2rnx.exe $i; done rm *.18d
get-euref-v3.sh
#!/bin/bash -x STATION=GOP700CZE YEAR=$(date '+%Y') DAY=$(date '+%j') for i in `seq -w 0 23`; do jstring=$(printf '%02d' "$j"); wget ftp://igs.bkg.bund.de/IGS/nrt/${DAY}/${i}/${STATION}_R_${YEAR}${DAY}${i}00_01H_30S_MO.crx.gz; done gunzip *.gz for i in *.crx; do ../crx2rnx.exe $i; done rm *.crx
get-euref-v3-hires.sh
#!/bin/bash -x STATION=GOP700CZE YEAR=$(date '+%Y') DAY=$(date '+%j') j=0 for i in a b c d e f g h i j k l m n o p q r s t u v w x; do jstring=$(printf '%02d' "$j"); for k in 00 15 30 45; do wget ftp://igs.bkg.bund.de/IGS/highrate/${YEAR}/${DAY}/${i}/${STATION}_R_${YEAR}${DAY}${jstring}${k}_15M_01S_MO.crx.gz done j=$((j+1)) done gunzip *.gz for i in *.crx; do ../crx2rnx.exe $i; done rm *.crx
get-ubx-nmea.sh
#!/bin/sh -x
cat $1 | strings | fgrep GNGGA | perl -pe 's/^.*?\$GNGGA/\$GNGGA/;' >`basename $1 .ubx`-embedded.nmea
filter-nmea-rtk-fix.sh
#!/bin/sh -x
cat $1 | perl -ne '($msgtype, undef, undef, undef, undef, undef, $fix) = split /,/; print if ($msgtype eq "\$GPGGA" && $fix eq "4");' >`basename $1 .nmea`-rtkfix.nmea
rtkproc-all.sh
This script is a bit messy, as it mixes unix paths (Cygwin) with Windows paths (RTKLIB compiled for Windows).
#!/bin/sh -x MAINDIR=/target/dir MAINDIR=../.. RNAME=$(basename $1 .ubx) BNAME=..\\..\\test-euref\\$2 RTKCONF=${MAINDIR}/rtkpost-normal.conf cat ${RNAME}.ubx | strings | fgrep GNGGA | perl -pe 's/^.*?\$GNGGA/\$GNGGA/;' >${RNAME}-embedded.nmea ${MAINDIR}/convbin -od -os -oi -ot -f 1 ${RNAME}.ubx ${MAINDIR}/rnx2rtkp.exe -k ${MAINDIR}/rtkpost-normal.conf -o ${RNAME}-g.nmea ${RNAME}.obs ${BNAME}\\\*.18o ${RNAME}.nav ${RNAME}.sbs ${MAINDIR}/rnx2rtkp.exe -k ${MAINDIR}/rtkpost-normal.conf -o ${RNAME}-g+e.nmea ${RNAME}.obs ${BNAME}\\\*.18o ${RNAME}.nav ${RNAME}.lnav ${RNAME}.sbs ${MAINDIR}/rnx2rtkp.exe -k ${MAINDIR}/rtkpost-normal.conf -o ${RNAME}-g+r+e.nmea ${RNAME}.obs ${BNAME}\\\*.18o ${RNAME}.nav ${RNAME}.gnav ${RNAME}.lnav ${RNAME}.sbs for i in g g+e g+r+e; do ${MAINDIR}/filter-nmea-rtk-fix.sh ${RNAME}-${i}.nmea done cat ${RNAME}*-rtkfix.nmea | sort -n >${RNAME}-rtkfix-overall.nmea rm ${RNAME}*-rtkfix.nmea rm ${RNAME}*.pos #rm ${RNAME}*.stat
Config file: rtkpost-normal.conf
# rtkpost options (2018/10/18 16:02:55, v.demo5 b29e) pos1-posmode =kinematic # (0:single,1:dgps,2:kinematic,3:static,4:static-start,5:movingbase,6:fixed,7:ppp-kine,8:ppp-static,9:ppp-fixed) pos1-frequency =l1 # (1:l1,2:l1+l2,3:l1+l2+e5b,4:l1+l2+e5b+l5) pos1-soltype =combined # (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 =on # (0:off,1:on) pos1-tidecorr =off # (0:off,1:on,2:otl) pos1-ionoopt =sbas # (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 =sbas # (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 =13 # (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 =fix-and-hold # (0:off,1:on,2:autocal,3:fix-and-hold) pos2-bdsarmode =off # (0:off,1:on) pos2-arfilter =on # (0:off,1:on) pos2-arthres =3 pos2-arthres1 =0.1 pos2-arthres2 =0 pos2-arthres3 =1e-07 pos2-arthres4 =0.001 pos2-varholdamb =0.1 # (cyc^2) pos2-gainholdamb =0.01 pos2-arlockcnt =0 pos2-minfixsats =4 pos2-minholdsats =5 pos2-mindropsats =10 pos2-rcvstds =off # (0:off,1:on) pos2-arelmask =15 # (deg) pos2-arminfix =20 pos2-armaxiter =1 pos2-elmaskhold =15 # (deg) pos2-aroutcnt =20 pos2-maxage =30 # (s) pos2-syncsol =off # (0:off,1:on) pos2-slipthres =0.05 # (m) pos2-rejionno =1000 # (m) pos2-rejgdop =30 pos2-niter =1 pos2-baselen =0 # (m) pos2-basesig =0 # (m) out-solformat =nmea # (0:llh,1:xyz,2:enu,3:nmea) out-outhead =on # (0:off,1:on) out-outopt =on # (0:off,1:on) out-outvel =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-outsingle =off # (0:off,1:on) out-maxsolstd =0 # (m) 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 =residual # (0:off,1:state,2:residual) stats-eratio1 =300 stats-eratio2 =300 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 =3 # (m/s^2) stats-prnaccelv =1 # (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,6:raw) 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 =rinexhead # (0:llh,1:xyz,2:single,3:posfile,4:rinexhead,5:rtcm,6:raw) ant2-pos1 =0 # (deg|m) ant2-pos2 =0 # (deg|m) ant2-pos3 =0 # (m|m) ant2-anttype = ant2-antdele =0 # (m) ant2-antdeln =0 # (m) ant2-antdelu =0 # (m) ant2-maxaveep =1 ant2-initrst =on # (0:off,1:on) misc-timeinterp =on # (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 = file-geexefile = file-solstatfile = file-tracefile =
TODO list
- Keep improving ubx2nmea: https://github.com/holubp/ubx2nmea
- documentation: UBLOX M8 protocol specs
- possible starting points:
References and useful reading
- Very useful RTKLIB Explorer site