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

Clock RINEX #207

Merged
merged 15 commits into from
Mar 5, 2024
33 changes: 18 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,22 +27,22 @@ You can also contact us [on our Discord channel](https://discord.gg/Fp2aape)
- Meteo RINEX full support
- IONEX 2D support. Partial IONEX 3D support.
- Partial ANTEX support
- Parial Clock RINEX support
- Several pre processing operations:
- File merging
- Time binning
- Filtering..
- Full support of High Precision Clock RINEX products
- Full support of [SP3](https://docs.rs/sp3/1.0.7/sp3/) High precision orbit products
- Several pre processing algorithms:
- [File merging](https://github.com/georust/rinex/wiki/file-merging)
- [Time binning](https://github.com/georust/rinex/wiki/time-binning)
- [Filtering](https://github.com/georust/rinex/wiki/Preprocessing)
- Several post processing operations
- All modern GNSS constellations
- Modern GNSS codes and signals
- [Position solver](https://github.com/georust/rinex/wiki/Positioning)
- [Graphical analysis](https://github.com/georust/rinex/wiki/Graph-Mode)
- [CGGTTS solutions solver](https://github.com/georust/rinex/wiki/CGGTTS)
- All modern GNSS constellations, codes and signals
- Time scales: GPST, BDT, GST, UTC
- Supports many SBAS, refer to online documentation
- High precision RINEX (carrier phase micro cycle precision)
- High precision orbit support (SP3)
- Quality Check (QC): file quality and statistical analysis to help precise positioning
- [SBAS support](https://docs.rs/gnss-rs/2.1.3/gnss_rs/constellation/enum.Constellation.html)
- High precision phase data (micro cycle precision) theoretically supported but not tested yet
- [Quality Check (QC)](https://github.com/georust/rinex/wiki/Quality-Check): file quality and statistical analysis to help precise positioning
(historical `teqc` function).
- SPP: Single Point Positioning
- PPP: Precise Point Positioning is work in progress :warning:

## Disadvantages :warning:

Expand Down Expand Up @@ -103,7 +103,7 @@ RINEX formats & applications
| 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: | Phase, Pseudo Range, Doppler, SSI | 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 |
| Clocks (CLK) | :heavy_check_mark:| :construction: | :construction: |:construction: | Precise Clock product | 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 |
Expand All @@ -114,7 +114,8 @@ RINEX formats & applications
: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.
`RINEX-Cli` accepts more than RINEX input, for example SP3 (high precision orbits) are accepted.
Read [how to load your GNSS context](https://github.com/georust/rinex/wiki/file-loading) in our Wiki.

File formats
============
Expand All @@ -127,6 +128,8 @@ File formats
| gzip compressed CRINEX | Name must end with `.gz` | `--flate2` feature must be enabled |
| SP3 | :heavy_minus_sign: | :heavy_check_mark: |
| gzip compressed SP3 | Name must end with `.gz` | `--flate2` feature must be enabled |
| BINEX | :heavy_minus_sign: | :heavy_minus_sign: We do not support proprietary formats |
| UBX | :heavy_minus_sign: | :construction: This is work in progress |

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

Expand Down
25 changes: 16 additions & 9 deletions rinex-cli/src/cli/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,20 +95,19 @@ or we post processed determined a CS.",
.help("Skyplot: SV position in the sky, on a compass."),
)
.arg(
Arg::new("orbits")
.long("orbits")
Arg::new("orbit")
.long("orbit")
.action(ArgAction::SetTrue)
.help("SV position in the sky, on 2D cartesian plots."),
)
.arg(
Arg::new("sp3-res")
.long("sp3-res")
Arg::new("orbit-residual")
.long("orbit-residual")
.action(ArgAction::SetTrue)
.help(
"SV orbital attitude residual analysis |BRDC - SP3|.
Requires both NAV RINEX and SP3 that overlap in time.",
),
)
"Broadcast versus High Precision orbital product comparison |BRDC - SP3|.
Requires both NAV RINEX and SP3 that overlap in time.
It is the orbital equuivalent to |BRDC-CLK| requested with --clk-residual."))
.arg(
Arg::new("naviplot")
.long("naviplot")
Expand All @@ -124,7 +123,15 @@ Ideal for precise positioning decision making.",
.short('c')
.long("clk")
.action(ArgAction::SetTrue)
.help("SV clock bias (offset, drift, drift changes)."),
.help("SV clock bias (offset, drift, drift changes).")
)
.arg(
Arg::new("clk-residual")
.long("clk-residual")
.action(ArgAction::SetTrue)
.help("Broadcast versus High Precision clock product comparison |BRDC - CLK|.
Requires both NAV RINEX and Clock RINEX that overlap in time.
It is the temporal equuivalent to |BRDC-SP3| requested with --sp3-residual.")
)
.next_help_heading("Atmosphere conditions")
.arg(
Expand Down
13 changes: 13 additions & 0 deletions rinex-cli/src/cli/identify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,17 @@ pub fn subcommand() -> Command {
.action(ArgAction::SetTrue)
.help("Identify Navigation frame types."),
)
.next_help_heading("Clock RINEX")
.arg(
Arg::new("station")
.long("station")
.action(ArgAction::SetTrue)
.help("Identify all ground stations contained in CLK RINEX file(s)"),
)
.arg(
Arg::new("station")
.long("station")
.action(ArgAction::SetTrue)
.help("Identify all ground stations contained in CLK RINEX file(s)"),
)
}
21 changes: 21 additions & 0 deletions rinex-cli/src/fops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,27 @@ pub fn filegen(ctx: &Context, _matches: &ArgMatches) -> Result<(), Error> {

info!("generated navigation data \"{}\"", output_path);
}
// CLK RINEX processing
if let Some(rinex) = ctx.data.clk_data() {
let filename = ctx
.data
.clk_paths()
.expect("failed to determine clk output")
.get(0)
.expect("failed to determine clk output")
.file_name()
.expect("failed to determine clk output")
.to_string_lossy()
.to_string();

let output_path = ctx.workspace.join(filename).to_string_lossy().to_string();

rinex
.to_file(&output_path)
.unwrap_or_else(|_| panic!("failed to generate clock data\"{}\"", output_path));

info!("generated clk data \"{}\"", output_path);
}
Ok(())
}

Expand Down
10 changes: 6 additions & 4 deletions rinex-cli/src/graph/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,9 @@ fn gnss_combination_plot(matches: &ArgMatches) -> bool {

/* Returns True if Navigation plot is to be generated */
fn navigation_plot(matches: &ArgMatches) -> bool {
matches.get_flag("skyplot") || matches.get_flag("sp3-res") || matches.get_flag("sv-clock")
matches.get_flag("skyplot")
|| matches.get_flag("orbit-residual")
|| matches.get_flag("sv-clock")
}

/* Returns True if Atmosphere conditions is to be generated */
Expand Down Expand Up @@ -643,12 +645,12 @@ pub fn graph_opmode(ctx: &Context, matches: &ArgMatches) -> Result<(), Error> {
}
skyplot(&ctx.data, rx_ecef, &mut plot_ctx);
}
if matches.get_flag("orbits") {
if matches.get_flag("orbit") {
plot_sv_nav_orbits(&ctx.data, &mut plot_ctx);
}
if matches.get_flag("sp3-res") {
if matches.get_flag("orbit-residual") {
if ctx.data.sp3_data().is_none() || ctx.data.nav_data().is_none() {
panic!("skyplot requires both BRDC or SP3.");
panic!("requires both BRDC and SP3.");
}
plot_residual_ephemeris(&ctx.data, &mut plot_ctx);
}
Expand Down
Loading
Loading