Japan static survey: IGS Tsukuba relative static + PPP¶
This route is a reproducible, auditable demonstration for the IGS Tsukuba
stations TSK200JPN (rover) and TSKB00JPN (base), using the 30-second
observation window beginning at 2024-01-01 00:00:00 GPS time. A full day has
2,880 nominal observation epochs; the smoke mode processes the first 20
epochs. The command produces two independent lanes:
- a relative static RTK solution (
gnss solve); and - a final-product static PPP solution (
gnss ppp) using SP3/CLK and the receiver ANTEX model.
The route is currently a demonstration and evidence-collection surface. It is not a control-point certification or a claim of survey accuracy.
One command¶
From the repository root, materialize the pinned inputs and run the 20-epoch smoke test:
python3 apps/gnss.py japan-static-survey \
--output-dir output/use_cases/japan_static_survey/smoke \
--mode smoke
Use --mode full for the one-day, 2,880-epoch lane, or
--materialize-only to fetch/verify/convert inputs without invoking either
solver:
python3 apps/gnss.py japan-static-survey \
--output-dir output/use_cases/japan_static_survey/full \
--mode full
python3 apps/gnss.py japan-static-survey \
--output-dir output/use_cases/japan_static_survey/materialized \
--materialize-only
--offline makes a cache miss or any size/SHA-256 mismatch fail closed. The
default cache is ~/.cache/libgnsspp/japan-static-survey; use --cache-dir
to make it a reviewable project artifact. A failed fetch, conversion, or
child command leaves bundle.log and manifest.json and exits nonzero.
The default --dataset development is the 2024-01-01 fixture described below.
The command also has a separately pinned --dataset holdout for 2024-01-02:
python3 apps/gnss.py japan-static-survey \
--dataset holdout \
--output-dir output/use_cases/japan_static_survey/holdout \
--mode full
Run the holdout once, only after the development-day candidate and thresholds are frozen. Do not tune or rerun against it; its manifest records the sealed holdout role.
Each successful bundle contains:
relative_static.pos relative_static.kml relative_static_trajectory.png
ppp_static.pos ppp_static.kml ppp_static_trajectory.png
relative_summary.json ppp_summary.json bundle.log
manifest.json
The manifest records the exact child argv, source URLs and pinned hashes, materialized hashes, receiver antenna type, truth solution IDs/epochs/frame, height and point-reference contracts, and every step exit status.
Input and provenance contract¶
The default sources are fixed to this R2 fixture:
| Input | Source | Purpose |
|---|---|---|
TSK200JPN...MO.crx.gz, TSKB00JPN...MO.crx.gz |
BKG IGS archive | rover/base observations |
BRDC00IGS...MN.rnx.gz |
BKG IGS archive | broadcast navigation |
IGS0OPSFIN...ORB.SP3.gz, ...CLK.CLK.gz |
BKG IGS final products, GPS week 2295 | PPP precise orbit/clock |
IGS0OPSSNX_2023365...SOL.SNX.gz |
SOPAC/Garner mirror of the IGS weekly combination | independent station truth |
| station logs | files.igs.org/pub/station/log/ |
station/receiver history audit |
IGS20.ssc, igs20.atx |
files.igs.org |
reference-frame and antenna-model provenance |
The command verifies the pinned byte count and SHA-256 before using every
source. Compact RINEX is converted with a system CRX2RNX when available;
on Linux x86-64 it otherwise downloads the official GSI RNXCMP 4.2.0 binary,
verifies its pinned archive hash, safely extracts the CRX2RNX member, and
sets the cached copy executable. Other platforms fail closed unless a system
converter is installed. There is no silent text-file or header fallback.
IGS products are openly distributed best-effort data; the application should acknowledge the International GNSS Service and the BKG product source. The CompactRINEX conversion is the Geospatial Information Authority of Japan (GSI) RNXCMP tool. Product availability, mirror freshness, and license terms remain external operational dependencies and are recorded in the manifest, not inferred as a warranty by this repository.
Independent truth and Japanese coordinate contract¶
Accuracy comparisons must never use APPROX POSITION XYZ from a RINEX
header. The independent truth reader selects exactly one station solution
from SOLUTION/EPOCHS whose validity contains the observation date, then
reads only the matching STAX, STAY, and STAZ rows from
SOLUTION/ESTIMATE. It never reads SOLUTION/APRIORI; missing, ambiguous,
duplicate, or out-of-window records are errors.
The pinned weekly solution contains:
| Station / solution | Validity selected | Estimate epoch | ECEF X (m) | ECEF Y (m) | ECEF Z (m) |
|---|---|---|---|---|---|
TSK2 / soln 11 |
2024-01-01 through 2024-01-07 | 2024-01-03 12:00:00Z | -3,957,184.96826790 | 3,310,231.00877522 | 3,737,703.81925572 |
TSKB / soln 12 |
2024-01-01 through 2024-01-06 23:59:59Z | 2024-01-03 12:00:00Z | -3,957,200.08745802 | 3,310,199.00772871 | 3,737,711.49330339 |
The comparison frame is IGS20/weekly SINEX. ECEF-derived ellipsoidal heights
are approximately 70.0107 m (TSK2) and 67.3134 m (TSKB); these are not
orthometric heights and no geoid transformation is applied. The coordinates
are station solution points, not an unqualified ground-control monument.
The pinned weekly file has XYZ estimates at its mean epoch but no VELX,
VELY, or VELZ rows for these stations. Therefore this implementation
records the estimate epoch explicitly and does not claim a dynamic
position-plus-velocity propagation from 2024-01-03 to 2024-01-01. A
velocity-capable weekly truth product or an independently approved
propagation source is required before freezing a time-propagated accuracy
threshold or using this route as a control-point sign-off. This boundary is
intentional: a static coordinate at the wrong epoch must not be presented as
survey truth.
IGS20.ssc is retained for provenance only. It is not substituted as truth:
the selected station/solution validity and independent weekly estimate are
the authoritative contract for this fixture.
ARP, marker, PCO/PCV, and lane boundaries¶
The materialized rover RINEX identifies TRM159900.00 NONE; the base
identifies AOAD/M_T DOME. The PPP child receives the rover's exact
ANT # / TYPE value together with --antex .../igs20.atx, so receiver PCO/PCV
corrections are selected by the solver's ANTEX lookup. The station coordinate
and the RINEX antenna reference are not silently converted into a monument
coordinate, and the antenna delta is not treated as an orthometric-height
correction.
The relative static lane does not pass ANTEX to gnss solve. It is therefore
useful as a short-baseline demonstration, but it is not a certified
control-point result. Only the PPP lane has the explicit receiver ANTEX
contract, and even that lane remains subject to the truth-epoch limitation
above and local survey authority review.
Output metrics and gates¶
Both summaries include observation count, solution state, satellite count,
ECEF/ENU error against the independent truth, horizontal/vertical/3D error,
and empirical epoch repeatability covariance. The covariance is explicitly
labelled empirical coordinate repeatability, not the solver's posterior
covariance; the .pos format does not serialize the full posterior matrix.
The smoke gate is intentionally a wiring check: relative fixed rate at least 70%, PPP solution rate at least 90%, and the stated minimum satellite counts. The full candidate adds horizontal/vertical limits (relative 0.20/0.40 m, PPP 2.0/4.0 m) and requires all 2,880 nominal epochs. These are provisional review thresholds, not frozen survey limits, because the pinned truth file does not provide velocities for epoch propagation. Any nonzero gate exit, missing artifact, failed converter, or truth metadata error is a failed result rather than an inferred pass.
The frozen executions on 2026-08-24 produced:
| Dataset | Lane | State rate | Horizontal / vertical error | Convergence / initial risk | Decision |
|---|---|---|---|---|---|
| 2024-01-01 development | Relative | FIX 99.861% | 0.0089 / 0.0111 m | max epoch 3D 0.0298 m | demonstration only: RTK ANTEX is not applied |
| 2024-01-01 development | PPP | solution 100% | 1.345 / 0.168 m | converged after 5,940 s; max epoch 3D 44.3 m | candidate after convergence; authority review required |
| 2024-01-02 sealed holdout | Relative | FIX 99.861% | 0.0084 / 0.0106 m | max epoch 3D 0.0250 m | demonstration only: RTK ANTEX is not applied |
| 2024-01-02 sealed holdout | PPP | solution 100% | 1.945 / 0.409 m | converged after 3,780 s; max epoch 3D 625 m | candidate after convergence; authority review required |
The holdout was run once with unchanged gates and was not used for tuning. The large pre-convergence PPP errors prohibit treating the first valid solution as a measured control point. Neither lane is promoted here as a Japanese legal/survey control-point workflow.
For a future release, freeze thresholds only after:
- an independent truth product with a valid velocity/epoch propagation is supplied;
- the full 2,880-epoch output is reviewed in both lanes;
- the receiver antenna PCO/PCV lookup is confirmed in the PPP summary/log;
- Japanese ellipsoidal-versus-orthometric height handling is agreed with the survey authority; and
- one separately authorized time window is held out without tuning against it.