GNSS precise point positioning (PPP)
This cookbook chapter describes an example of GNSS precise point positioning (PPP) for a ground station using GPS, GLONASS, and Galileo. For information on how to generate the GNSS products (orbits, clocks, signal biases, etc.) required for PPP, see the cookbook GNSS satellite orbit determination and station network analysis.
Scientific details about the underlying processing approach and the applied parametrizations, models, and corrections can be found in a doctoral thesis available under DOI 10.3217/978-3-85125-885-1.
An example scenario for this task is available at https://ftp.tugraz.at/outgoing/ITSG/groops/scenario/scenarioGnssPPP.zip. It includes GROOPS scripts and data for the example, but not the general GROOPS data and metadata found at https://ftp.tugraz.at/outgoing/ITSG/groops (data folder or zipped archive). The scenario generally represents what is described in this cookbook, but may slightly differ in certain settings.
Data preparation
Most of the required metadata files are provided in GROOPS file formats at https://ftp.tugraz.at/outgoing/ITSG/groops. These files are regularly updated.
Data that has to be gathered from other sources comprises:
- Receiver observations: GNSS measurements converted from RINEX format (see RinexObservation2GnssReceiver)
- Precise orbits: precise orbits in CRF for orbit integration (see Sp3Format2Orbit)
- Precise clocks: precise clocks (see GnssClockRinex2InstrumentClock)
- Attitude: rotation from body frame to CRF (see SimulateStarCameraGnss or GnssOrbex2StarCamera)
- Signal biases: code (and phase) biases (see GnssSinexBias2SignalBias)
The example scenario includes a small set of this data.
The script 010groopsConvert.xml
can be used to convert these external formats into GROOPS formats.
Prepare a station list file that contains the stations (one per line) to be processed.
Processing of a ground station
The script 02groopsGnssProcessing.xml
in the example scenario
implements the following steps and settings.
These are the settings for GnssProcessing. If not otherwise stated use the default values.
The first step is setting the processing sampling, in this example it is 30 seconds.
The processing interval usually is a single 24-hour day,
timeSeries:uniformSampling with timeStart=<mjd>
,
timeEnd=<mjd>+1
, sampling=30/86400
(processing sampling).
Add the appropriate transmitters:gnss (e.g. GPS, GLONASS, and Galileo) and provide the required files (from Data preparation):
The following settings are needed in receiver:stationNetwork:
- inputfileStationList: list of all stations to be processed
- inputfileObservations: The converted RINEX observation file.
- tidalDisplacement: Use the settings described in receiver:stationNetwork.
-
useType: We recommend to explicitly specify the signals to be processed
and to make sure that at least transmitter code biases are provided for each of them, e.g.
C1CG
,C1WG
,C2WG
,L1*G
,L2*G
, ...). -
excludeType: Signals you might want to exclude are
L5*G
(GPS L5 phase due to time-variable bias on block IIF satellites),*3*R
(GLONASS G3 freq.),*6*E
(Galileo E6 freq.)
Add the following parametrizations and define the outputfiles you are interested in inside each of them:
- ionosphereSTEC: add a constraint of sigmaSTEC=
40
- ionosphereVTEC
- clocks: delete selectTransmitters
- signalBiases: provide inputfileSignalBiasTransmitter from Data preparation.
- ambiguities: if precise transmitter phase biases are available you can delete estimateTransmitterPhaseBiases
-
codeBiases: delete selectTransmitters, set sigmaZeroMeanConstraint=
0
-
tecBiases: delete selectTransmitters, set sigmaZeroMeanConstraint=
0
- kinematicPositions
-
troposphere: select troposphere:viennaMapping
with the appropriate vmf3grid file. Add troposphereWetEstimation:splines
with linear (degree=
1
) 2-hourly splines and troposphereGradientEstimation:splines with linear daily splines. -
constraints: loose constraint troposphere estimates,
parameters:wildcard:type=
troposphere*
, sigma=5
, and relativeToApriori=yes
Add the following processingSteps:
- estimate: with maxIterationCount=
8
- resolveAmbiguities
-
estimate: with maxIterationCount=
2
- writeResults
When processing multiple stations at the same time, moving estimate and resolveAmbiguities into the processing step forEachReceiverSeparately sets up and solves the normal equations independently for each station.