GNSS satellite orbit determination and station network analysis

This cookbook chapter describes an example of global GNSS processing as done by analysis centers of the International GNSS Service (IGS). Resulting products usually comprise:

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/scenarioGnssNetwork.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.

Note: Global GNSS processing can become very computationally intensive. Depending on the number of satellites and stations, the observation and processing sampling, and parametrizations it can quickly exceed the capabilities of a normal desktop computer and may require computer clusters or number crunchers (see section Parallelization).

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, broadcast ephemerides, and precise satellite orbits and clocks can be downloaded from the IGS Data Centers. GPS, GLONASS, and Galileo orbits and clocks for the period 1994-2020 are also available as part of Graz University of Technology's contribution to IGS repro3.

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 to be processed. Each line can contain more than one station. The first station in each line that has data available is used for the processing. If your network contains more than 60-70 stations, it is recommended to start processing with a core network (see Advanced). In this case, define an additional core station list file that can also have multiple stations per line.

Preprocessing: Orbit integration

Numerical integration of the satellite orbits is the first step in global GNSS processing. Dynamic orbits are integrated based on force models and then fitted to the approximate orbits by estimating their initial state and additional empirical parameters for solar radiation pressure to improve the orbit fit. The resulting variational equations file contains the integrated orbit, derivatives with respect to the satellite state vector, attitude, Earth rotation and satellite model.

Orbit preprocessing is covered by the script 020groopsGnssPreprocessing.xml in the example scenario.

It is recommended to perform the steps below in a loop over all satellites/PRNs using LoopPrograms. To get the relation between {prn} and {svn} setup an additional loop:platformEquipment inside loop:loop with

This second loop should perform only one step. The following programs are looped over all {prn}:

Force models usually include:

For the spherical harmonics expansions a maxDegree=60 is more than enough.

The result of the preprocessing should be a variational equations file, a reduced dynamic orbit file from PreprocessingVariationalEquationOrbitFit and an attitude file from SimulateStarCameraGnss for each satellite.

GNSS processing

The script 030groopsGnssProcessing.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, therefore define 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:

The following settings are needed in receiver:stationNetwork:

Add the following parametrizations and define the outputfiles you are interested in inside each of them:

Finally, define the processingSteps. This can be overwhelming at first, but offers a lot of flexibility. The example script uses a 5-minute processing sampling with subsequent clock densification to 30 seconds.

With some additional steps, the full 30-second sampling can be used to estimate all parameters (not only the clocks). These steps are disabled in the example script, as they require at least 16 GB of system memory. In this case, it is not necessary to separately write the 30-second clock files as listed above.

Advanced: Processing large station networks

Processing large station networks requires some additional steps to keep the computational load to a reasonable degree. The general processing strategy is to first process a well-distributed subset of stations (i.e. a core network) to get good estimates of all satellite parameters, which then enables integer ambiguity resolution (IAR). Once the ambiguities of the core network are resolved and stable estimates for satellite phase biases are available, all other (non-core) stations can be processed individually (including IAR) while keeping the satellite parameters fixed. At last, all stations can be processed together with all satellite parameters and ionosphere parameters.

Let's start with the processingSteps of the core network:

Now all other (non-core) stations can be processed separately:

Next all stations are processed together with all parameters: