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.
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-runStandalone Melbourne-Wubbena cycle-slip example:
qelaro mw-cycle-slip path/to/rover.24O \
--systems G,R,E,C \
--output results/mw-cycle-slipGUI example:
npm run start:api
npm run start:devOpen 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/sppThe 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.
.
├── 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
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.
| 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 |
- Inspect rover/base observation files with
qelaro inspect-obs. - Select systems and processing window from overlapping epochs.
- Provide NAV files per system (or SP3 files for precise orbits).
- Run
qelaro dd-localfor local solve orqelaro dd-apiagainst FastAPI. - Review baseline correction, covariance, residuals, and optional fixed solution outputs.
- Choose systems with
--systems, such asG,R,E,C. - Optionally provide signal pairs as
SYSTEM:CODE1,PHASE1,CODE2,PHASE2. - Run
qelaro mw-cycle-slip. - Review
summary.json,cycle_slip_events.csv, andmw_plot_data.csv.
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,.Zsupported by parser)
Outputs
summary.json(solution summary and precision metrics)double_differences.csv(DD observation model rows)cycle_slip_events.csvandmw_plot_data.csvfor MW quality controlstation_observations.csvandresiduals.csvfor SPP web jobs- per-system station frames (
*_base_station.csv,*_rover_station.csv) - service-generated files in
public/files/outPut
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.
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.
- 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
If you use Qelaro in research, please cite the project metadata in
CITATION.cff or use the Zenodo DOI:
10.5281/zenodo.21202299.
Please read CONTRIBUTING.md before opening pull requests.
Qelaro is released under the MIT License.
