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

From OpenStreetMap Wiki
(Redirected from Workflow with M8T receivers)
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