Introduction

Benefits from the modernized global positioning system (GPS), the revitalization of GLONASS, the newly developed BeiDou navigation satellite system (BDS), and Galileo, create a multi-constellation, multi-frequency global navigation satellite system (GNSS) that has been recognized as a powerful tool not only in positioning, navigation, and timing (PNT) (Li et al. 2015a), but also in remote sensing of the troposphere (Li et al. 2015b) and the ionosphere (Ren et al. 2016). With more and more satellites being in view, multi-constellation and multi-frequency GNSS precise positioning has become a very hot research topic (Cai et al. 2015).

To meet the demand for multi-GNSS precise positioning applications, we developed the GAMP (GNSS Analysis software for Multi-constellation and multi-frequency Precise positioning) software. It is a secondary development based on RTKLIB (Takasu and Yasuda 2009), which is simply derived from the RTK (real-time kinematic) library. Thanks to its flexible batch processing feature, GAMP is convenient and powerful to use and will maximally benefit multi-station and multi-session processing. We mainly focus on the multi-GNSS precise point positioning (PPP) using undifferenced and uncombined observations. It is very flexible when processing multi-frequency GNSS observations, avoiding noise amplification and being able to extract ionospheric delays (Liu et al. 2017; Xiang et al. 2017).

The following sections start with a brief theoretical background. The GAMP software is then introduced, and some important new features, modifications, and auxiliary tools are highlighted. Afterward, the convergence performance of single- and dual-frequency PPP based on undifferenced and uncombined observations is assessed. Finally, the conclusions and an outlook for future improvements are provided.

Mathematical models

The linearized pseudorange and carrier phase observation equations are first derived. Then, the models of standard and ionosphere-constrained single- and dual-frequency PPP based on undifferenced and uncombined observations are introduced.

General GNSS observation models

The linearized equations of original pseudorange and carrier phase observations are written as (Leick et al. 2015)

$$p_{r,j}^{s,T} = \varvec{u}_{r}^{s,T} \cdot \varvec{x} + {\text{d}}t_{r} - {\text{d}}t^{s,T} + M_{\text{w}} \cdot Z_{\text{w}} + \gamma_{j}^{T} \cdot I_{r,1}^{s,T} + \left( {d_{r,j}^{s,T} - d_{j}^{s,T} } \right) + \varepsilon_{r,j}^{s,T}$$
(1)
$$l_{r,j}^{s,T} = \varvec{u}_{r}^{s,T} \cdot \varvec{x} + {\text{d}}t_{r} - {\text{d}}t^{s,T} + M_{\text{w}} \cdot Z_{\text{w}} - \gamma_{j}^{T} \cdot I_{r,1}^{s,T} + \lambda_{j}^{s,T} \cdot \left( {N_{r,j}^{s,T} + b_{r,j}^{s,T} - b_{j}^{s,T} } \right) + \xi_{r,j}^{s,T}$$
(2)

where indices s, r, and j (j = 1, 2) refer to the satellite, receiver, and carrier frequency band, respectively; superscript T denotes satellite system; p s,Tr,j , and l s,Tr,j denote observed minus computed (OMC) values of pseudorange and carrier phase observables, respectively; \(\varvec{u}_{r}^{s,T}\) is the unit vector of the component from the receiver to the satellite; \(\varvec{x}\) is the vector of the receiver position increments relative to the a priori position; dtr and dts,T are the receiver and satellite clock offsets, respectively; Mw is the wet mapping function; Zw is the zenith wet delay; I s,Tr,1 is the line-of-sight (LOS) ionospheric delay on the frequency f s,T1 ; γ Tj is the frequency-dependent multiplier factor (γ Tj  = (f s,T1 /f s,Tj )2), which is independent of the satellite pseudorandom noise (PRN) code; d s,Tr,j is the frequency-dependent receiver uncalibrated code delay (UCD) with respect to satellite s; d s,Tj is the frequency-dependent satellite UCD; λ s,Tj is the carrier wavelength on the frequency band j; N s,Tr,j is the integer phase ambiguity; b s,Tr,j and b s,Tj are the frequency-dependent receiver and satellite uncalibrated phase delays (UPDs); ɛ s,Tr,j and ξ s,Tr,j are the sum of measurement noise and multipath error for pseudorange and carrier phase observations. The satellite and receiver antenna phase center offsets (PCOs) and variations (PCVs), relativistic effects, Sagnac effect, LOS hydrostatic delay, tidal loadings, and phase windup (only for carrier phase) should be modeled (Kouba 2009) in advance. Note that all the variables in (1) and (2) are expressed in meters except the ambiguity and UPDs in cycles.

For convenience, the following notations are defined as

$$\left\{ {\begin{array}{*{20}l} {\alpha_{mn}^{T} = \frac{{\left( {f_{m}^{s,T} } \right)^{2} }}{{\left( {f_{m}^{s,T} } \right)^{2} - \left( {f_{n}^{s,T} } \right)^{2} }},} \hfill & {\beta_{mn}^{T} = - \frac{{\left( {f_{n}^{s,T} } \right)^{2} }}{{\left( {f_{m}^{s,T} } \right)^{2} - \left( {f_{n}^{s,T} } \right)^{2} }}} \hfill \\ {{\text{DCB}}_{{P_{m} P_{n} }}^{s,T} = d_{m}^{s,T} - d_{n}^{s,T} ,} \hfill & {{\text{DCB}}_{{r,P_{m} P_{n} }}^{s,T} = d_{r,m}^{s,T} - d_{r,n}^{s,T} } \hfill \\ {d_{{IF_{mn} }}^{s,T} = \alpha_{mn}^{T} \cdot d_{m}^{s,T} + \beta_{mn}^{T} \cdot d_{n}^{s,T} ,} \hfill & {d_{{r,IF_{mn} }}^{s,T} = \alpha_{mn}^{T} \cdot d_{r,m}^{s,T} + \beta_{mn}^{T} \cdot d_{r,n}^{s,T} } \hfill \\ \end{array} } \right.$$
(3)

where fs,T is the signal frequency (\(m,n = 1,2; \, m \ne n\)); α Tmn and β Tmn are frequency-dependent factors, which are independent of the satellite PRN code; \({\text{DCB}}_{{P_{m} P_{n} }}^{s,T}\) and \({\text{DCB}}_{{r,P_{m} P_{n} }}^{s,T}\) are frequency-dependent satellite and receiver differential code bias (DCB) between pseudorange P s,Tr,m and P s,Tr,n .

By convention, the IGS precise satellite clock products are generated using the ionospheric-free (IF) observables and the resulting satellite clock offsets absorb the IF combination of satellite UCDs as follows (Kouba and Héroux 2001)

$$\begin{aligned} {\text{d}}t_{{{\text{IF}}_{12} }}^{s,T} & = {\text{d}}t^{s,T} + \left( {\alpha_{12}^{T} \cdot d_{1}^{s,T} + \beta_{12}^{T} \cdot d_{2}^{s,T} } \right) \\ & = {\text{d}}t^{s,T} + d_{{{\text{IF}}_{12} }}^{s,T} \\ \end{aligned}$$
(4)

Substitute (4) into (1) and (2) and apply the International GNSS Service (IGS) precise satellite orbit and clock products to get

$$\left\{ {\begin{array}{*{20}l} {\begin{array}{*{20}l} {p_{r,1}^{s,T} = \varvec{u}_{r}^{s,T} \cdot \varvec{x} + {\text{d}}t_{r} + d_{r,1}^{s,T} + M_{\text{w}} \cdot Z_{\text{w}} + I_{r,1}^{s,T} } \hfill \\ {\quad \quad \quad - \,\beta_{12}^{T} \cdot {\text{DCB}}_{{P_{1} P_{2} }}^{s,T} + \varepsilon_{r,1}^{s,T} } \hfill \\ {p_{r,2}^{s,T} = \varvec{u}_{r}^{s,T} \cdot \varvec{x} + {\text{d}}t_{r} + d_{r,2}^{s,T} + M_{\text{w}} \cdot Z_{\text{w}} + \gamma_{2}^{T} \cdot I_{r,1}^{s,T} } \hfill \\ {\quad \quad \quad +\, \alpha_{12}^{T} \cdot {\text{DCB}}_{{P_{1} P_{2} }}^{s,T} + \varepsilon_{r,2}^{s,T} } \hfill \\ \end{array} } \hfill \\ \end{array} } \right.$$
(5)
$$\left\{ {\begin{array}{*{20}l} {l_{r,1}^{s,T} = \varvec{u}_{r}^{s,T} \cdot \varvec{x} + {\text{d}}t_{r} + M_{\text{w}} \cdot Z_{\text{w}} - I_{r,1}^{s,T} + d_{{{\text{IF}}_{12} }}^{s,T} } \hfill \\ {\quad \quad \quad + \,\lambda_{1}^{s,T} \cdot \left( {N_{r,1}^{s,T} + b_{r,1}^{s,T} - b_{1}^{s,T} } \right) + \xi_{r,1}^{s,T} } \hfill \\ {l_{r,2}^{s,T} = \varvec{u}_{r}^{s,T} \cdot {\varvec{x}} + {\text{d}}t_{r} + M_{\text{w}} \cdot Z_{\text{w}} - \gamma_{2}^{T} \cdot I_{r,1}^{s,T} + d_{{{\text{IF}}_{12} }}^{s,T} } \hfill \\ {\quad \quad \quad + \,\lambda_{2}^{s,T} \cdot \left( {N_{r,2}^{s,T} + b_{r,2}^{s,T} - b_{2}^{s,T} } \right) + \xi_{r,2}^{s,T} } \hfill \\ \end{array} } \right.$$
(6)

The receiver UCDs are identical for code-division multiple access (CDMA) signals (i.e., GPS, BDS, and Galileo) for all the satellites at each frequency, while they are different for GLONASS due to the application of frequency division multiple access (FDMA) technique. Note that correcting for satellite DCBs or not is both allowed in the standard PPP model, whereas the satellite DCBs must be corrected in the ionosphere-constrained PPP model in advance. If correcting for them, the DCB products from the Center for Orbit Determination in Europe (CODE) or the Multi-GNSS Experiment (MGEX) can be used.

Standard single-frequency PPP

In the standard single-frequency PPP, the receiver UCDs (d Tr,1 ) can be absorbed by the receiver clock offset. Assuming m satellites are simultaneously tracked by the receiver r, Eqs. (5) and (6) can be rewritten as

$$\left[ \begin{aligned} p_{r,1}^{1,T} \\ l_{r,1}^{1,T} \\ \vdots \\ p_{r,1}^{m,T} \\ l_{r,1}^{m,T} \\ \end{aligned} \right] = \left[ {\begin{array}{*{20}c} { - \varvec{u}_{r} } &\quad \varvec{1} &\quad {\varvec{M}_{\text{w}} } &\quad \varvec{K} &\quad {\varvec{R}_{1} } \\ \end{array} } \right]\left[ \begin{aligned} {\varvec{x}} \\ {\text{d}}\bar{t}_{r}^{T} \\ Z_{\text{w}} \\ \varvec{I}_{r,1}^{T} \\ \bar{\varvec{N}}_{r,1}^{T} \\ \end{aligned} \right] + \left[ \begin{aligned} {\varvec{\upvarepsilon}}_{r,1}^{T} \hfill \\ {\varvec{\upxi}}_{r,1}^{T} \hfill \\ \end{aligned} \right], \, \varvec{Q}_{{\varvec{L}}}$$
(7)

with

$$\left\{ {\begin{array}{*{20}l} {{\text{d}}\bar{t}_{r}^{T} = {\text{d}}t_{r} + d_{r,1}^{T} } \hfill \\ {\bar{N}_{r,1}^{s,T} = \lambda_{1}^{T} \cdot \left( {N_{r,1}^{s,T} + b_{r,1}^{s,T} - b_{1}^{s,T} } \right) + d_{{IF_{12} }}^{s,T} - d_{r,1}^{T} } \hfill \\ \end{array} } \right.$$
(8)

where \(\varvec{1}\) is a vector of 2 × m rows and one column, of which each element is one, corresponding to the receiver clock parameter \({\text{d}}\bar{t}_{r,T}\); in matrix \(\varvec{K}\), the element for the corresponding p s,Tr,1 is 1, while the element for l s,Tr,1 is − 1, corresponding to the ionospheric parameter \(\varvec{I}_{r,1}^{T}\); \(\varvec{R}_{1}\) is the matrix corresponding to the ambiguity parameters \({\bar{\varvec{N}}}_{r,1}^{T}\); the element for the corresponding p s,Tr,1 is 0, while for l s,Tr,1 is 1; \(\varvec{Q}_{{\varvec{L}}}\) denotes the stochastic model of OMC observables.

Ionosphere-constrained single-frequency PPP

Unlike the standard single-frequency PPP, the ionosphere-constrained single-frequency PPP adds virtual observations for ionospheric parameters and their corresponding constraints to the observation equations as follows

$$\left[ \begin{aligned} p_{r,1}^{1,T} \\ l_{r,1}^{1,T} \\ \vdots \\ p_{r,1}^{m,T} \\ l_{r,1}^{m,T} \\ \tilde{I}_{r,1}^{1,T} \\ \vdots \\ \tilde{I}_{r,1}^{m,T} \\ \end{aligned} \right] = \left[ {\begin{array}{*{20}c} { - {\varvec{u}}_{r} } & {\varvec{1}} & {{\varvec{M}}_{\text{w}} } & {\varvec{K}} & {{\varvec{R}}_{1} } \\ {\varvec{O}} & {\varvec{O}} & {\varvec{O}} & {\varvec{I}} & {\varvec{O}} \\ \end{array} } \right]\left[ \begin{aligned} {\varvec{x}} \\ {\text{d}}\bar{t}_{r}^{T} \\ Z_{\text{w}} \\ {\varvec{I}}_{r,1}^{T} \\ {\bar{\varvec{N}}}_{r,1}^{T} \\ \end{aligned} \right] + \left[ \begin{aligned} {\varvec{\upvarepsilon}}_{r,1}^{T} \hfill \\ {\varvec{\upxi}}_{r,1}^{T} \hfill \\ {\varvec{\upvarepsilon}}_{r,ion}^{T} \hfill \\ \end{aligned} \right], \, {\varvec{Q}}_{{\varvec{L}}} , \, {\varvec{Q}}_{I}$$
(9)

where \(\tilde{I}_{r,1}^{s,T}\) is derived from external ionospheric products, such as global ionosphere maps (GIMs, Hernández-Pajares et al. 2009) or an available regional ionosphere model (Yao et al. 2013) with corresponding noise \({\varvec{\upvarepsilon}}_{{r,{\text{ion}}}}^{T}\); \({\varvec{Q}}_{I}\) denotes the stochastic model of virtual ionospheric observables; \({\varvec{O}}\) is zero matrix.

Standard dual-frequency PPP

In the dual-frequency PPP model, the receiver UCDs are absorbed by both receiver clock offset and LOS ionospheric delay parameters. Equations (5) and (6) can be rewritten as

$$\left[ \begin{aligned} p_{r,1}^{1,T} \\ l_{r,1}^{1,T} \\ \vdots \\ p_{r,2}^{m,T} \\ l_{r,2}^{m,T} \\ \end{aligned} \right] = \left[ {\begin{array}{*{20}c} { - {\varvec{u}}_{r} } &\quad {\varvec{1}} &\quad {{\varvec{M}}_{\text{w}} } & \quad {\varvec{K}} &\quad {{\varvec{R}}_{1} } &\quad {{\varvec{R}}_{2} } \\ \end{array} } \right]\left[ \begin{aligned} {\varvec{x}} \\ {\text{d}}\bar{t}_{r}^{T} \\ Z_{\text{w}} \\ {\bar{\varvec{I}}}_{r,1}^{T} \\ {\bar{\varvec{N}}}_{r,1}^{T} \\ {\bar{\varvec{N}}}_{r,2}^{T} \\ \end{aligned} \right] + \left[ \begin{aligned} {\varvec{\upvarepsilon}}_{r,1}^{T} \hfill \\ {\varvec{\upxi}}_{r,1}^{T} \hfill \\ \end{aligned} \right], \, {\varvec{Q}}_{{\varvec{L}}}$$
(10)

with

$$\left\{ {\begin{array}{*{20}l} {{\text{d}}\bar{t}_{r}^{T} = {\text{d}}t_{r} + d_{{r,{\text{IF}}_{12} }}^{T} } \hfill \\ {\bar{I}_{r,1}^{s,T} = I_{r,1}^{s,T} + \beta_{12}^{T} \cdot \left( {{\text{DCB}}_{{r,P_{1} P_{2} }}^{T} - {\text{DCB}}_{{P_{1} P_{2} }}^{s,T} } \right)} \hfill \\ {\bar{N}_{r,1}^{s,T} = \lambda_{1}^{T} \cdot \left( {N_{r,1}^{s,T} + b_{r,1}^{s,T} - b_{1}^{s,T} } \right) + d_{{{\text{IF}}_{12} }}^{s,T} - d_{{r,{\text{IF}}_{12} }}^{s,T} } \hfill \\ {\quad \quad \quad +\, \beta_{12}^{T} \cdot \left( {{\text{DCB}}_{{r,P_{1} P_{2} }}^{T} - {\text{DCB}}_{{P_{1} P_{2} }}^{s,T} } \right)} \hfill \\ {\bar{N}_{r,2}^{s,T} = \lambda_{2}^{T} \cdot \left( {N_{r,2}^{s,T} + b_{r,2}^{s,T} - b_{2}^{s,T} } \right) + d_{{{\text{IF}}_{12} }}^{s,T} - d_{{r,{\text{IF}}_{12} }}^{s,T} } \hfill \\ {\quad \quad \quad +\, \gamma_{2}^{T} \cdot \beta_{12}^{T} \cdot \left( {{\text{DCB}}_{{r,P_{1} P_{2} }}^{T} - {\text{DCB}}_{{P_{1} P_{2} }}^{s,T} } \right)} \hfill \\ \end{array} } \right.$$
(11)

where \({\varvec{R}}_{2}\) is the matrix corresponding to the ambiguity parameters \({\bar{\varvec{N}}}_{r,2}^{T}\), the element for the corresponding p s,Tr,2 is 0, while for l s,Tr,2 is 1.

Ionosphere-constrained dual-frequency PPP

Ionosphere-constrained dual-frequency PPP adds virtual observations for ionospheric parameters and their corresponding constraints to the observation equations as follows

$$\left[ \begin{aligned} p_{r,1}^{1,T} \\ l_{r,1}^{1,T} \\ \vdots \\ p_{r,2}^{m,T} \\ l_{r,2}^{m,T} \\ \tilde{I}_{r,1}^{1,T} \\ \vdots \\ \tilde{I}_{r,1}^{m,T} \\ \end{aligned} \right] = \left[ {\begin{array}{*{20}c} { - {\varvec{u}}_{r} } & {\varvec{1}} & {\varvec{J}} & {{\varvec{M}}_{\text{w}} } & {\varvec{K}} & {{\varvec{R}}_{1} } & {{\varvec{R}}_{2} } \\ {\varvec{O}} & {\varvec{O}} & {\varvec{O}} & {\varvec{O}} & {\varvec{I}} & {\varvec{O}} & {\varvec{O}} \\ \end{array} } \right]\left[ \begin{aligned} {\varvec{x}} \\ {\text{d}}\bar{t}_{r}^{T} \\ {\text{DCB}}_{{r,P_{1} P_{2} }}^{T} \\ Z_{\text{w}} \\ {\varvec{I}}_{r,1}^{T} \\ {\bar{\varvec{N}}}_{r,1}^{T} \\ {\bar{\varvec{N}}}_{r,2}^{T} \\ \end{aligned} \right] + \left[ \begin{aligned} {\varvec{\upvarepsilon}}_{r,1}^{T} \hfill \\ {\varvec{\upxi}}_{r,1}^{T} \hfill \\ {\varvec{\upvarepsilon}}_{r,ion}^{T} \hfill \\ \end{aligned} \right], \, {\varvec{Q}}_{{\varvec{L}}} , \, {\varvec{Q}}_{I}$$
(12)

with

$$\left\{ {\begin{array}{*{20}l} {\bar{N}_{r,1}^{s,T} = \lambda_{1}^{T} \cdot \left( {N_{r,1}^{s,T} + b_{r,1}^{s,T} - b_{1}^{s,T} } \right) + d_{{{\text{IF}}_{12} }}^{s,T} - d_{{r,{\text{IF}}_{12} }}^{s,T} } \hfill \\ {\bar{N}_{r,2}^{s,T} = \lambda_{2}^{T} \cdot \left( {N_{r,2}^{s,T} + b_{r,2}^{s,T} - b_{2}^{s,T} } \right) + d_{{{\text{IF}}_{12} }}^{s,T} - d_{{r,{\text{IF}}_{12} }}^{s,T} } \hfill \\ \end{array} } \right.$$
(13)

where for matrix \({\varvec{J}}\) the element for the corresponding p s,Tr,1 is β T12 , while the element for p s,Tr,2 is − α T12 , corresponding to the receiver DCBs (\({\text{DCB}}_{{r,P_{1} P_{2} }}^{T}\)).

GAMP software

The GAMP software was written in the platform-independent ANSI C language. It can compile and run on the popular operating systems, such as Windows, UNIX/Linux, and Macintosh. It is recommended that one debugs GAMP under Microsoft Visual Studio (VS) and then compiles and runs it in UNIX/Linux or Macintosh for batch processing.

GAMP is an open-source software, which includes source code files, documents, and examples. The source code can be accessed via the Web site of GPS Toolbox (https://www.ngs.noaa.gov/gps-toolbox/GAMP). Instructions on how to compile, install, and run GAMP can be found in the user manual. To use GAMP well, the document of user manual should be first carefully read and followed. In order to be better familiar with GAMP, Fig. 1 shows the flowchart of PPP processing using the GAMP software.

Fig. 1
figure 1

Flowchart of PPP processing using GAMP software

To run GAMP, the user only needs to specify one input parameter on the command line: the name of the text file contains the configuration information of data processing. Details and descriptions of the configuration file can be found in the user’s manual.

New features and modifications

In the following sections, some key features and modifications are introduced, such as receiver clock jump repair, cycle slip detection, handling schemes of GLONASS pseudorange inter-frequency biases (IFBs), and so on.

Receiver clock jump repair

For undifferenced processing (i.e., PPP), it is necessary to consider the impact of receiver clock jumps. Failure to properly detect and account for receiver clock jumps may sometimes cause blunders in the PPP solution. Therefore, a consistent set of observables can be reconstructed before filtering according to the method proposed by Guo and Zhang (2014).

Cycle slip detection

The detection of cycle slip implements an algorithm based on the work of Blewitt (1990). The algorithm takes the advantage of the combination of the geometry-free (GF) and Melbourne-Wübbena (MW) observables using the original dual-frequency observations. The GF observables are influenced by cycle slips, ionospheric variations, carrier phase multipath effects, etc, while the MW observables are affected by cycle slips, pseudorange noise, multipath effects, etc. Hence, the differences between epoch of GF and MW observables are influenced by observation interval and elevation angles. After a large number of tests using real observations with different intervals and elevation angles, the empirical thresholds are determined as

$$\begin{aligned} R_{\text{GF}} (E,R) = \left\{ {\begin{array}{*{20}l} {({{ - 1.0} \mathord{\left/ {\vphantom {{ - 1.0} {15.0}}} \right. \kern-0pt} {15.0}} \cdot E + 2) \cdot b_{\text{GF}} } \hfill &\quad {E \le 15^{ \circ } } \hfill \\ {b_{\text{GF}} } \hfill &\quad {E > 15^{ \circ } } \hfill \\ \end{array} } \right. \hfill \\ b_{\text{GF}} (R) = \left\{ {\begin{array}{*{20}l} {0.05{\text{ m}}} \hfill &\quad {0 < R \le 1{\text{ s}}} \hfill \\ {{{0.1} \mathord{\left/ {\vphantom {{0.1} {20.0 \cdot R + 0.05}}} \right. \kern-0pt} {20.0 \cdot R + 0.05}}{\text{ m}}} \hfill &\quad {1 < R \le 20{\text{ s}}} \hfill \\ {0.15{\text{ m}}} \hfill &\quad {20 < R \le 60{\text{ s}}} \hfill \\ {0.25{\text{ m}}} \hfill &\quad {60 < R \le 100{\text{ s}}} \hfill \\ {0.35{\text{ m}}} \hfill &\quad {\text{otherwise}} \hfill \\ \end{array} } \right. \hfill \\ \end{aligned}$$
(14)
$$\begin{aligned} R_{\text{MW}} (E,R) = \left\{ {\begin{array}{*{20}l} {( - 0.1 \cdot E + 3) \cdot b_{\text{MW}} } \hfill &\quad {E \le 20^{ \circ } } \hfill \\ {b_{\text{MW}} } \hfill &\quad {E > 20^{ \circ } } \hfill \\ \end{array} } \right. \hfill \\ b_{\text{MW}} (R) = \left\{ {\begin{array}{*{20}l} { 2. 5 {\text{ c}}} \hfill &\quad {0 < R \le 1{\text{ s}}} \hfill \\ {{{ 2. 5} \mathord{\left/ {\vphantom {{ 2. 5} {20.0 \cdot R + 2.5}}} \right. \kern-0pt} {20.0 \cdot R + 2.5}}{\text{ c}}} \hfill &\quad {1 < R \le 20{\text{ s}}} \hfill \\ { 5. 0 {\text{ c}}} \hfill &\quad {20 < R \le 60{\text{ s}}} \hfill \\ { 7. 5 {\text{ c}}} \hfill &\quad {\text{otherwise}} \hfill \\ \end{array} } \right. \hfill \\ \end{aligned}$$
(15)

where E is elevation angle; R is observation interval; \({\text{m}}\) and \({\text{c}}\) denote meters and cycles, respectively.

Receiver PCO and PCVs

BDS- and Galileo-specific receiver PCOs and PCVs are not provided in the current igs14.atx. Besides, some receiver antennas do not have the GLONASS-specific PCV corrections. In these cases, GPS-specific receiver PCOs and PCVs are applied instead. Moreover, both elevation- and azimuth-dependent PCV corrections are considered in GAMP.

Handling of GLONASS pseudorange inter-frequency biases (IFBs)

Through a re-parameterization process, the following five handling schemes of GLONASS pseudorange IFBs are proposed: neglecting IFBs, modeling IFBs as a linear or quadratic polynomial function of frequency numbers, estimating IFBs for each GLONASS frequency number, and estimating IFBs for each GLONASS satellite. For more details about the five handling schemes, we refer to Zhou et al. (2018).

Output of GAMP

A simple but unified format of output files, including positioning results, number of satellites, satellite elevation angles, pseudorange and carrier phase residuals, and slant Total Electron Content (sTEC), is designed for analysis and plotting. Each line of the output files starts with 4-digit year, month, day, hour, minute, second, GPS week, and GPS seconds of week. The other columns are the corresponding results. Each element is separated by space, which is very convenient for analysis and plotting tools, such as MATLAB, Python.

A new receiver data exchange format—RCVEX

MATLAB or Python is very suitable for GNSS algorithm developers and new GNSS users. However, GNSS data processing may be time-consuming using the software tools written in MATLAB or Python. In order to improve processing efficiency, a new GNSS receiver data exchange format is designed. Following the convention of Receiver Independent Exchange (RINEX), this exchange format can be referred to as “RCVEX.” The RCVEX format consists of a header section and a data section. The RCVEX data format should at least allow for exchange of the following information, to ensure interoperability:

  • the marker name, the receiver type, and the antenna type

  • the precise a priori station coordinates (in XYZ format, mm-level precision), which are used as reference coordinates and obtained from the IGS weekly Solution Independent Exchange (SINEX) files and the externally supplied site coordinate file

  • the observation sampling interval

  • the selected observation type for GPS, GLONASS, BDS, and Galileo

  • the tropospheric correction models and mapping functions

  • the type of satellite orbit and clock products

  • the satellite elevation cutoff angles

  • the GLONASS channel numbers

  • the start and end time of the data

For each satellite, the data section provides:

  • the PRNs, the indicator of cycle slip, and eclipse satellite

  • the satellite position (xyz) and clock offsets in meters

  • the azimuth and elevation angles of satellite in degrees

  • the original pseudorange and carrier phase observations

  • the tropospheric zenith total delays and the wet mapping function

  • the Sagnac effect

  • the tidal deformations, including solid earth tides, pole tides, and ocean tides, which are mapped into LOS directions

  • the PCO and PCV corrections at each frequency

  • the phase windup in cycles

It is noteworthy that the indicator of eclipse satellite represents that a satellite is in the eclipsing period, where the observations should be downweighted in the PPP processing. Furthermore, a MATLAB program is provided to read RCVEX files and show how the above parameters and information could be used by users.

Auxiliary tools

Some auxiliary tools are provided to enhance the efficiency of data preparation and result analysis. In the following sections, two key auxiliary tools for data download, results analysis, and plotting are introduced. Both of them are very suitable for batch processing.

Data download

Some simple C shell scripts are provided to download GNSS observation data, precise orbit and clock products, IGS SINEX files, earth orientation parameter files, broadcast ephemeris files, and differential code bias (DCB) files. For example, the script “sh_mgex_obs” can download RINEX 3 files from Institut Geographique National (IGN) and Crustal Dynamics Data Information System (CDDIS). It can convert RINEX 3 long filenames to short filenames according to the file naming rules. Instructions on how to use the scripts are available in the documentation.

Result analysis and plotting

A graphical user interface (GUI) of MATLAB called MatPlot is provided for results analysis and plotting. It can run in Windows, UNIX/Linux, and Macintosh. MatPlot selects files by their suffix name. For example, when you push the button of “Plot PPP,” the files with “.pos” as suffix name will be selected. Once you choose the file(s), the figure(s) will be generated automatically in the chosen directory. More details of MatPlot can be found in the user’s manual.

Moreover, some C shell scripts are provided for plotting results (similar features as MatPlot) in UNIX/Linux and Macintosh using the Generic Mapping Tools (GMT) software (Wessel et al. 2013). To check and view the results quickly, a Perl script called “gnup,” which is from the GNSS-Inferred Positioning System (GIPSY) software, is provided. It calls the executable program of gnuplot. For this application to work, GMT 4 (http://www.soest.hawaii.edu/gmt), Perl (http://www.perl.org), and gnuplot (http://www.gnuplot.info) are required to be installed in advance. The usage of these C shell and Perl scripts can be found in the user’s manual.

Experimental validation

In order to test and validate the GAMP software, the performance of single- and dual-frequency PPP with undifferenced and uncombined observations is evaluated using a 1-month period of data sets in May 2017 from 237 SAtellite POsitioning Service (SAPOS) stations in Germany as shown in Fig. 2. These stations can only track GPS and GLONASS signals. Hence, this example is limited to these systems. However, the software and methodology presented can apply to multi-GNSS (i.e., GPS, GLONASS, BDS, and Galileo) processing. To assess the ionospheric conditions, 3-h Kp index values in the selected period are shown in Fig. 3. Kp index is a global indicator of the earth’s geomagnetic field disturbances and can be used to characterize the ionospheric activity levels. It is noted that the Kp index values are less than 3.0 in most of the time, whereas they are abnormally larger on DOY 148, 2017.

Fig. 2
figure 2

Geographical distribution of the selected 237 SAPOS stations in Germany

Fig. 3
figure 3

Geomagnetic Kp index in May 2017

GPS-, GLONASS-only, and combined GPS + GLONASS PPP in simulated kinematic mode were compared. The initial standard deviation values for pseudorange and carrier phase observations were set to 0.3 and 0.003 m. For combined GPS + GLONASS PPP, the system weighting ratio of GPS to GLONASS was assumed to be 1:1. LOS ionospheric delays were modeled as random walk process with a power density of 4 cm/s0.5 divided by the cosine of zenith distance angles (Geng and Bock 2016). The position coordinates were considered as white noise in kinematic PPP mode. Regarding the results evaluation, the positioning performance was assessed with respect to the average coordinates from seven consecutive daily PPP solutions with the Positioning And Navigation Data Analyst (PANDA, Liu and Ge 2003) software in static mode. For PPP tests, we define “convergence” as obtaining the 3D positioning error less than the predefined threshold at the current epoch and the following twenty epochs, which has been adopted by Li and Zhang (2014). Only when the positioning errors of all twenty epochs are within the threshold, we consider that the position has converged at the current epoch. Here, the threshold is one decimeter for dual-frequency and three decimeters for single-frequency, which has been suggested by Lou et al. (2016).

Results and discussion

The PPP performance in terms of convergence time is evaluated in kinematic mode. In total, there are about 7269 convergence tests used in the experiment. The convergence performance of GPS-, GLONASS-only and combined GPS + GLONASS PPP is assessed using single- and dual-frequency observations.

Single-frequency approach

Figure 4 shows the average convergence time of standard single-frequency PPP on each day over all the test stations. For combined GPS + GLONASS PPP, the average convergence time of each day is comparable; the mean of which is about 56 min with an overall standard deviation (STD) of 3.1 min. There are no significant daily variations in the average convergence time. From the STD values, it is easier to see that the convergence time of GPS + GLONASS is much steadier, whereas the GLONASS ranks the third. The convergence time of GLONASS-only PPP is twice that of GPS-only, which may be due to the existing pseudorange IFBs and lower accuracy of GLONASS orbit and clock products (Guo et al. 2017). Similar results for single-frequency kinematic PPP have been achieved by Lou et al. (2016) using 105 test stations. By adding GLONASS observations, the convergence performance of GPS + GLONASS PPP is significantly improved by 42.1% from 96.1 to 55.6 min, comparing to GPS-only PPP.

Fig. 4
figure 4

Average convergence time of single-frequency GPS-, GLONASS-only (GLO), and the combined GPS + GLONASS (CMB) standard PPP per day

By introducing external ionospheric products, such as GIM from CODE, the average convergence time of the three ionosphere-constrained PPP is all reduced as shown in Fig. 5. Comparing with standard PPP, the convergence time is significantly reduced by 49.8% from 96.1 to 48.2 min and by 41.9% from 55.6 to 32.3 min for of GPS-only and GPS + GLONASS ionosphere-constrained PPP, respectively. However, the convergence time of GLONASS-only is improved a little bit by only 8.2% from 202.2 to 185.7 min, which should be caused by the strong correlation between pseudorange IFBs and LOS ionosphere delays. It can be seen the convergence time of GPS-only and GPS + GLONASS PPP is much longer on DOY 140 and 148, which corresponds to the larger geomagnetic Kp index in Fig. 3.

Fig. 5
figure 5

Average convergence time of single-frequency GPS-, GLONASS-only (GLO), and the combined GPS + GLONASS (CMB) ionosphere-constrained PPP per day

Dual-frequency approach

Figure 6 shows the average convergence time of standard dual-frequency PPP. Similar to single-frequency PPP, by adding GLONASS observations, the convergence time of combined GPS + GLONASS PPP is obviously improved by 40.1% from 34.4 to 20.6 min, comparing to GPS-only PPP.

Fig. 6
figure 6

Average convergence time of dual-frequency GPS-, GLONASS-only (GLO), and the combined GPS + GLONASS (CMB) standard PPP per day

Figure 7 illustrates the average convergence time of ionosphere-constrained dual-frequency PPP. The convergence time of ionosphere-constrained GPS + GLONASS PPP is comparable to standard GPS + GLONASS PPP, while the convergence performance of GPS-only shows a little worse, which may be due to the accuracy limitation of GIMs. For instance, GIMs have a modest accuracy of only 2–8 TECU (Total Electron Content Unit) in vertical (Hernández-Pajares et al. 2009), which is an equivalent ranging error of 0.32–1.28 m for the GPS L1 frequency signal. We can see that the convergence performance of ionosphere-constrained GLONASS-only PPP is much worse than the standard GLONASS-only PPP, which is primarily attributed to the inseparable pseudorange IFBs and LOS ionosphere delays. Therefore, introducing GIMs as constraints will seriously deteriorate the convergence performance of dual-frequency GLONASS-only PPP.

Fig. 7
figure 7

Average convergence time of dual-frequency GPS-, GLONASS-only (GLO), and the combined GPS + GLONASS (CMB) ionosphere-constrained PPP per day

From the STD values of Figs. 4, 5, 6, and 7, we can see that by introducing GIMs as constraints on estimated LOS ionospheric delays, agreement of the average convergence time over days is more or less worse, which is due to the limited accuracy of GIMs.

Summary

Our software package called GAMP can be used for multi-GNSS undifferenced and uncombined PPP processing in single- and dual-frequency modes. The test results have shown that GAMP can implement single- and dual-frequency PPP based on undifferenced and uncombined observations effectively. The source code for GAMP is available at www.ngs.noaa.gov/gps-toolbox/GAMP. GAMP is a convenient tool for PPP performance using undifferenced and uncombined observations. This software package can be easily extended for additional functionality, such as triple-frequency PPP processing. Some bugs may still exist in GAMP. Comments and suggestions from readers and users are welcome to send to the authors.