Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Doc update #164

Merged
merged 42 commits into from
Sep 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
c6d4c58
rinex: only rinex-qc needs sp3 dependency
gwbres Sep 7, 2023
9c43020
preliminary work for SPP and PPP position solver
gwbres Sep 7, 2023
efe010e
Merge branch 'main' into develop
gwbres Sep 9, 2023
8360c17
Remove unused Error type
gwbres Sep 9, 2023
16b9725
Refactor ParsingError ecosystem
gwbres Sep 9, 2023
fc9e650
Improving ParsingError:
gwbres Sep 9, 2023
ba4ac5d
improve marker type parsing
gwbres Sep 9, 2023
fedd9af
Improving Parsing Error ecosystem
gwbres Sep 9, 2023
0ed2b0a
improve coordinates parsing
gwbres Sep 9, 2023
d49ca90
improve coordinates parsing
gwbres Sep 9, 2023
05346ef
prepare next releases
gwbres Sep 9, 2023
07b4b0f
Improve sv parsing errors
gwbres Sep 9, 2023
b9f91e6
datetime parsing improvements
gwbres Sep 9, 2023
bf05e56
preliminary work for High Precision Phase Data
gwbres Sep 9, 2023
7fc5c17
improved dcb compensation info parsing
gwbres Sep 9, 2023
d0924a4
parse formatted month: check possible error, do not use a macro
gwbres Sep 9, 2023
edf7cca
PCVs and DCBs compensations
gwbres Sep 9, 2023
de3e414
improve reported error message
gwbres Sep 9, 2023
1872adf
DCBs, PCVs and Scaling factors parsing
gwbres Sep 9, 2023
3a073f0
cli: introduce solver later
gwbres Sep 9, 2023
58cdca0
improve ionex grid parsing and related erors
gwbres Sep 9, 2023
3102542
implement default
gwbres Sep 9, 2023
98b2dcb
introduce position solver later
gwbres Sep 9, 2023
eac5948
fix code
gwbres Sep 9, 2023
5af89ea
applying cargo fmt
gwbres Sep 9, 2023
e5e4447
run cargo clippy
gwbres Sep 9, 2023
0aac52b
need to bump cli to v0.9.1 too
gwbres Sep 9, 2023
87975c2
apply suggestion
gwbres Sep 9, 2023
27b55e7
apply some clippy suggestions
gwbres Sep 9, 2023
6b48e19
Merge branch 'main' into develop
gwbres Sep 9, 2023
9921063
update doc
gwbres Sep 11, 2023
e10d742
update doc
gwbres Sep 11, 2023
3a66dcd
update doc
gwbres Sep 11, 2023
a2edfed
update readme
gwbres Sep 13, 2023
94e220e
update contribution guidelines
gwbres Sep 13, 2023
b48bb09
update readme
gwbres Sep 13, 2023
06159ce
update readme
gwbres Sep 13, 2023
e4b8a68
Update README.md
gwbres Sep 13, 2023
f42257c
update readme
gwbres Sep 13, 2023
7913640
update dicord channel url
gwbres Sep 13, 2023
d11f6b6
update contribution guidelines
gwbres Sep 13, 2023
0525fc5
add identation
gwbres Sep 13, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 45 additions & 41 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,54 +1,58 @@
CONTRIBUTING
============

First of all: Hello and welcome on board!

Use `cargo fmt` prior submitting a pull request so the CI/CD does not fail on coding standards issues.

This crate and ecosystem is part of the Georust community.
You can contact us to ask questions on our Discord channel,
see the [community portal](https://github.com/georust/geo)

lib architecture
================

For each supported RINEX types, we have one folder.
The folder bears the name of such RINEX type. In that folder,
you can find a `record.rs` file where that particular files content is described.
It also contains its dedicated parsing methods.

- src/lib.rs : main library, `Rinex` definitions
- src/constellation/mod.rs : GNSS constellations definition
- src/constellation/augmentation.rs : SBAS related definitions
- src/sv.rs : Satellite vehicule definitions
- src/observation/mod.rs : OBS RINEX entry point
- src/observation/record.rs : OBS RINEX specific record definitions
- src/navigation/mod.rs : NAV RINEX entry point
- src/navigation/record.rs : NAV RINEX specific generic record definitions
- src/navigation/ephemeris.rs : Ephemeris frames definition, parsing method and related calculations, like Kepler solving
- src/navigation/ionmessage.rs : new ION frame definition and parsing methods
- src/navigation/eopmessage.rs : new EOP frame definition and parsing methods
- src/meteo/mod.rs : Meteo RINEX entry point
- src/meteo/record.rs : specific record definitions, including parsing methods
- src/hatanaka/mod.rs : Compression / Decompression module
- src/qc/mod.rs : Quality Check module
- src/qc/analysis/sv.rs : Satellite Vehicle general analysis
- src/qc/analysis/obs.rs : OBS RINEX specific analysis
Hello and welcome on board :wave:

Use the github portal to submit PR, all contributions are welcomed.
Don't forget to run a quick `cargo fmt` prior any submissions, so the CI/CD does not fail
on coding style "issues".

This crate and ecosystem is part of the Georust community.
You can contact us on [Discord](https://discord.gg/Fp2aape).

Crate architecture
==================

For each supported RINEX types, we have one folder named after that format.
`src/navigation` is one of those.

The module contains the record type definition. RINEX file contents vary a lot
depending on which type of RINEX we're talking about.
For complex RINEX formats like Navigation Data, that module will contain all possible inner types.

Other important structures :
- `src/epoch/mod.rs`: the Epoch module basically provides
hifitime::Epoch parsing methods, because RINEX describes date in non standard formats.
Also, the `Flag` structure is used to mark Observations (valid or invalid).
- `src/constellation.rs` defines GNSS constellations
- `src/constellation/augmentation.rs` : preliminary SBAS support
- `src/sv.rs` defines a Satellite vehicle, which is associated to a constellation
- `src/observable.rs`: defines possible observations like raw phase
- `src/carrier.rs`: defines carrier signals in terms of frequency and bandwidth.
It also contains utilities to identify which GNSS signals we're dealing with,
from an `Observable`.
- `src/hatanaka/mod.rs`: the Hatanaka module contains the RINEX Compressor and Decompressor
- `src/antex/antenna.rs`: defines the index structure of ANTEX format

NAV RINEX
=========

Abstraction for NAV files parsing is provided by the `navigation.json` descriptor.
This is how we describe all supported revisions and their data fields.
Orbit instantaneous parameters, broadcasted by GNSS vehicles, are presented in different
forms depending on the RINEX revision and the GNSS constellation.

Improving or updating NAV file parsing either means updating this database,
or improving the way we rely on it. This is handle
To solve that problem, we use a dictionary, in the form of `src/db/NAV/orbits.json`,
which describes all fields per RINEX revision and GNSS constellation.

This file is processed at build time, by the build script and ends up as a static
pool we rely on when parsing a file.

The dictionary is powerful enough to describe all revision, the default Navigation Message
is `LNAV`: Legacy NAV message, which can be omitted. Therefore, it is only declared
for modern Navigation messages.

Introducing a new RINEX type
============================

A good guideline would be to follow the src/meteo/mod.rs module, which is simple enough,
yet follows the basic principles previously explained.
`src/meteo/mod.rs` is the easiest format and can serve as a guideline to follow.

A more complex RINEX declination would be src/navigation, because the inner record entry
can have 3 or 4 different variations.
When introducing a new Navigation Data, the dictionary will most likely have to be updated (see previous paragraph).
105 changes: 71 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,45 +11,78 @@ RINEX

Rust tool suites to parse, analyze and process [RINEX Data](https://en.wikipedia.org/wiki/RINEX).

This RINEX toolsuite is part of the [GeoRust community](https://github.com/georust),
and we aim towards advanced geodesic and ionospheric analysis.

## Advantages :rocket:

- Fast
- Open sources
- Native Hatanaka decompression and compression
- Seamless .gzip decompression with `flate2` compilation feature
- RINEX V4 full support, that includes modern Navigation messages
- Meteo RINEX full support
- IONEX and Clock RINEX partial support, will be concluded soon
- File merging, splitting and pre processing
- Modern constellations like BeiDou, Galileo and IRNSS
- Supported time scales are GPST, BDT, GST, UTC
- Full support of Military codes : if you're working with such signals you can
at least run a -qc analysis, and possibly the position solver once it is merged
- Supports high precision RINEX (scaled phase data with micro cycle precision)
- RINEX post processing like SNR, DCB analysis, Broadcast ephemeris interpolation,
high precision orbit interpolation (SP3)..
- RINEX-qc : statistical analysis like "teqc", including on modern signals and SP3 high precision orbits
- An SPP/PPP position solver is under develoment:
checkout [this branch](https://github.com/georust/rinex/tree/solver) which
is kept up to date until merged

## Known weaknesses :warning:

- QZNSST is represented as GPST at the moment
- GLONASST and IRNSST are not supported : calculations (mostly orbits) will not be accurate
- Partial SBAS support : some features are not yet available
- The command line tool does not accept BINEX or other proprietary formats
- File production is not fully concluded to this day, some formats are still not correctly supported
(mostly NAV).

## Architecture

* [`rinex`](rinex/) is the core library
* [`rinex-cli`](rinex-cli/) is a command line application based on the core library.
It can be used to process RINEX files and perform operations similar to `teqc`.
The application is auto-generated for a few architectures, download it from the
[release portal](https://github.com/gwbres/rinex/releases)

* [`rnx2crx`](rnx2crx/) is a RINEX compression program
* [`crx2rnx`](crx2rnx/) is a CRINEX decompression program (Compact RINEX to RINEX)
* [`rnx2crx`](rnx2crx/) is a RINEX compressor (RINEX to Compact RINEX)
* [`crx2rnx`](crx2rnx/) is a CRINEX decompresor (Compact RINEX to RINEX)
* [`rinex-qc`](rinex-qc/) is a library dedicated to RINEX files analysis
* [`qc-traits`](qc-traits/) declares Traits that are shared between `rinex` and `rinex-qc`
* [`sinex`](sinex/) SNX dedicated core library

* [`ublox-rnx`](ublox-rnx/) is an application that connects to a `Ublox`
receiver and generates RINEX data quickly & easily.
It is the combination of the [ublox](https://github.com/lkolbly/ublox)
and [rinex](rinex/) crates.

By default, all timestamps are in UTC with leap seconds correctly managed.

This RINEX toolsuite is part of the [GeoRust community](https://github.com/georust),
and we aim towards advanced geodesic and ionospheric analysis.

RINEX Standards
===============

| Type | Parser | Writer | CLI | UBX | Notes |
|----------------------------|-------------------|---------------------|----------------------|-------------------|-------------------------
| Navigation (NAV) | :heavy_check_mark:| Ephemeris :construction: V4 :construction: | :heavy_check_mark: :chart_with_upwards_trend: | :construction: | Epoch iteration |
| Observation (OBS) | :heavy_check_mark:| :heavy_check_mark: | :heavy_check_mark: :chart_with_upwards_trend: | :construction: | Epoch iteration |
| CRINEX (Compressed OBS) | :heavy_check_mark:| RNX2CRX1 :heavy_check_mark: RNX2CRX3 :construction: | :heavy_check_mark: :chart_with_upwards_trend: | :construction: | Epoch iteration |
| Meteorological data (MET) | :heavy_check_mark:| :heavy_check_mark: | :heavy_check_mark: :chart_with_upwards_trend: | :construction: | Epoch iteration |
| Clocks (CLK) | :heavy_check_mark:| :construction: | :construction: |:construction: | Epoch iteration |
| Antenna (ATX) | :heavy_check_mark:| :construction: | :construction: |:construction: | Sorted by `antex::Antenna` |
| Ionosphere Maps (IONEX) | :heavy_check_mark:| :construction: | :heavy_check_mark: :chart_with_upwards_trend: |:construction: | Epoch iteration |
| SINEX (SNX) | :construction: | :construction: | :heavy_minus_sign: |:construction: | SINEX are special RINEX, they are managed by a dedicated [core library](sinex/) |
| Troposphere (TRO) | :construction: | :construction: | :question: |:construction: | Troposphere are one possible SINEX declination |
| Bias (BIA) | :heavy_check_mark: | :construction: | :question: |:construction: | Bias solutions are one possible SINEX declination |
* [`ublox-rnx`](ublox-rnx/) is an application intended to generate RINEX Data
from raw uBlox GNSS receiver frames. This application is work in progress at the moment.

RINEX formats & applications
============================

| Type | Parser | Writer | CLI | UBX | Content | Record browsing |
|----------------------------|-------------------|---------------------|----------------------|----------------------|--------------------------| ---------------------|
| Navigation (NAV) | :heavy_check_mark:| Ephemeris :construction: V4 :construction: | :heavy_check_mark: :chart_with_upwards_trend: | :construction: | Orbit parameters, Ionospheric models.. | Epoch iteration |
| Observation (OBS) | :heavy_check_mark:| :heavy_check_mark: | :heavy_check_mark: :chart_with_upwards_trend: | :construction: | Phase, Pseudo Range, Doppler, SSI | Epoch iteration |
| CRINEX (Compressed OBS) | :heavy_check_mark:| RNX2CRX1 :heavy_check_mark: RNX2CRX3 :construction: | :heavy_check_mark: :chart_with_upwards_trend: | :construction: | see OBS Data | Epoch iteration |
| Meteorological data (MET) | :heavy_check_mark:| :heavy_check_mark: | :heavy_check_mark: :chart_with_upwards_trend: | :construction: | Meteo sensors data (Temperature, Moisture..) | Epoch iteration |
| Clocks (CLK) | :heavy_check_mark:| :construction: | :construction: |:construction: | Clock comparison | Epoch iteration |
| Antenna (ATX) | :heavy_check_mark:| :construction: | :construction: |:construction: | Antenna calibration data | Sorted by `antex::Antenna` |
| Ionosphere Maps (IONEX) | :heavy_check_mark:| :construction: | :heavy_check_mark: :chart_with_upwards_trend: |:construction: | Ionosphere Electron density | Epoch iteration |
| SINEX (SNX) | :construction: | :construction: | :heavy_minus_sign: |:construction: | SINEX are special RINEX, they are managed by a dedicated [core library](sinex/) | Epoch iteration |
| Troposphere (TRO) | :construction: | :construction: | :question: |:construction: | Troposphere modeling | Epoch iteration |
| Bias (BIA) | :heavy_check_mark: | :construction: | :question: |:construction: | Bias estimates, like DCB.. | Epoch iteration |

:heavy_check_mark: means all revisions supported
:construction: under development
__CLI__ + :chart_with_upwards_trend: means record analysis is supported by the CLI, [README](rinex-cli/README.md)
:construction: : Work in Progress
__CLI__ + :chart_with_upwards_trend: means the [cli app](rinex-cli/README.md) provides one or several visualizations

The [cli app](rinex-cli/README.md) accepts more than RINEX input, for example SP3 (high precision orbits) are accepted.

File formats
============
Expand All @@ -60,14 +93,10 @@ File formats
| CRINEX | :heavy_minus_sign: | :heavy_check_mark: |
| gzip compressed RINEX | Name must end with `.gz` | `--flate2` feature must be enabled |
| gzip compressed CRINEX | Name must end with `.gz` | `--flate2` feature must be enabled |
| SP3 | :heavy_minus_sign: | `--flate2` feature must be enabled |

:heavy_minus_sign: No restrictions: file names do not have to follow naming conventions.

## Known weaknesses :warning:

- Glonass Time Scale is not known to this day.
We cannot parse and apply system time corrections from other time scales into the glonass time scale.

Benchmarking
============

Expand All @@ -84,6 +113,14 @@ processing/esbc00dnkr2021/mask:obs | 438.73 ms |
processing/esbc00dnkr2021/mask:sv | 341.42 ms |
processing/esbc00dnkr2021/smooth:hatch:l1c,l2c | 502.90 ms |

Special Thanks
==============

RINEX relies heavily on the great libraries written by C. Rabotin, [check out his work](https://github.com/nyx-space).
Some features would not exist without the invaluable help of J. Lesouple,
check out his
[PhD manuscript (french)](http://perso.recherche.enac.fr/~julien.lesouple/fr/publication/thesis/THESIS.pdf?fbclid=IwAR3WlHm0eP7ygRzywbL07Ig-JawvsdCEdvz1umJJaRRXVO265J9cp931YyI)

Contributions
=============

Expand Down
2 changes: 1 addition & 1 deletion rinex-cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ if you know how to operate the preprocessing toolkit
## Data analysis

This tool can perform several data analysis. Feasible operations
are highly dependent on the context provided by the user.
are highly dependent on the context provided by the user.
Refer to [this page](doc/file-combination.md) to understand
what minimal context should be provided, for the analysis you want to perform.

Expand Down
6 changes: 3 additions & 3 deletions rinex-cli/doc/file-combination.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ you want to perform.

## Meteo RINEX analysis

To analyze a Meteo file, a primary file of this type should be passed
to `--fp` (or `-f`). In this case, you get a visualization
of all observations. An in depth statistical analysis is feasible with `--qc`.
To analyze a Meteo file, a primary file of this type should be passed to `--fp` (or `-f`).
In this case, you get a visualization of all observations.
An in depth statistical analysis is feasible with `--qc`.

It does not make sense to stack other RINEX files to such analysis.

Expand Down
Loading