Skip to content

Examples

PPPx ships with ready-to-run examples under the example/ directory of the repository. They are the fastest way to confirm your installation works and to see realistic configurations.

This example processes the ZIM2 station (Zimmerwald, Switzerland) with several configurations. By default it uses GPS + Galileo (RTK uses GPS only). Run the whole set with:

Terminal window
cd example/pppx
./run.sh

run.sh unzips the bundled products and runs each *.ini, writing the .pos, .log, and .stat files (and a plot) into a folder per case.

FileRole
ZIM200CHE_R_20221000000_01D_30S_MO.rnxRover (multi-GNSS, 30 s)
ZIMM00CHE_R_20221000000_01D_30S_MO.rnxReference station (RTK base)
ALGO00CAN_R_20221000000_15M_01S_MO.rnxHigh-rate (1 s) data for TDP

Products (CODE MGEX final, plus broadcast / GIM / VMF1)

Section titled “Products (CODE MGEX final, plus broadcast / GIM / VMF1)”
ProductDescription
BRDC00IGS_R_20221000000_01D_MN.rnxBroadcast ephemeris
COD0MGXFIN_20221000000_01D_05M_ORB.SP3Precise orbit
COD0MGXFIN_20221000000_01D_30S_CLK.CLKPrecise clock
COD0MGXFIN_20221000000_01D_15M_ATT.OBXSatellite attitude
COD0MGXFIN_20221000000_01D_01D_OSB.BIASatellite bias (OSB)
COD0MGXFIN_20221000000_03D_12H_ERP.ERPEarth rotation params
codg1000.22iGlobal ionospheric map
VMFG_2022100VMF1 grid

Two configurations compare the ionosphere-free combination against a single-frequency solution that fixes the ionosphere with a GIM. Both use the LSQ solver and broadcast ephemeris.

Terminal window
pppx -c 00_spp_if.ini rinex/ZIM200CHE_R_20221000000_01D_30S_MO.rnx # IF combination
pppx -c 01_spp_sf.ini rinex/ZIM200CHE_R_20221000000_01D_30S_MO.rnx # single-frequency + GIM
00_spp_if.ini (IF)01_spp_sf.ini (SF + GIM)
SPP IF solutionSPP SF solution

At mid-latitude the single-frequency solution is actually the better of the two: the GIM corrects the ionosphere well, while the IF combination amplifies pseudorange noise (~3×).

The same data processed with the EKF (forward-only, simulating real-time) and the FGO (batch post-processing) solvers, using precise products.

Terminal window
pppx -c 02_ppp_ekf.ini rinex/ZIM200CHE_R_20221000000_01D_30S_MO.rnx # EKF
pppx -c 03_ppp_fgo.ini rinex/ZIM200CHE_R_20221000000_01D_30S_MO.rnx # FGO
02_ppp_ekf.ini (EKF)03_ppp_fgo.ini (FGO)
PPP EKF solutionPPP FGO solution

The EKF shows the familiar ~15-minute convergence period because it solves epoch-by-epoch; the FGO forms one large least-squares problem over the whole session, so there is no convergence ramp.

A short baseline between ZIM2 (rover) and ZIMM (base), EKF solver. Because the baseline is short, [model] trop and iono are set to none.

Terminal window
pppx -c 06_rtk.ini rinex/ZIM200CHE_R_20221000000_01D_30S_MO.rnx rinex/ZIMM00CHE_R_20221000000_01D_30S_MO.rnx

RTK short-baseline solution

With the ambiguities resolved, the precision is typical for a short baseline: about 0.24 cm (east), 0.28 cm (north), and 0.48 cm (up).

TDP targets rapid displacement monitoring (e.g. earthquakes): it eliminates the ambiguities by differencing adjacent epochs, estimates the displacement between them, and accumulates it onto the initial position. It is run on the high-rate (1 Hz) ALGO data with precise products (to minimise drift from error accumulation).

Terminal window
pppx -c 07_tdp.ini rinex/ALGO00CAN_R_20221000000_15M_01S_MO.rnx

TDP solution for ALGO

For the static ALGO station (zero true displacement), the precision over 15 minutes is about 0.28 cm (east), 0.59 cm (north), and 0.93 cm (up).

This example reproduces the high-precision ZTD estimation from Android smartphone GNSS published in Atmospheric Measurement Techniques. Three devices recorded 24 h of data: a geodetic station (ETH2), a u-blox receiver (UBLX), and a Google Pixel 4XL (PIXL).

Download the dataset from the ETH Research Collection, unzip it into the example folder, convert the Hatanaka .23d files to .23o, and run:

Terminal window
unzip dataset_2023-05-18.zip
cd dataset_2023-05-18/
for f in *.23d; do crx2rnx $f; done
./run.sh
python plot_ztd.py

The ZTD estimates appear in the last three columns of each .pos file (ZTD = zhd + zwd + dzwd).