This benchmark evaluates MRTKLIB's kinematic (vehicle-mounted) positioning
performance using the open-data PPC2024 (Precise Positioning Challenge)
dataset collected for the contest organised by the Institute of Navigation Japan
(測位航法学会). It covers six urban driving runs
(Nagoya × 3, Tokyo × 3) and supports four positioning modes. Each benchmark
config sets the correction axis explicitly:
| Mode | Engine | correction |
Correction source |
|---|---|---|---|
| CLAS | PPP-RTK | qzs-clas |
QZSS L6D (IS-QZSS-L6-003) |
| MADOCA | PPP | qzs-madoca |
QZSS L6E (MADOCA-PPP) |
| RTK | Kinematic RTK | none |
Rover + base station RINEX |
| single | SPP (single-point) | none |
Broadcast ephemeris only (base.nav) |
Note: This benchmark is intentionally excluded from the regular CTest suite because it requires large external datasets. Run it on demand.
Disclaimer: The configuration parameters used here have not been tuned or optimised for maximum accuracy. Results are provided for reference only and should not be taken as representative of the best achievable performance.
- Vehicle receiver: Septentrio mosaic-X5, 5 Hz, RINEX 3.04
- Reference station: Trimble NetR9/Alloy, 1 Hz, RINEX 3.04
- Ground truth: Applanix POS LV 220, provided as
reference.csv
| Run | City | Date | Duration |
|---|---|---|---|
| nagoya/run1 | Nagoya | 2024-08-03 | ~26 min |
| nagoya/run2 | Nagoya | 2024-07-20 | ~32 min |
| nagoya/run3 | Nagoya | 2024-08-03 | ~17 min |
| tokyo/run1 | Tokyo | 2024-07-23 | ~40 min |
| tokyo/run2 | Tokyo | 2024-07-23 | ~30 min |
| tokyo/run3 | Tokyo | 2024-07-23 | ~51 min |
The PPC-Dataset (~200 MB) must be downloaded manually:
- Visit the dataset page or use the direct SharePoint link provided by the PPC2024 organiser.
- Download and unzip the archive.
- Place the contents so that the layout matches:
data/benchmark/
nagoya/
run1/
rover.obs
base.nav
base.obs
reference.csv
...
run2/ ...
run3/ ...
tokyo/
run1/ ...
...
The data/benchmark/ directory is listed in .gitignore and will not be
committed.
GPS TOW (s), GPS Week, Latitude (deg), Longitude (deg), Ellipsoid Height (m),
ECEF X (m), ECEF Y (m), ECEF Z (m), Roll (deg), Pitch (deg), Heading (deg),
East Velocity (m/s), North Velocity (m/s), Up Velocity (m/s)
-
Build MRTKLIB (rnx2rtkp binary):
cmake --preset default cmake --build build
-
Extract test data (ATX, ISB, ERP, etc. required by the CLAS conf):
cd build && ctest -R setup --output-on-failure
-
Install Python dependencies:
cd scripts && python -m venv .venv && source .venv/bin/activate pip install numpy matplotlib
cd scripts/benchmark
python download_l6.py --mode bothThis downloads, for all six runs into data/benchmark/l6/, the CLAS L6D file
plus — for MADOCA-PPP — the L6E SSR file (first available PRN of 204/205/206/
207/209/210/211) and every available L6D ionospheric-augmentation file
(PRN 200/201). Use --dry-run to preview the URLs without downloading.
To fetch a date outside the benchmark cases, use --datetime with a UTC date
and an optional session letter (A–X, one per UTC hour):
python download_l6.py --datetime 2026-07-25A # one hourly session
python download_l6.py --datetime 2026-07-25 # all 24 sessions of the day
singlemode needs no correction data — it uses onlyrover.obs+base.nav(broadcast ephemeris). Skip this step and runrun_benchmark.py --mode single --skip-download.
Three of the six runs (tokyo_run3, nagoya_run1, nagoya_run3) cross a UTC
hour boundary and therefore need two hourly sessions per stream. mrtk post
cannot read those as a sequence — it keeps only the first L6E file, and it
treats each CLAS .l6 file as a separate transmit-pattern channel
(#316) — so run_benchmark.py
concatenates the sessions of each stream into data/benchmark/l6/merged/
before invoking it. The merged files are regenerated whenever a source
session is newer, and can be deleted at any time.
Options:
| Option | Default | Description |
|---|---|---|
--l6-dir DIR |
data/benchmark/l6 |
Where to store L6 files |
--mode clas|madoca|both |
both |
Which correction type |
--case ID[,ID...] |
all | Restrict to specific run IDs |
--datetime YYYY-MM-DD[S] |
— | UTC date (+ optional session letter) instead of the cases; mutually exclusive with --case |
--dry-run |
off | Print URLs without downloading |
python scripts/benchmark/run_benchmark.pyThis calls rnx2rtkp for each run × mode combination, saves NMEA output to
data/benchmark/results/, and prints a summary table.
Results are cached: if the NMEA output file is newer than all its inputs,
the positioning step is skipped. Use --force to re-run.
Full options:
| Option | Default | Description |
|---|---|---|
--dataset-dir DIR |
data/benchmark |
PPC-Dataset root |
--l6-dir DIR |
data/benchmark/l6 |
L6 file cache |
--out-dir DIR |
data/benchmark/results |
NMEA output dir |
--mode single|clas|madoca|rtk|both|all |
all |
Positioning mode (single=SPP, both=clas+madoca, all=clas+madoca+rtk) |
--case ID[,ID...] |
all | Run specific cases only |
--rnx2rtkp PATH |
auto | Path to rnx2rtkp binary |
--skip-download |
off | Skip L6 download |
--force |
off | Re-run even if cached |
--skip-epochs N |
60 | Epochs excluded from metrics |
--plot |
off | Save ENU PNG per case |
-v / --verbose |
off | Show rnx2rtkp output |
cd scripts/benchmark
python compare_ppc.py \
--ref ../../data/benchmark/nagoya/run1/reference.csv \
../../data/benchmark/results/nagoya_run1_clas.nmeaShared by every results section below.
CLAS and RTK produce integer-fix solutions and are broken down into three tiers. MADOCA-PPP never produces an integer fix and is reported as a single PPP tier.
| Tier | Modes | GGA quality | Description |
|---|---|---|---|
| FIX | CLAS, RTK | Q=4 | Integer ambiguity fix epochs only |
| FF | CLAS, RTK | Q=4, 5 | Fix + float; excludes SPP fallback (Q=1) |
| ALL | CLAS, RTK | any | Every matched epoch including SPP |
| PPP | MADOCA | Q=3 | All valid PPP-float epochs (Q=0 already filtered) |
| SPP | single | Q=1 | All valid single-point epochs; Rate% = fraction with 2D error < 2 m |
Rate% column:
- FIX / FF rows: fraction of that tier among all matched epochs
- PPP row: fraction of epochs with 2D horizontal error < 30 cm
<30cm column: fraction of that row's own N epochs with 2D horizontal
error below 30 cm. On the FIX row it answers "of the epochs that claimed an
integer fix, how many were actually right", so its complement is the misfix
rate — a Q=4 epoch beyond 30 cm is a wrong fix, not a degraded one. The
per-case progress line prints that complement directly as misfix=. The column
was added in v0.7.7, so the earlier tables below do not carry it.
TTFF column:
- CLAS / RTK: first epoch of a ≥30-consecutive Q=4 run (shown on FIX row)
- MADOCA: first epoch of a ≥30-consecutive sub-30 cm run (shown on PPP row)
Results recorded on MRTKLIB v0.3.3, GNSS-only (no IMU), --skip-epochs 60.
The current numbers are in v0.7.7 Benchmark Results. Everything from here to that section is kept as the historical record the later comparisons are measured against.
| Case | Mode | Tier | N | nSV | Rate% | RMS 2D | 1σ (68%) | 95% | TTFF (s) |
|---|---|---|---|---|---|---|---|---|---|
| nagoya_run1 | CLAS | FIX | 1 276 | 7.9 | 17.0% | 1.105 m | 0.402 m | 0.452 m | 0 |
| FF | 1 828 | 7.2 | 24.3% | 2.870 m | 0.441 m | 8.409 m | — | ||
| ALL | 7 525 | 9.0 | — | 42.784 m | 4.089 m | 53.212 m | — | ||
| nagoya_run1 | MADOCA | PPP | 1 968 | 15.0 | 0.0% | 17.428 m | 2.108 m | 4.684 m | — |
| nagoya_run1 | RTK | FIX | 2 140 | 18.8 | 29.7% | 1.536 m | 0.112 m | 0.151 m | 799 |
| FF | 7 216 | 16.8 | 100.0% | 5.953 m | 0.398 m | 4.809 m | — | ||
| ALL | 7 216 | 16.8 | — | 5.953 m | 0.398 m | 4.809 m | — | ||
| nagoya_run2 | CLAS | FIX | 2 522 | 6.5 | 26.9% | 1.088 m | 0.717 m | 0.826 m | 0 |
| FF | 6 002 | 5.6 | 63.9% | 15.903 m | 1.455 m | 36.589 m | — | ||
| ALL | 9 390 | 4.7 | — | 305.610 m | 8.323 m | 73.892 m | — | ||
| nagoya_run2 | MADOCA | PPP | 7 494 | 11.9 | 0.2% | 39.299 m | 2.967 m | 19.443 m | — |
| nagoya_run2 | RTK | FIX | 1 489 | 20.7 | 16.1% | 1.081 m | 0.154 m | 0.196 m | 0 |
| FF | 9 274 | 15.3 | 100.0% | 6.588 m | 1.026 m | 11.809 m | — | ||
| ALL | 9 274 | 15.3 | — | 6.588 m | 1.026 m | 11.809 m | — | ||
| nagoya_run3 | CLAS | FIX | 325 | 6.9 | 6.3% | 0.318 m | 0.339 m | 0.397 m | 9 |
| FF | 1 973 | 5.7 | 38.4% | 12.026 m | 2.530 m | 38.241 m | — | ||
| ALL | 5 141 | 6.0 | — | 12.746 m | 6.606 m | 27.890 m | — | ||
| nagoya_run3 | MADOCA | PPP | 2 753 | 10.8 | 2.1% | 2.649 m | 2.246 m | 4.285 m | — |
| nagoya_run3 | RTK | FIX | 416 | 18.7 | 8.2% | 0.307 m | 0.128 m | 0.150 m | 72 |
| FF | 5 095 | 13.2 | 100.0% | 3.832 m | 3.462 m | 8.016 m | — | ||
| ALL | 5 095 | 13.2 | — | 3.832 m | 3.462 m | 8.016 m | — |
| Case | Mode | Tier | N | nSV | Rate% | RMS 2D | 1σ (68%) | 95% | TTFF (s) |
|---|---|---|---|---|---|---|---|---|---|
| tokyo_run1 | CLAS | FIX | 612 | 7.6 | 5.2% | 0.868 m | 0.239 m | 2.483 m | 15 |
| FF | 9 235 | 6.4 | 77.8% | 119.243 m | 3.462 m | 25.545 m | — | ||
| ALL | 11 867 | 5.9 | — | 627.063 m | 7.914 m | 277.340 m | — | ||
| tokyo_run1 | MADOCA | PPP | 3 084 | 12.9 | 16.6% | 1.825 m | 0.979 m | 1.957 m | 0 |
| tokyo_run1 | RTK | FIX | 380 | 15.7 | 3.4% | 0.711 m | 0.027 m | 0.643 m | 1840 |
| FF | 11 271 | 16.0 | 100.0% | 8.272 m | 7.033 m | 19.674 m | — | ||
| ALL | 11 271 | 16.0 | — | 8.272 m | 7.033 m | 19.674 m | — | ||
| tokyo_run2 | CLAS | FIX | 1 972 | 7.2 | 21.7% | 0.590 m | 0.117 m | 1.041 m | 368 |
| FF | 6 841 | 6.3 | 75.3% | 22.988 m | 1.194 m | 14.921 m | — | ||
| ALL | 9 091 | 5.7 | — | 33.433 m | 2.389 m | 33.465 m | — | ||
| tokyo_run2 | MADOCA | PPP | 8 159 | 13.7 | 6.7% | 2.894 m | 1.181 m | 4.580 m | 464 |
| tokyo_run2 | RTK | FIX | 1 517 | 24.3 | 18.3% | 17.993 m | 0.010 m | 0.059 m | 806 |
| FF | 8 304 | 19.2 | 100.0% | 33.845 m | 4.521 m | 50.604 m | — | ||
| ALL | 8 304 | 19.2 | — | 33.845 m | 4.521 m | 50.604 m | — | ||
| tokyo_run3 | CLAS | FIX | 1 129 | 8.1 | 7.4% | 0.801 m | 0.075 m | 1.831 m | 28 |
| FF | 2 629 | 7.3 | 17.2% | 3.764 m | 0.628 m | 2.427 m | — | ||
| ALL | 15 241 | 11.4 | — | 41.464 m | 3.737 m | 29.607 m | — | ||
| tokyo_run3 | MADOCA | PPP | 2 795 | 14.3 | 3.4% | 0.724 m | 0.750 m | 1.062 m | 26 |
| tokyo_run3 | RTK | FIX | 3 669 | 25.0 | 25.1% | 0.293 m | 0.013 m | 0.051 m | 335 |
| FF | 14 639 | 21.7 | 100.0% | 4.178 m | 1.374 m | 10.761 m | — | ||
| ALL | 14 639 | 21.7 | — | 4.178 m | 1.374 m | 10.761 m | — |
- CLAS FIX accuracy (Q=4 only): RMS 2D is 0.3–1.1 m across all runs — consistent PPP-RTK performance under urban multipath.
- CLAS FF vs ALL gap: the large ALL RMS (13–627 m) reflects SPP fallback epochs (Q=1) that dominate in dense canyons. FF tier (24–78%) excludes these.
- RTK FF = ALL: RTK outputs Q=4 (fix) or Q=5 (float) only — no SPP fallback — so FF always equals ALL.
- RTK FIX quality: with triple-frequency AR (
l1+2+3,ionoopt=off), most runs achieve sub-metre FIX RMS (e.g. nagoya_run3: 0.31 m, tokyo_run3: 0.29 m). tokyo_run2 FIX RMS remains elevated (18 m) despite tiny 1σ/95% values, indicating a small number of wrongly-fixed epochs that dominate the RMS at this ~27 km baseline. This false-fix issue is resolved in v0.4.0 (see below). - MADOCA PPP N: outputs Q=3 (PPP float) or Q=0 (no solution); Q=0 is filtered, so N reflects epochs where the filter produced a solution. In nagoya_run1, only 27% of rover epochs have a valid solution (heavy urban multipath). In nagoya_run2 and tokyo_run2 (more open sky), coverage is ~100%. This is a real performance limitation — not a software or configuration issue.
- CLAS nagoya_run2 TTFF=0 means the very first epoch after the skip window was already in a sustained fix run.
- RTK baselines range from ~13 km (Nagoya) to ~27 km (Tokyo), which is long for kinematic RTK; float solutions dominate accordingly.
MRTKLIB v0.4.0 (feat/demo5-integration) integrates several RTK algorithm
improvements from rtklibexplorer's demo5 fork.
The CLAS and MADOCA engines are unaffected by these changes.
| Phase | Change |
|---|---|
| 1A | Partial Ambiguity Resolution (PAR) — LAMBDA tries reduced satellite subsets to raise fix ratio |
| 1B | AR-filter — exclude newly-locked satellites that degrade the fix ratio; retry LAMBDA without them |
| 2A | Doppler-based cycle-slip detection (pos2-thresdop) |
| 2B | Minimum-fix-satellite guard (pos2-arminfixsats) — reject fixes with too few satellite pairs |
| 3A | seliflc() — Galileo triple-freq IFLC now uses L1+L5 (not L1+L2) |
| 3A | SNR-weighted observation variance (err[6] term in varerr()) |
| 3B | Adaptive 10× outlier threshold for newly-initialised phase biases |
| 3B | rejc<2 guard — phase-bias reset requires ≥2 successive rejections, not just one |
Three new parameters are enabled in conf/benchmark/rtk.conf:
pos2-arminfixsats = 4 # min satellite pairs for a valid PAR fix
pos2-arfilter = on # exclude newly-locked sats that degrade ratio
pos2-thresdop = 1.0 # Doppler slip threshold (cyc/s, 0=off)--skip-epochs 60, FIX tier (Q=4) only.
| Case | Fix% (v0.3.3) | Fix% (v0.4.0) | RMS_2D fix (v0.3.3) | RMS_2D fix (v0.4.0) | TTFF (v0.4.0) |
|---|---|---|---|---|---|
| nagoya_run1 | 29.7% | 29.1% | 1.536 m | 0.418 m | 796 s |
| nagoya_run2 | 16.1% | 28.0% | 1.081 m | 0.596 m | 0 s |
| nagoya_run3 | 8.2% | 10.1% | 0.307 m | 0.837 m | 78 s |
| tokyo_run1 | 3.4% | 3.1% | 0.711 m | 0.342 m | 1840 s |
| tokyo_run2 | 18.3% | 25.9% | 0.095 m | 802 s | |
| tokyo_run3 | 25.1% | 27.7% | 0.293 m | 0.219 m | 658 s |
- tokyo_run2 false-fix elimination: v0.3.3 had RMS_2D(fix) = 17.993 m despite
tiny 1σ/95% values — a small cluster of wrongly-fixed epochs dominated the RMS at
this ~27 km baseline. The
rejc<2guard (Phase 3B) prevents premature phase-bias reset on a single transient outlier. Combined witharminfixsats=4, the false fix is eliminated and RMS_2D(fix) drops to 0.095 m — a 189× improvement. - nagoya_run2 fix rate: +12 pp (16.1% → 28.0%); PAR finds valid partial subsets on a run with fewer simultaneously-clean satellite pairs.
- 5/6 runs show improved RMS_2D(fix); 4/6 runs show improved Fix%.
- nagoya_run3 RMS_2D(fix) increases (0.307 → 0.837 m) while Fix% rises slightly, suggesting the fix window now includes noisier epochs that were previously rejected.
A second deep-diff pass against demo5 identified additional correctness fixes
(Phases 4A–4F). Results below use city conf (nagoya.conf / tokyo.conf) for
precise base-station coordinates.
| Phase | Change |
|---|---|
| 4A | DD residual minimum raised from 1 → 4 to prevent rank-deficient filter updates |
| 4A | fix[j]=2 retention across non-fix epochs (preserves AR candidates) |
| 4A | seph2clk() parenthesis bug fix (SBAS clock iteration) |
| 4A | GF cycle-slip: add thresslip==0 guard; use continue instead of early return |
| 4B | varerr() rewrite: per-constellation EFACT (GAL/QZS/CMP/IRN), SNR term, IFLC scaling |
| 4B | Half-cycle variance inflation (+0.01 m²) when LLI_HALFC bit set |
| 4C | GLONASS clock: reject ephemeris with ` |
| 4C | GLONASS health: ICD-specific bit check `(svh&9)!=0 |
| 4D | Acceleration coupling gated on position variance < thresar[1] |
| 4E | Revert E5 (vsat set by phase DD → code DD): phase-only vsat deadlocks in urban canyons |
| 4E | Revert E3 (conditional lock increment): nfix>0 guard prevents bootstrap from 0 |
| 4F | Revert Phase 4D conditional lock: froze lock counts on nfix=0 epochs, sustaining false-fix/holdamb cycles in urban canyons |
--skip-epochs 60, FIX tier (Q=4) only.
v0.4.0: no city conf (base position from RINEX header).
v0.4.1: city conf applied (precise base-station LLH coordinates).
| Case | Fix% (v0.4.0) | Fix% (v0.4.1) | Δ Fix% |
|---|---|---|---|
| nagoya_run1 | 29.1% | 27.4% | −1.7 pp |
| nagoya_run2 | 28.0% | 28.3% | +0.3 pp |
| nagoya_run3 | 10.1% | 10.1% | 0 pp |
| tokyo_run1 | 3.1% | 2.9% | −0.2 pp |
| tokyo_run2 | 25.9% | 22.1% | −3.8 pp |
| tokyo_run3 | 27.7% | 27.7% | 0 pp |
Fix rate vs v0.4.0 is mixed (Phase 4D conditional lock reverted), but all runs remain equal to or better than the v0.3.3 baseline except nagoya_run1 (27.4% vs 29.7%).
| Case | RMS_2D (v0.3.3) | RMS_2D (v0.4.0) | RMS_2D (v0.4.1) | 1σ (v0.4.1) | TTFF (v0.4.1) |
|---|---|---|---|---|---|
| nagoya_run1 | 1.536 m | 0.418 m | 0.425 m | 0.112 m | 797 s |
| nagoya_run2 | 1.060 m | 0.589 m | 1.014 m ↑ | 0.175 m | 0 s |
| nagoya_run3 | 0.307 m | 0.837 m | 0.716 m | 0.135 m | 74 s |
| tokyo_run1 | 0.709 m | 0.341 m | 0.555 m ↑ | 0.026 m | 1841 s |
| tokyo_run2 | 0.095 m | 0.079 m | 0.020 m | 803 s | |
| tokyo_run3 | 0.292 m | 0.219 m | 0.095 m | 0.013 m | 658 s |
- Fix rate vs v0.3.3 baseline: 4/6 runs improved (nagoya_run2 +12 pp, tokyo_run2 +4 pp, tokyo_run3 +3 pp, nagoya_run3 +2 pp); 1/6 slightly below (nagoya_run1 −2 pp); 1/6 nearly unchanged (tokyo_run1 −0.5 pp).
- 1σ accuracy restored: Phase 4D's conditional lock increment caused false-fix persistence (holdamb cycles in urban canyons), inflating nagoya_run3 1σ to 1.373 m. Phase 4F reverts this, restoring 1σ = 0.135 m — matching the v0.3.3 baseline (0.128 m).
- Mechanism: once
holdamb()fires with wrong integers, it constrains ambiguity P to VAR_HOLDAMB=0.001 cy² (process noise would need ~10 M epochs to overcome). The conditional lock froze lock counters onnfix=0epochs, preventing satellite-set diversification and causing immediate re-selection of the same wrong integers. Reverting to unconditionallock++allows the eligible satellite set to evolve between fix attempts, enabling eventual escape from the false-fix cycle. - TTFF: nagoya_run1 regresses slightly (797 s vs 64 s with Phase 4D conditional lock), but the underlying accuracy is preserved. The Phase 4D accel-coupling gate (D1) is retained; it improves state convergence without the false-fix side-effect.
MRTKLIB v0.4.2 (feat/ppp-rtk-demo5-improvements) extends the demo5
algorithm improvements from the RTK engine to the CLAS (PPP-RTK) and
MADOCA (PPP) engines. The RTK engine is unchanged.
| Phase | Engine | Change |
|---|---|---|
| A | PPP-RTK, PPP | ephpos() now rejects GLONASS ephemeris with |taun| > 1 s — consistent with ephclk() guard present since v0.3.3 |
| B2 | PPP-RTK | Position variance gate: skip AR when mean diag(P[0..2]) > thresar[1] (prevents premature fixing before filter converges) |
| B3 | PPP-RTK | arfilter: after PAR fails, back off newly-locked satellites one epoch and retry LAMBDA |
| C | PPP-RTK, PPP | Doppler-based cycle-slip detection (detslp_dop, pos2-thresdop) |
| C | PPP-RTK, PPP | Observation-code-change cycle-slip detection (detslp_code) |
| D1 | PPP-RTK, PPP | Full per-constellation EFACT in varerr(): GAL/QZS/CMP/IRN added (previously only GPS/GLO/SBS) |
| D2 | PPP-RTK only | Adaptive 10× outlier threshold for newly-initialised phase biases in residual_test() |
Note on D2 and PPP: The adaptive outlier inflation was found to cause a severe regression in undifferenced PPP (tokyo_run1 MADOCA RMS: 1.8 m → 199 m) because PPP phase residuals are not double-differenced and can legitimately reach tens of metres at initialisation. D2 is applied only to PPP-RTK, whose sigma-normalised test already incorporates the large initial bias variance via Q.
--skip-epochs 60, FIX tier (Q=4) only.
| Case | Fix% (v0.3.3) | Fix% (v0.4.2) | Δ Fix% | RMS_2D fix (v0.3.3) | RMS_2D fix (v0.4.2) | 1σ (v0.3.3) | 1σ (v0.4.2) | TTFF (v0.4.2) |
|---|---|---|---|---|---|---|---|---|
| nagoya_run1 | 17.0% | 17.0% | 0 pp | 1.105 m | 1.105 m | 0.402 m | 0.402 m | 0 s |
| nagoya_run2 | 26.9% | 23.4% | −3.5 pp | 1.088 m | 1.119 m | 0.717 m | 0.461 m | 0 s |
| nagoya_run3 | 6.3% | 6.3% | 0 pp | 0.318 m | 0.318 m | 0.339 m | 0.339 m | 9 s |
| tokyo_run1 | 5.2% | 4.9% | −0.3 pp | 0.868 m | 0.747 m | 0.239 m | 0.244 m | 15 s |
| tokyo_run2 | 21.7% | 21.7% | 0 pp | 0.590 m | 0.514 m | 0.117 m | 0.120 m | 368 s |
| tokyo_run3 | 7.4% | 7.4% | 0 pp | 0.801 m | 0.801 m | 0.075 m | 0.075 m | 28 s |
MADOCA results are unchanged across all 6 runs. The algorithms applied to the PPP engine (Phase A GLO taun, Phase C detslp_dop/code, Phase D1 EFACT) produced no measurable difference on this dataset, and Phase D2 was explicitly excluded from PPP to avoid undifferenced-observation regression.
| Case | N (v0.3.3) | N (v0.4.2) | <30cm% (v0.3.3) | <30cm% (v0.4.2) | RMS_2D (v0.3.3) | RMS_2D (v0.4.2) |
|---|---|---|---|---|---|---|
| nagoya_run1 | 1 968 | 1 968 | 0.0% | 0.0% | 17.428 m | 17.428 m |
| nagoya_run2 | 7 494 | 7 494 | 0.2% | 0.2% | 39.299 m | 39.299 m |
| nagoya_run3 | 2 753 | 2 753 | 2.1% | 2.1% | 2.649 m | 2.649 m |
| tokyo_run1 | 3 084 | 3 084 | 16.6% | 16.6% | 1.825 m | 1.825 m |
| tokyo_run2 | 8 159 | 8 159 | 6.7% | 6.7% | 2.894 m | 2.894 m |
| tokyo_run3 | 2 795 | 2 795 | 3.4% | 3.4% | 0.724 m | 0.724 m |
- CLAS tokyo accuracy: 2/6 runs show improved FIX RMS_2D (tokyo_run1: −14%, tokyo_run2: −13%). The D1 EFACT expansion provides slightly more accurate variance modelling for multi-constellation measurements.
- CLAS nagoya_run2 fix rate: −3.5 pp (26.9% → 23.4%). This run's FF rate
simultaneously improved (+4 pp: 63.9% → 67.9%) and 1σ FIX accuracy improved
significantly (0.717 m → 0.461 m), indicating that fewer but higher-quality
fixes are produced. The likely mechanism: Phase C
detslp_coderesets biases on code-switching events, increasing FLOAT residency but reducing false fixes. - CLAS 4/6 runs: Fix rate and FIX accuracy unchanged.
- MADOCA unchanged: The demo5 algorithmic improvements have no measurable impact on MADOCA PPP for this dataset. Future gains may require PPP-specific improvements (e.g., adaptive iono/trop Q tuning, wider MADOCA signal selection).
MRTKLIB v0.6.10 (#116) adds
opt-in, default-off accuracy improvements to the single-point (single)
engine — historically a near-verbatim RTKLIB 2.4.3 snapshot WLS solver:
- C/N0 (Sigma-ε) pseudorange weighting — down-weight low-C/N0 signals.
- IGG-III robust re-weighting + a pre-robust acceptance gate that keeps the chi-square test effective under weighting (without it, weighting inflates the error tail).
- TDCP velocity (time-differenced carrier phase, mm/s-class) with Doppler fallback, a SPP-local cycle-slip detector, and a jump-rejection QC that drops epochs whose code position change disagrees with the TDCP displacement.
The full design rationale, staged per-feature analysis, and the deferred work
are in docs/design/spp-accuracy.md.
The features are gated under [positioning] / [kalman_filter.measurement_error]
and shipped enabled together in conf/benchmark/single.toml:
[positioning]
mode = "single"
correction = "none"
robust = "igg3" # IGG-III robust + pre-robust gate
tdcp = true # TDCP velocity + jump rejection
tdcp_jump = 5.0 # m
[slip_detection]
doppler = 1.0 # Doppler-vs-phase slip threshold (cyc/s)
[kalman_filter.measurement_error]
snr_max = 50.0 # dB-Hz
snr_error = 0.5 # m (0 = C/N0 weighting off)prcopt_default keeps all of these off, so any other configuration is
bit-identical to the previous snapshot WLS.
--mode single --skip-epochs 60. Rate% is the fraction of epochs with 2D
horizontal error < 2 m.
| Case | Rate% | RMS 2D | p68 (1σ) | p95 |
|---|---|---|---|---|
| nagoya_run1 | 57.1 → 81.6 % | 27.92 → 15.10 m | 3.31 → 1.59 m | 17.82 → 10.08 m |
| nagoya_run2 | 56.9 → 75.5 % | 11.12 → 6.17 m | 3.41 → 1.44 m | 20.30 → 13.00 m |
| nagoya_run3 | 25.7 → 44.3 % | 10.59 → 8.34 m | 12.15 → 6.98 m | 18.36 → 17.60 m |
| tokyo_run1 | 33.0 → 56.5 % | 11.59 → 7.34 m | 6.90 → 2.57 m | 24.41 → 14.91 m |
| tokyo_run2 | 44.3 → 66.9 % | 5.19 → 3.45 m | 3.91 → 2.03 m | 10.67 → 7.23 m |
| tokyo_run3 | 30.1 → 42.2 % | 36.02 → 4.84 m | 3.91 → 2.34 m | 14.69 → 11.69 m |
| Mean | 41.2 → 61.2 % | 17.07 → 7.54 m | 5.61 → 2.83 m | 17.71 → 12.42 m |
- All six runs improve on every aggregate metric: <2 m rate +20 pp, median −50 %, p95 −30 %, RMS −56 %.
- The jump-rejection QC collapses the extreme tail — e.g. tokyo_run3 RMS 36.02 → 4.84 m — by removing code position spikes that the precise TDCP displacement contradicts.
- C/N0 weighting and robust estimation alone improve the bulk (rate, median) but defeat the snapshot chi-square gate; the pre-robust gate is what turns them into a clean win rather than a tail-inflating one.
- The residual tail is consistent NLOS bias, which snapshot methods cannot detect. P5 (common-mode clock-jump correction) and P6 (position EKF) need a smartphone dataset where clock jumps and large jitter occur, and are deferred to the GSDC benchmark follow-up (#165).
PPP-RTK computes a single-point fix every epoch that seeds — and, on a filter
reset (obs-loss gap, persistent-FLOAT, large PPP-RTK↔SPP divergence), re-seeds —
the CLAS filter position, which then feeds the ambiguity search. The same
v0.6.10 SPP error model can be applied to that seed without touching the CLAS
measurement model (the seed runs on a private option copy; C/N0 weighting uses
err[5]/err[6], while the CLAS ionosphere/troposphere terms are dedicated
options). Controlled by
[positioning.clas] enhanced_spp_seed, default cn0+tdcp:
| Value | Seed gets |
|---|---|
off |
nothing — bit-identical to prior behaviour |
cn0+tdcp |
C/N0 weighting + TDCP jump-reject (default) |
cn0+tdcp+robust |
the above + IGG-III robust (open-sky opt-in) |
Full rationale in docs/design/spp-accuracy.md §11.
--mode clas --skip-epochs 60. Fix% = Q=4 epochs; p95 = 95th-percentile
horizontal error over fixed epochs.
| Case | Fix% | p95 (fixed) |
|---|---|---|
| nagoya_run1 | 13.9 → 12.3 % | 4.60 → 5.07 m |
| nagoya_run2 | 35.0 → 36.1 % | 1.08 → 1.24 m |
| nagoya_run3 | 8.7 → 8.8 % | 2.31 → 2.30 m |
| tokyo_run1 | 30.3 → 32.3 % | 5.44 → 3.52 m |
| tokyo_run2 | 42.5 → 46.4 % | 5.86 → 5.84 m |
| tokyo_run3 | 11.9 → 12.4 % | 0.10 → 0.12 m |
| Mean | 23.7 → 24.7 % | 3.23 → 3.02 m |
- A modest net-positive: mean fix rate +1.0 pp, mean fixed-epoch p95 −21 cm, with the largest single gain on tokyo_run1 (p95 5.44 → 3.52 m). The change is per-case mixed (nagoya_run1 regresses slightly), so it is a refinement, not a step change.
- C/N0 weighting drives the p95 (tail) improvement; the seed-only TDCP jump-reject guards against wild SPP jumps but is neutral on this data.
- IGG-III robust is opt-in, not default. It lifts the mean fix rate a further
+1.0 pp and helps open-sky runs, but on the deep-urban-canyon run (tokyo_run3) it
shifts the seed enough to trip fix-and-hold into sustained mis-fixes
(mis-fixes 5 → 71, worst fixed error 4.4 m → 12 m). The harm is a filter-
coupling effect invisible to seed-local diagnostics and could not be reliably
auto-gated, so robust is left to the operator (use in open sky, omit in dense
urban). See
docs/design/spp-accuracy.md§11.4. - Inert on static positioning. All six claslib static (みなしローバー) regression cases run byte-close to the off baseline — deltas sub-cm RMS, inside the existing test tolerances — so the default is safe for the static use case while helping the kinematic one.
- Applies to real-time too. Real-time PPP-RTK/VRS-RTK (
mrtk run) calls the samertkpos()seed path, so the default profile is active there as well — arguably where it matters most (stream gaps and slips make real-time the reset-prone regime the seed targets). The numbers above are post-processing; the real-time effect has not yet been separately benchmarked.
Full re-run of all six cases × three modes on the current code, in a single
pass. This is the first table to carry the <30cm column, and the first since
the benchmark harness bug described below was fixed.
| Binary | mrtk (MRTKLIB ver.0.7.7 git v0.7.7-8-g31511dd) |
| Platform | macOS 26.5.2, Apple M3 (arm64) |
| BLAS / LAPACK | Accelerate (default; not a MRTK_DETERMINISTIC_BLAS build) |
| Command | run_benchmark.py --mode all --skip-download --skip-epochs 60 --force |
| Configs | conf/benchmark/{clas,madoca,rtk}.toml + {nagoya,tokyo}.toml, untuned |
On this data two runs with identical arguments agree to within the last digit
of latitude/longitude (≈0.2 mm on ~10% of epochs — the known macOS/Accelerate
floating-point nondeterminism) and every statistic below is unchanged between
runs. That is not a general guarantee: ambiguity resolution is a threshold
decision, so a build where fixes sit near the ratio test can flip epochs. Use
a MRTK_DETERMINISTIC_BLAS build (OpenBLAS LP64, single-threaded) when exact
reproducibility matters.
| Case | Mode | Tier | N | nSV | Rate% | <30cm |
RMS 2D | 1σ (68%) | 95% | TTFF (s) |
|---|---|---|---|---|---|---|---|---|---|---|
| nagoya_run1 | CLAS | FIX | 4 059 | 10.1 | 53.9% | 13.3% | 0.995 m | 0.648 m | 1.162 m | 0 |
| FF | 6 727 | 9.2 | 89.4% | 12.3% | 14.061 m | 1.111 m | 13.114 m | — | ||
| ALL | 7 525 | 8.6 | — | 11.0% | 40.073 m | 1.161 m | 49.030 m | — | ||
| nagoya_run1 | MADOCA | PPP | 6 347 | 12.8 | 2.0% | 2.0% | 11.178 m | 3.220 m | 14.813 m | 1089 |
| nagoya_run1 | RTK | FIX | 2 103 | 19.0 | 28.9% | 98.7% | 1.002 m | 0.112 m | 0.145 m | 799 |
| FF | 7 213 | 16.8 | 99.0% | 65.5% | 6.129 m | 0.397 m | 5.732 m | — | ||
| ALL | 7 283 | 16.7 | — | 64.9% | 21.171 m | 0.408 m | 6.389 m | — | ||
| nagoya_run2 | CLAS | FIX | 3 194 | 11.3 | 34.0% | 2.5% | 2.372 m | 0.486 m | 1.241 m | 0 |
| FF | 8 338 | 8.8 | 88.8% | 3.3% | 375.042 m | 3.653 m | 35.311 m | — | ||
| ALL | 9 390 | 8.4 | — | 2.9% | 426.142 m | 7.316 m | 60.785 m | — | ||
| nagoya_run2 | MADOCA | PPP | 7 493 | 11.9 | 0.2% | 0.2% | 39.302 m | 2.967 m | 19.450 m | — |
| nagoya_run2 | RTK | FIX | 695 | 23.0 | 7.4% | 91.9% | 1.849 m | 0.083 m | 3.315 m | 0 |
| FF | 9 274 | 15.3 | 99.4% | 24.1% | 6.888 m | 3.690 m | 11.765 m | — | ||
| ALL | 9 332 | 15.3 | — | 23.9% | 16.616 m | 3.693 m | 11.793 m | — | ||
| nagoya_run3 | CLAS | FIX | 761 | 10.0 | 14.8% | 71.9% | 2.145 m | 0.286 m | 7.602 m | 8 |
| FF | 4 619 | 7.6 | 89.8% | 18.9% | 9.832 m | 8.329 m | 20.464 m | — | ||
| ALL | 5 141 | 7.4 | — | 17.1% | 20.877 m | 8.647 m | 20.780 m | — | ||
| nagoya_run3 | MADOCA | PPP | 4 487 | 10.7 | 2.1% | 2.1% | 3.141 m | 2.817 m | 5.731 m | 852 |
| nagoya_run3 | RTK | FIX | 27 | 8.0 | 0.5% | 18.5% | 2.049 m | 2.656 m | 2.755 m | — |
| FF | 5 095 | 13.2 | 99.1% | 3.6% | 4.721 m | 4.133 m | 8.807 m | — | ||
| ALL | 5 139 | 13.1 | — | 3.6% | 4.722 m | 4.155 m | 8.798 m | — |
| Case | Mode | Tier | N | nSV | Rate% | <30cm |
RMS 2D | 1σ (68%) | 95% | TTFF (s) |
|---|---|---|---|---|---|---|---|---|---|---|
| tokyo_run1 | CLAS | FIX | 3 844 | 12.0 | 32.4% | 88.0% | 3.346 m | 0.118 m | 1.660 m | 0 |
| FF | 10 614 | 9.9 | 89.4% | 36.2% | 496.925 m | 4.980 m | 44.407 m | — | ||
| ALL | 11 867 | 9.5 | — | 32.4% | 614.175 m | 8.515 m | 56.104 m | — | ||
| tokyo_run1 | MADOCA | PPP | 3 084 | 12.9 | 16.6% | 16.6% | 1.825 m | 0.979 m | 1.957 m | 0 |
| tokyo_run1 | RTK | FIX | 396 | 15.3 | 3.4% | 85.6% | 2.068 m | 0.038 m | 6.242 m | 1840 |
| FF | 11 268 | 16.0 | 96.7% | 5.5% | 6.639 m | 6.796 m | 13.897 m | — | ||
| ALL | 11 657 | 15.5 | — | 5.3% | 17.026 m | 6.719 m | 13.847 m | — | ||
| tokyo_run2 | CLAS | FIX | 4 392 | 11.3 | 48.3% | 80.5% | 2.546 m | 0.099 m | 7.782 m | 0 |
| FF | 8 164 | 9.8 | 89.8% | 49.5% | 10.046 m | 1.723 m | 12.535 m | — | ||
| ALL | 9 091 | 9.2 | — | 44.5% | 495.580 m | 3.022 m | 19.223 m | — | ||
| tokyo_run2 | MADOCA | PPP | 8 159 | 13.7 | 6.0% | 6.0% | 2.893 m | 1.181 m | 4.579 m | 464 |
| tokyo_run2 | RTK | FIX | 1 640 | 22.5 | 18.3% | 88.9% | 77.658 m | 0.013 m | 240.842 m | 213 |
| FF | 8 475 | 18.5 | 94.4% | 36.9% | 47.381 m | 7.396 m | 56.789 m | — | ||
| ALL | 8 982 | 17.5 | — | 37.7% | 47.646 m | 6.818 m | 57.057 m | — | ||
| tokyo_run3 | CLAS | FIX | 8 899 | 12.6 | 58.4% | 93.6% | 0.972 m | 0.055 m | 0.479 m | 0 |
| FF | 13 996 | 11.3 | 91.8% | 63.7% | 11.484 m | 0.522 m | 20.050 m | — | ||
| ALL | 15 241 | 10.7 | — | 58.6% | 48.709 m | 1.018 m | 25.905 m | — | ||
| tokyo_run3 | MADOCA | PPP | 14 370 | 14.4 | 11.2% | 11.2% | 3.348 m | 1.289 m | 8.840 m | 26 |
| tokyo_run3 | RTK | FIX | 2 602 | 24.4 | 17.3% | 98.3% | 1.867 m | 0.011 m | 0.064 m | 335 |
| FF | 14 626 | 21.3 | 97.4% | 31.7% | 56.934 m | 5.991 m | 20.338 m | — | ||
| ALL | 15 022 | 20.8 | — | 31.0% | 106.597 m | 6.388 m | 22.078 m | — |
Part of the CLAS and MADOCA gain is a harness fix, not an algorithm gain.
Three runs — tokyo_run3, nagoya_run1, nagoya_run3 — cross a UTC hour
boundary and therefore need two hourly L6 archive sessions. Until
#316 /
#317, mrtk post silently used
only the first session, so those runs lost every correction at the boundary and
their published numbers covered a fraction of the drive. Concatenating the
sessions restores them (e.g. tokyo_run3 MADOCA 2 855 → 14 430 epochs, tokyo_run3
CLAS fix 14.0% → 58.5%). Attribute that part to the harness, not to the
engines. The other three runs are single-session and were never affected.
MADOCA is the control. On those three unaffected runs the numbers reproduce
the v0.3.3 / v0.4.2 record almost exactly — tokyo_run1 <30cm 16.6% → 16.6% and
RMS 1.825 → 1.825 m, nagoya_run2 39.299 → 39.302 m, tokyo_run2 2.894 → 2.893 m.
Across four minor releases that stability shows the dataset, truth file, epoch
matching and metric code are unchanged, which is what makes the comparisons on
the other two modes meaningful.
CLAS improved across the board. Fix rate is up on every case against the v0.4.2 record (tokyo_run3 7.4% → 58.4%, tokyo_run2 21.7% → 48.3%, nagoya_run1 17.0% → 53.9%), consistent with the v0.7.x PPP-RTK parity work — with the harness caveat above applying to three of them.
CLAS fixed-epoch accuracy in Nagoya is a long-standing limitation, not a
regression. The <30cm column makes it visible for the first time (nagoya_run1
13.3%, nagoya_run2 2.5%), but v0.3.3 already recorded fixed-tier 1σ of 0.402 m
and 0.717 m on those runs against 0.648 m and 0.486 m today — the same regime.
RTK on the same data holds 0.112 m and 0.083 m, so this is specific to the CLAS
path in that area.
!!! note "The RTK rows above carry the #318 regression — see the corrected table below"
The RTK numbers in the v0.7.7 tables were produced with rover-side
cycle-slip detection silently disabled: since v0.6.10 the SPP TDCP
snapshot in `pntpos()` overwrote the `ssat` previous-phase bookkeeping
every epoch, so `detslp_ll()` / `detslp_dop()` skipped every rover
satellite (`timediff < DTTOL`). Undetected slips carried integer-cycle
phase-bias errors into fix-and-hold — the tokyo_run2 false-fix tail
(1.3 cm 1σ / 240 m 95%) is the same mode v0.4.0 eliminated, returned.
Root cause and fix in
[#318](https://github.com/h-shiono/MRTKLIB/issues/318). CLAS and
MADOCA never read those slots in the affected way and are unaffected
(verified metric-identical with the fix). The corrected RTK results
follow.
Same environment, data and configuration as the v0.7.7 run above; binary is
develop plus the #318 fix (ver.0.7.7 git v0.7.7-13-g2a052cf). CLAS and
MADOCA rows are unchanged by the fix (NMEA differences are the known
Accelerate last-digit noise only), so only RTK is re-recorded. All six cases
return to the v0.4.1 record; nagoya_run2 / nagoya_run3 / tokyo_run1 match it
to the millimetre, and the tokyo_run2 fixed tier is again clean (misfix
11.1% → 0.6%, 95% 240.8 m → 0.15 m). The remaining tokyo_run2 RMS 2D of
6.27 m comes from ~11 residual misfix epochs that the v0.4.1 tag rebuilt on
this machine also produces (20.4% / 6.27 m) — the 0.079 m in the recorded
v0.4.1 table is single-run Accelerate luck, not a remaining engine gap.
| Case | Mode | Tier | N | nSV | Rate% | <30cm |
RMS 2D | 1σ (68%) | 95% | TTFF (s) |
|---|---|---|---|---|---|---|---|---|---|---|
| nagoya_run1 | RTK | FIX | 1 992 | 18.6 | 27.4% | 95.7% | 0.404 m | 0.112 m | 0.169 m | 797 |
| FF | 7 210 | 16.8 | 99.0% | 67.2% | 4.231 m | 0.365 m | 2.457 m | — | ||
| ALL | 7 283 | 16.7 | — | 66.5% | 12.112 m | 0.389 m | 2.470 m | — | ||
| nagoya_run2 | RTK | FIX | 2 643 | 16.7 | 28.3% | 72.9% | 1.014 m | 0.175 m | 0.928 m | 0 |
| FF | 9 288 | 15.3 | 99.4% | 51.9% | 3.538 m | 0.793 m | 12.510 m | — | ||
| ALL | 9 342 | 15.2 | — | 51.6% | 3.534 m | 0.805 m | 12.507 m | — | ||
| nagoya_run3 | RTK | FIX | 520 | 16.5 | 10.1% | 75.6% | 0.716 m | 0.135 m | 1.488 m | 74 |
| FF | 5 095 | 13.2 | 99.1% | 24.9% | 4.174 m | 3.679 m | 8.893 m | — | ||
| ALL | 5 139 | 13.1 | — | 24.7% | 4.187 m | 3.694 m | 8.873 m | — | ||
| tokyo_run1 | RTK | FIX | 342 | 15.6 | 2.9% | 97.4% | 0.555 m | 0.026 m | 0.277 m | 1841 |
| FF | 11 280 | 16.0 | 95.8% | 5.7% | 10.802 m | 7.112 m | 20.569 m | — | ||
| ALL | 11 779 | 15.4 | — | 5.6% | 15.121 m | 7.227 m | 21.025 m | — | ||
| tokyo_run2 | RTK | FIX | 1 835 | 22.5 | 20.4% | 99.4% | 6.271 m | 0.014 m | 0.153 m | 804 |
| FF | 8 481 | 18.5 | 94.3% | 44.5% | 18.985 m | 3.070 m | 50.452 m | — | ||
| ALL | 8 990 | 17.6 | — | 45.0% | 27.204 m | 2.744 m | 50.448 m | — | ||
| tokyo_run3 | RTK | FIX | 4 183 | 25.5 | 27.7% | 99.9% | 0.084 m | 0.013 m | 0.038 m | 658 |
| FF | 14 641 | 21.7 | 97.0% | 54.3% | 7.168 m | 2.619 m | 14.304 m | — | ||
| ALL | 15 097 | 21.1 | — | 53.4% | 8.014 m | 2.776 m | 14.367 m | — |
| Metric | Description |
|---|---|
| N | Number of matched epochs (reference ↔ NMEA within 0.15 s) |
| nSV | Mean number of satellites used in the solution for that tier |
| Fix% | Percentage of epochs with GGA quality = 4 (integer AR fix) |
| RMS_2D (all) | Horizontal RMS error across all matched epochs |
| RMS_3D (all) | 3D RMS error across all matched epochs |
| RMS_2D (fix) | Horizontal RMS for Q=4 epochs only; nan if no fix |
| Conv_s | Seconds from first matched epoch to first run of ≥30 consecutive Q=4 |
ENU errors are computed per-epoch using the corresponding ground-truth coordinate as the reference origin (moving-base projection).
The benchmark uses layered configuration files. Each run is processed with
mrtk post -k <mode>.toml -k <city>.toml, so the city conf overrides only
the keys it specifies.
Mode confs (common settings per algorithm):
conf/benchmark/clas.toml— CLAS PPP-RTK (a-priori SPP seed enhanced by default; see above)conf/benchmark/madoca.toml— MADOCA PPPconf/benchmark/rtk.toml— Baseline RTKconf/benchmark/single.toml— SPP (single-point), with the v0.6.10 accuracy features enabled
City confs (antenna types and reference-station coordinates):
conf/benchmark/nagoya.toml— Nagoya overridesconf/benchmark/tokyo.toml— Tokyo overrides
Key differences from the standard test configurations:
| Parameter | Value | Reason |
|---|---|---|
ant1-anttype (Nagoya) |
TRM105000.10 NONE |
Trimble antenna per equipment manifest |
ant1-anttype (Tokyo) |
* |
rover antenna not yet identified |
ant2-anttype (Nagoya) |
TRM115000.00 NONE |
base antenna per equipment manifest |
ant2-anttype (Tokyo) |
TRM55971.00 NONE |
base antenna (RINEX header has wrong model) |
pos2-isb |
off |
no ISB calibration for Septentrio mosaic-X5 |
pos1-dynamics |
on |
kinematic mode (MADOCA, RTK) |
pos1-frequency (RTK) |
l1+2+3 |
triple-frequency AR |
pos1-ionoopt (RTK) |
off |
raw observations on all 3 freq (DD cancels iono) |
pos1-snrmask_r (RTK) |
on |
SNR mask (≥30 dBHz above 25°) |
out-solformat |
nmea |
GGA parsed by compare_ppc.py |
- Urban multipath: The Nagoya and Tokyo datasets include heavy shadowing and multipath. Fix rates and 3D accuracy will be lower than open-sky tests.
- No antenna calibration: rover RINEX antenna field is "Unknown", so no PCV correction is applied. This may affect Up accuracy by a few centimetres.
- No ISB correction: Septentrio mosaic-X5 is not in the ISB table. QZSS inter-system biases will be slightly mis-corrected.
- MADOCA float only: MADOCA-PPP mode does not produce integer AR fixes
(Q=4) — Fix% and RMS_2D(fix) will be
nan. - IMU not used: Only GNSS-only positioning is evaluated.
The PPC-Dataset was collected for the Precise Positioning Challenge 2024 (高精度測位チャレンジ2024) organised by the Institute of Navigation Japan (測位航法学会), and is kindly made available as open data by:
Taro Suzuki, Chiba Institute of Technology PPC-Dataset — GNSS/IMU driving data for precise positioning research https://github.com/taroz/PPC-Dataset
We gratefully acknowledge the Institute of Navigation Japan for organising PPC2024 and Prof. Suzuki for making the dataset publicly available. Please cite the PPC2024 materials when publishing results derived from this dataset.