https://github.com/jclark/convobs-rs
Convert between GNSS raw observation formats
https://github.com/jclark/convobs-rs
gnss rinex rtcm rtk rust u-blox ubx
Last synced: 10 days ago
JSON representation
Convert between GNSS raw observation formats
- Host: GitHub
- URL: https://github.com/jclark/convobs-rs
- Owner: jclark
- License: mit
- Created: 2026-06-05T05:26:28.000Z (14 days ago)
- Default Branch: main
- Last Pushed: 2026-06-05T13:15:07.000Z (14 days ago)
- Last Synced: 2026-06-09T01:34:37.088Z (10 days ago)
- Topics: gnss, rinex, rtcm, rtk, rust, u-blox, ubx
- Language: Rust
- Homepage:
- Size: 8.99 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# convobs
**convobs** converts raw GNSS observation data emitted by a receiver into a
RINEX observation file. The resulting file can be sent to a PPP post-processing
service such as CSRS-PPP to determine the precise position of the receiver. The
u-blox UBX-RXM-RAWX and RTCM MSM7 raw formats are supported, and the input
format can be auto-detected.
**convobs** also introduces `obsj`, a convenient [JSON Lines](https://jsonlines.org/)
representation of observation data with RINEX-adjacent semantics, designed for
processing with modern tools such as **jq**. It is supported for both input and
output. Each line is one JSON object: a line with a `t` field is an observation,
and a line without one carries header metadata. The fields mirror RINEX
concepts — for example, `sat` and `sig` are RINEX satellite and signal
identifiers, and `arc` and `hc` correspond to RINEX loss-of-lock indicator bits.
For example:
```
{"t":"2025-12-17T08:14:06.0080000","sat":"G07","sig":"1C","pr":23956830.529584773,"cp":125893980.17237933,"do":2059.716796875,"cn0":34}
```
See the [**convobs**(1) man page](docs/convobs.1.md) for the full set of options,
the `obsj` field definitions, and the RINEX header metadata format.
A companion command, **diffobs**, compares two observation files (`obsj` or
RINEX) semantically; run `diffobs --help` for details.
There is also an implementation in Go that is part of
[SatPulse](https://satpulse.net/), exposed as the `satpulsetool convobs` command
and documented in its
[man page](https://satpulse.net/man/satpulsetool-convobs.1.html). This Rust
implementation runs about 5× faster.
## Building
With a [Rust toolchain](https://rustup.rs/) installed, run `make release`; the
`convobs` and `diffobs` binaries are written to `target/release`. Run `make` on
its own to list all targets, or `make install` to install the binaries into
`~/.cargo/bin`.
The project is a Cargo workspace of three crates:
- **`obsj`** — the core library: the `obsj` observation model and format, the
carrier-phase arc / loss-of-lock logic, a semantic diff, and a self-contained
RINEX 3.x reader/writer (the *internal* backend). Optional `rtcm` and `ubx`
features add the raw-stream converters.
- **`rinex-obsj`** — a bridge to the third-party
[`rinex`](https://crates.io/crates/rinex) crate (the *external* backend),
which adds CRINEX (Hatanaka-compressed) input.
- **`convobs-cli`** — the `convobs` and `diffobs` binaries.
The external backend is optional, gated behind the CLI's `rinex-crate` feature.
The default build (`make release`) omits it for a lean, fully MIT-licensed
binary; `make release-full` (or `make install-full`) enables it, linking the
`rinex` crate and its MPL-2.0 dependencies and adding CRINEX support.