User:RTK Kinematic and more than 1Hz frequency workflow with Ublox M8T receivers

From OpenStreetMap Wiki
Jump to navigation Jump to search

Prerequisites

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

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

  1. Generate OBS and SBS files:
 for i in *.ubx; do convbin -od -os -oi -ot -f 1 $i; done
  1. Get base station measurements
 mkdir base-meas && cd base-meas
 get-euref.sh
  1. 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

References and useful reading