GeoscienceAustralia / ginan

The Australian Government, through Positioning Australia (part of Geoscience Australia), is funding the design, development and operational service of a Global Navigation Satellite System (GNSS) position correction system - the Ginan service and toolkit. The application of the Ginan correction service by a GNSS device has the potential to increase positioning accuracy from meters to centimetres across Australia. The suite of software systems in this repository (the Ginan toolkit) will be used to create the service. It is available now under an open source licence. Ginan will give individuals and organisations no-cost access to the Ginan software and service as a public good.
https://geoscienceaustralia.github.io/ginan/
Other
229 stars 108 forks source link

Does Ginan support triple-frequency uncombined PPP and PPP-AR? #90

Closed Levi-always-rejoice closed 4 months ago

Levi-always-rejoice commented 5 months ago

Dear Ginan team,

I am wondering if Ginan software could execute triple-frequency uncombined PPP. The parameters are huge and sophisticated. I have tried to use the Ginan software to produce a result of triple-frequency uncombined PPP with ambiguity fixed under the guide of Config Parameters but I failed according to the result. So my question concerning Ginan is as follows. (1) Does Ginan support PPP in triple-frequency uncombined mode? If yes, how could I configure the parameters in the YAML file that controls the number of frequency being used in the PPP processing? (2) Does Ginan support PPP-AR for triple-frequency uncombined PPP? If yes, how could I configure the parameters in the YAML file that enable PPP-AR for triple-frequency uncombined PPP? In addition, I am wondering if you provide a tutorial on debugging Ginan code?

Levi-always-rejoice commented 4 months ago

Why nobody answer my questions?

smcclusky commented 4 months ago

Hi Levi-always-rejoice, I have had a look at the triple frequency example you mention. I have successfully run triple frequency GPS + GAL PPP solutions for a few stations without ambiguity resolution (AR) though I am still working to sort out a few problems with phase bias estimation and AR in tri-freq mode. So to answer your questions: 1) Yes - Ginan. does support tri frequency PPP in uncombined mode. Included below is a config file to this reply that should work for you (but not with AR yet). You will need to use the latest Ginan weekly snapshot with this config file. (https://github.com/GeoscienceAustralia/ginan/tree/develop-weekly) 2) Not yet - Ginan does support AR in dual frequency mode, I am still solving some issues in tri-frequency mode. 3) We do not have a Ginan code debugging tutorial available. If you are interested in starting to develop / modify Ginan code, please send me some details of your area interest I will see if I can connect you directly with the Ginan software engineering team. Regards --Simon (simon.mcclusky@ga.gov.au)

inputs:

    inputs_root: ./products/

    atx_files:  [ igs20.atx                             ] # required
    igrf_files: [ tables/igrf13coeffs.txt               ]
    erp_files:  [ finals.data.iau2000.txt               ]
    planetary_ephemeris_files: [ tables/DE436.1950.2050 ]

    troposphere:
        gpt2grid_files: [ tables/gpt_25.grd ]

    tides:
        ocean_tide_loading_blq_files:   [ tables/OLOAD_GO.BLQ                  ] # required if ocean loading is applied
        atmos_tide_loading_blq_files:   [ tables/ALOAD_GO.BLQ                  ] # required if atmospheric tide loading is applied
        ocean_pole_tide_loading_files:  [ tables/opoleloadcoefcmcor.txt ] # required if ocean pole tide loading is applied

    snx_files:
    # - "*.SNX" # use a wild card to include all files matching the description in the directory
    - igs_satellite_metadata.snx
    - tables/sat_yaw_bias_rate.snx
    - tables/qzss_yaw_modes.snx
    - tables/bds_yaw_modes.snx
    - IGS1R03SNX_20191950000_07D_07D_CRD.SNX

    satellite_data:
        # nav_files:
        # - "*.rnx"
        clk_files:
        # - "*.CLK"
        - IGS2R03FIN_20191990000_01D_30S_CLK.CLK
        bsx_files:
        # - "*.BIA"
        #- IGS2R03FIN_20191990000_01D_01D_OSB.BIA
        - TUG0R03FIN_20191990000_01D_01D_OSB.BIA
        sp3_files:
        # - "*.SP3"
        - IGS2R03FIN_20191990000_01D_05M_ORB.SP3

    gnss_observations:
        gnss_observations_root: ../data/
        rnx_inputs:
        # - "*.rnx"
        - ALIC00AUS_R_20191990000_01D_30S_MO.rnx
        - DARW00AUS_R_20191990000_01D_30S_MO.rnx
        - HOB200AUS_R_20191990000_01D_30S_MO.rnx
        #- KARR00AUS_R_20191990000_01D_30S_MO.rnx
        #- TOW200AUS_R_20191990000_01D_30S_MO.rnx
        #- "M*.rnx"

outputs:

    metadata:
        config_description:    ppp_example_gps+gal_L1L2L5

    outputs_root:              ./outputs/<CONFIG>

    gpx:
        output:                true
        filename:              <RECEIVER>_<CONFIG>_<YYYY><DDD><HH>.GPX

    trace:
        level:                 3
        output_receivers:      true
        output_network:        true
        receiver_filename:     <RECEIVER>_<CONFIG>_<YYYY><DDD><HH>.TRACE
        network_filename:      NETWORK_<CONFIG>_<YYYY><DDD><HH>.TRACE
        output_residuals:      true
        output_residual_chain: true
        output_config:         true

    # log:
    #     output:                false
    #     directory:             ./logs/
    #     filename:              log<LOGTIME>.json

satellite_options:

    global:
        error_model:    ELEVATION_DEPENDENT #  {uniform,elevation_dependent}
        code_sigma:     0                   # Standard deviation of code measurements
        phase_sigma:    0                   # Standard deviation of phase measurmeents
        models:
            code_bias:
                enable: true
            phase_bias:
                enable: true        

    # E05:
    #     exclude: true # Exclude satellites
    # E06:
    #     exclude: true

receiver_options:

    global:
        elevation_mask: 10       # degrees
        error_model:    ELEVATION_DEPENDENT # {uniform,elevation_dependent}
        code_sigma:     0.3      # Standard deviation of code measurements, m
        phase_sigma:    0.003    # Standard deviation of phase measurmeents, m

        GPS:
            clock_codes:    [AUTO,AUTO]
            zero_dcb_codes: [AUTO,AUTO]
        GAL:
            zero_dcb_codes: [AUTO,AUTO]
        #BDS:
        #    zero_dcb_codes: [AUTO,AUTO]

        models:
            code_bias:
                enable: true
            phase_bias:
                enable: true
            troposphere:         # Tropospheric modelling accounts for delays due to refraction of light in water vapour
                enable: true
                models: [ gpt2 ] # List of models to use for troposphere [standard,sbas,vmf3,gpt2,cssr]
            tides:
                atl:    true     # Enable atmospheric tide loading
                enable: true     # Enable modelling of tidal disaplacements
                opole:  true     # Enable ocean pole tides
                otl:    true     # Enable ocean tide loading
                solid:  true     # Enable solid Earth tides
                spole:  true     # Enable solid Earth pole tides
    # ALIC:
    #     receiver_type:    "LEICA GR25"                 # (string)
    #     antenna_type:     "LEIAR25.R3      NONE"       # (string)
    #     apriori_position: [-4052052.7254, 4212835.9872,-2545104.6139] # [floats]
    #     aliases:          [PIVOT] # set as pivot station
    #     models:
    #         eccentricity:
    #             enable:   true
    #             offset:   [0.0000,   0.0000,   0.0015] # [floats]

processing_options:

    process_modes:
        preprocessor:        true  # Preprocessing and quality checks
        spp:                 true  # Perform SPP on receiver data
        ppp:                 true  # Perform PPP network or end user mode
        ionosphere:          false # Compute Ionosphere models based on GNSS measurements
        slr:                 false # Process SLR observations

    epoch_control:
        # start_epoch:        2019-07-18 00:00:00
        end_epoch:           2019-07-18 23:55:00
        # max_epochs:         2880
        epoch_interval:      30    # seconds
        wait_next_epoch:     3600  # seconds (make large for post-processing)

    gnss_general:
        rec_reference_system:      GPS
        sys_options:
            GPS:
                process:                true
                reject_eclipse:         false
                code_priorities:        [ L1W, L1C, L2W, L5Q, L5X ]
                #code_priorities:        [ L1W, L1C, L2W ]
                receiver_amb_pivot:     true
                #network_amb_pivot:      true

            GAL:
                process:                true
                reject_eclipse:         false
                code_priorities:        [ L1C, L5Q, L1X, L5X ]
                #receiver_amb_pivot:     true
                #network_amb_pivot:      true

    preprocessor:                     # Configurations for the kalman filter and its sub processes
        cycle_slips:                  # Cycle slips may be detected by the preprocessor and measurements rejected or ambiguities reinitialised
            mw_process_noise:    0    # Process noise applied to filtered Melbourne-Wubenna measurements to detect cycle slips
            slip_threshold:   0.05    # Value used to determine when a slip has occurred
        preprocess_all_data:  true

    spp:
        #always_reinitialise: false   # Reset SPP state to zero to avoid potential for lock-in of bad states
        max_lsq_iterations:  12      # Maximum number of iterations of least squares allowed for convergence
        outlier_screening:
            raim:            true    # Enable Receiver Autonomous Integrity Monitoring
            max_gdop:        30      # Maximum dilution of precision before error is flagged

    ppp_filter:

        outlier_screening:
            chi_square:
                enable:          false # Enable Chi-square test
                mode:            NONE  # Chi-square test mode {none,innovation,measurement,state}
            prefit:
                max_iterations:  3     # Maximum number of measurements to exclude using prefit checks before attempting to filter
                omega_test:      false # Enable omega-test
                sigma_check:     true  # Enable sigma check
                sigma_threshold: 4     # Sigma threshold
            postfit:
                max_iterations:  10    # Maximum number of measurements to exclude using postfit checks while iterating filter
                sigma_check:     true  # Enable sigma check
                sigma_threshold: 4     # Sigma threshold

        ionospheric_components:        # Slant ionospheric components
            common_ionosphere:   true  # Use the same ionosphere state for code and phase observations
            use_gf_combo:        false # Combine 'uncombined' measurements to simulate a geometry-free solution
            use_if_combo:        false # Combine 'uncombined' measurements to simulate an ionosphere-free solution

        chunking:
            by_receiver:         false # Split large filter and measurement matrices blockwise by receiver ID to improve processing speed
            by_satellite:        false # Split large filter and measurement matrices blockwise by satellite ID to improve processing speed
            size:                0

        rts:                           # Rauch-Tung-Striebel (RTS) backwards smoothing
            enable:              true
            lag:                 -1
            inverter:            LDLT  # Inverter to be used within the rts processor, which may provide different performance outcomes in terms of processing time and accuracy and stability
            filename:            <CONFIG>_<RECEIVER>.rts

    model_error_handling:
        meas_deweighting:              # Measurements that are outside the expected confidence bounds may be deweighted so that outliers do not contaminate the filtered solution
            deweight_factor:     1000  # Factor to downweight the variance of measurements with statistically detected errors
            enable:              true  # Enable deweighting of all rejected measurement
        state_deweighting:               # Any "state" errors cause deweighting of all measurements that reference the state
            deweight_factor:     1000  # Factor to downweight the variance of measurements with statistically detected errors
            enable:              true  # Enable deweighting of all referencing measurements
        ambiguities:
            outage_reset_limit:  300     # Wait for 5 consecutive missing epoch of data before reseting ambiguity
            phase_reject_limit:  2     # Reset ambiguity after 2 large fractional residuals are found (replaces phase_reject_count:)
            reset_on:                    # Reset ambiguities when slip is detected by the following
                gf:              true  # GF test
                lli:             true  # LLI test
                mw:              true  # MW test
                scdia:           true  # SCDIA test

estimation_parameters:
    global_models:
        eop:
            estimated:           [false] # Estimate state in kalman filter
            sigma:               [-1]    # Apriori sigma values - if zero, will be initialised using least squares
            process_noise:       [0]     # Process noise sigmas
        eop_rates:
            estimated:           [false] # Estimate state in kalman filter
            sigma:               [-1]    # Apriori sigma values - if zero, will be initialised using least squares
            process_noise:       [0]     # Process noise sigmas
        ion:
            estimated:           [false] # Estimate state in kalman filter
            sigma:               [-1]    # Apriori sigma values - if zero, will be initialised using least squares
            process_noise:       [0]     # Process noise sigmas

    receivers:

        global:
            pos:
                estimated:       [true]
                sigma:           [100]
                process_noise:   [0]
            pos_rate:                    # Velocity
                estimated:       [false] # [bools] Estimate state in kalman filter
                sigma:           [1]     # [floats] Apriori sigma values - if zero, will be initialised using least squares
                process_noise:   [1]     # [floats] Process noise sigmas
                # process_noise_dt:   SECOND  # (enum) Time unit for process noise - sqrt_sec, sqrt_day etc
                # apriori_val:        [0]     # [floats] Apriori state values
                # mu:                 [0]     # [floats] Desired mean value for gauss markov states
                # tau:                [-1]    # [floats] Correlation times for gauss markov noise, defaults to -1 -> inf (Random Walk)
            clock:
                estimated:       [true]
                sigma:           [1000]
                process_noise:   [100]
            clock_rate:
                estimated:       [false]
                sigma:           [0.005]
                process_noise:   [1e-4]
            ambiguities:
                estimated:       [true]
                sigma:           [1000]
                process_noise:   [0]
            ion_stec:                    # Ionospheric slant delay
                estimated:       [true]  # Estimate state in kalman filter
                sigma:           [200]   # Apriori sigma values - if zero, will be initialised using least squares
                process_noise:   [10]    # Process noise sigmas
            trop:
                estimated:       [true]
                sigma:           [0.3]
                process_noise:   [0.0001]
            trop_grads:
                estimated:       [true]
                sigma:           [0.03]
                process_noise:   [1.0E-6]
            code_bias:
                estimated:       [true]
                sigma:           [20]
                process_noise:   [0]
            phase_bias:
                estimated:       [true]
                sigma:           [1]
                process_noise:   [0]
            #GPS:
            #    L1C:
            #        phase_bias:
            #            estimated:      [true]
            #            sigma:          [1e-9]
            #            process_noise:  [0]

# GPS L5 phase biases are known to be non-stationary. If not included in the apriori bias file 
# they need to be estimated with process noise to allow for variation with time
    satellites:
        GPS:
            L5Q:
                phase_bias:
                    estimated:          [true]
                    sigma:              [0.5]
                    process_noise:      [0.0002]
            L5X:
                phase_bias:
                    estimated:          [true]
                    sigma:              [0.5]
                    process_noise:      [0.0002]

mongo:                   # Mongo is a database used to store results and intermediate values for later analysis and inter-process communication
    enable:              primary                     # Enable and connect to mongo database {none,primary,secondary,both}
    primary_uri:         mongodb://localhost:27017   # Location and port of the mongo database to connect to
    primary_database:    <CONFIG>
    primary_suffix:      ""                          # Suffix to append to database elements to make distinctions between runs for comparison
    # secondary_database:  <CONFIG>
    # secondary_suffix:    ""                          # Suffix to append to database elements to make distinctions between runs for comparison
    # secondary_uri:       mongodb://localhost:27017   # Location and port of the mongo database to connect to
    # output_config:       NONE                        # Output config {none,primary,secondary,both}
    output_components:   primary                     # Output components of measurements {none,primary,secondary,both}
    output_states:       primary                     # Output states {none,primary,secondary,both}
    output_measurements: primary                     # Output measurements and their residuals {none,primary,secondary,both}
    output_test_stats:   primary                     # Output test statistics {none,primary,secondary,both}
    delete_history:      primary                     # Drop the collection in the database at the beginning of the run to only show fresh data {none,primary,secondary,both}
    output_trace:        primary
    #output_cumulative:   primary
Levi-always-rejoice commented 4 months ago

Thank you Simon McClusky. Thank you for your detailed answer.