Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Qelaro

Tests License: MIT Docs DOI

Open-source GNSS double-difference processing toolbox

Qelaro is an open-source GNSS and geodetic processing toolbox designed for transparent, reproducible, and learning-oriented positioning workflows. The first public release focuses on double-difference baseline processing using RINEX/SP3-based inputs, with both CLI and GUI interfaces and detailed theoretical documentation of the underlying observation model, differencing strategy, and least-squares adjustment.

Qelaro GUI preview

Quick Start

Install from source:

git clone git@github.com:atoofihub/Qelaro.git
cd Qelaro
pip install -e .

CLI example:

qelaro dd-local \
  --base-obs path/to/base.24O \
  --rover-obs path/to/rover.24O \
  --base-nav G=path/to/base.24N \
  --rover-nav G=path/to/rover.24N \
  --systems G \
  --start "2024-11-14 09:00:00" \
  --end "2024-11-14 09:05:00" \
  --output results/dd-run

Standalone Melbourne-Wubbena cycle-slip example:

qelaro mw-cycle-slip path/to/rover.24O \
  --systems G,R,E,C \
  --output results/mw-cycle-slip

GUI example:

npm run start:api
npm run start:dev

Open http://localhost:3000/panel and use http://localhost:3000/panel/double_difference for baseline jobs.

Scientific Python API example:

import numpy as np
from qelaro.integer_ambiguity import lambda_solve
from qelaro.cycle_slip import analyze_melbourne_wubbena
from qelaro.rinex import read_observation, read_navigation
from qelaro.sp3 import read_sp3

result = lambda_solve(
    np.array([1.23, 5.78, -2.41]),
    np.array([
        [0.04, 0.01, 0.00],
        [0.01, 0.09, 0.02],
        [0.00, 0.02, 0.06],
    ]),
)
print(result.fixed_ambiguities)

mw = analyze_melbourne_wubbena("path/to/rover.24O", systems=("G",))
print(mw.summary)

SPP with Galileo NeQuick-G support data:

qelaro spp \
  --obs path/to/rover.24O \
  --nav path/to/brdc.rnx \
  --systems G,E \
  --ionosphere-strategy model \
  --ionosphere-model auto \
  --nequick-data-dir data/nequick/CCIR_MoDIP \
  --start "2024-11-14 09:00:00" \
  --end "2024-11-14 09:05:00" \
  --output results/spp

The bundled NeQuick-G support tables are stored at:

data/nequick/CCIR_MoDIP

The directory is about 592 KB and contains ccir11.txt through ccir22.txt plus modipNeQG_wrapped.asc. Use the same path in the web UI NeQuick data dir field.

Repository Layout

.
├── src/                         # NestJS GUI and web controllers
├── process_services/            # FastAPI processing service
├── processing/qelaro/           # Modular Python GNSS processing package
├── docs/                        # User, theory, and developer documentation
├── examples/                    # Reproducible usage examples
└── tests/                       # Python smoke and scientific checks

Modular Scientific Structure

Qelaro separates scientific algorithms from upload handling, web views, and service orchestration:

qelaro.core                 # constants, time, coordinate helpers, exceptions
qelaro.rinex                # RINEX observation/navigation readers
qelaro.sp3                  # SP3 precise-orbit reader and interpolation helpers
qelaro.adjustment           # least-squares, covariance, residual utilities
qelaro.integer_ambiguity    # standalone LAMBDA integer ambiguity module
qelaro.cycle_slip           # Melbourne-Wubbena cycle-slip analysis
qelaro.ionosphere           # Klobuchar and Galileo NeQuick-G ionosphere models
qelaro.processing           # workflows such as Double Difference and SPP
qelaro.io                   # export helpers
qelaro.visualization        # plotting-data helpers
qelaro.cli                  # CLI command organization

The web GUI and FastAPI service call these modules instead of embedding GNSS algorithms inside upload or page-controller logic.

Features and Status

Capability Status Notes
RINEX observation parsing (3.x) Available Multi-system observation decoding with metadata parsing
RINEX navigation parsing Available Broadcast ephemeris and GLONASS/SBAS state-vector support
SP3 precise orbit parsing Available Supports plain and compressed SP3 inputs
Double-difference baseline processing Available Core launch workflow with configurable systems and weights
Melbourne-Wubbena cycle-slip analysis Available Standalone qelaro.cycle_slip module, CLI command, and FastAPI endpoint
Galileo NeQuick-G ionosphere model Experimental Standalone module, CLI/API/UI support; support tables are bundled under data/nequick/CCIR_MoDIP
Least-squares float estimation Available Design matrix, covariance, residuals, and sigma0 outputs
Integer ambiguity fixing (LAMBDA hooks) Experimental Standalone qelaro.integer_ambiguity module, used by selected DD workflows
SPP pipeline Experimental Code, phase, ionosphere-free, cycle-slip segmentation, CLI/API/UI job workflow
PPP pipeline Roadmap Planned future module, not part of current release
Web GUI workflows Available Upload-driven and job-based processing views
CLI workflows Available Inspect + local/API DD processing

Example Double-Difference Workflow

  1. Inspect rover/base observation files with qelaro inspect-obs.
  2. Select systems and processing window from overlapping epochs.
  3. Provide NAV files per system (or SP3 files for precise orbits).
  4. Run qelaro dd-local for local solve or qelaro dd-api against FastAPI.
  5. Review baseline correction, covariance, residuals, and optional fixed solution outputs.

Example Cycle-Slip Workflow

  1. Choose systems with --systems, such as G,R,E,C.
  2. Optionally provide signal pairs as SYSTEM:CODE1,PHASE1,CODE2,PHASE2.
  3. Run qelaro mw-cycle-slip.
  4. Review summary.json, cycle_slip_events.csv, and mw_plot_data.csv.

Inputs and Outputs

Inputs

  • RINEX observation (*.O, *.rnx, RINEX 3.x observation files)
  • RINEX navigation (*.N, *.G, *.L, *.C, etc., by constellation/system)
  • SP3 precise orbit files (*.sp3, .gz, .zip, .Z supported by parser)

Outputs

  • summary.json (solution summary and precision metrics)
  • double_differences.csv (DD observation model rows)
  • cycle_slip_events.csv and mw_plot_data.csv for MW quality control
  • station_observations.csv and residuals.csv for SPP web jobs
  • per-system station frames (*_base_station.csv, *_rover_station.csv)
  • service-generated files in public/files/outPut

Theory and Documentation

Core docs are under docs/, including:

  • getting started and installation
  • CLI/GUI guides
  • double-difference workflow walkthrough
  • observation model and least-squares background
  • covariance and precision interpretation

Start at docs/index.md.

Validation and Sample Results

Qelaro includes smoke-level validation tests and synthetic fixtures in tests/fixtures/ for parser and least-squares checks. Project-specific real campaign examples can be added under examples/ as publication-ready datasets become distributable.

Roadmap

  • strengthen reproducible benchmark datasets for baseline validation
  • stabilize ambiguity-fixing defaults across mixed-constellation runs
  • mature SPP module from experimental status
  • add PPP module and quality-control diagnostics
  • expand formal docs build and API reference pages

Citation

If you use Qelaro in research, please cite the project metadata in CITATION.cff or use the Zenodo DOI: 10.5281/zenodo.21202299.

Contributing

Please read CONTRIBUTING.md before opening pull requests.

License

Qelaro is released under the MIT License.

Releases

Packages

Contributors

Languages