Smartphone raw GNSS (R5)¶
Status: adapter and native GPS L1 standalone lane implemented. The full development route and untouched holdout run1 both pass the frozen profile. Results from the small public parser fixture remain wiring evidence only, not an accuracy claim.
Application boundary¶
This workflow targets Google Smartphone Decimeter Challenge (GSDC) 2023
device_gnss.csv and ground_truth.csv pairs. It preserves every source
column and value, inventories handset clock discontinuities and signal
availability, exports the device WLS baseline, and scores it against the
independent reference. Phone-grade antenna, clock, duty-cycle, and optional
measurement fields are not treated as equivalent to a survey receiver.
The original GSDC data is subject to the competition terms. A public
preprocessed archive is available from the open-source
taroz/gsdc2023 reproduction project,
but local availability does not grant permission to redistribute the dataset.
Keep downloaded data under ignored data/ or output/ directories and record
the exact source terms in every run.
Adapter smoke¶
The preferred clean-room command verifies the 2.76 GB archive hash, extracts only the frozen inputs, runs the adapter, native solver, sign-off, KML and PNG steps, and hashes the resulting bundle:
python3 apps/gnss.py smartphone-gnss-workflow \
--archive data/gsdc2023/cache/dataset_2023.zip \
--role development \
--output-dir output/smartphone-r5/clean-room-smoke \
--max-epochs 600
For adapter-only diagnosis, run a bounded development slice after materialising one phone directory:
python3 apps/gnss.py smartphone-gnss-adapter \
--device-gnss data/gsdc2023/train/<route>/<phone>/device_gnss.csv \
--ground-truth data/gsdc2023/train/<route>/<phone>/ground_truth.csv \
--output-dir output/smartphone-r5/smoke \
--dataset-id <route>/<phone> \
--device-model <phone> \
--source-url https://www.kaggle.com/competitions/smartphone-decimeter-2023 \
--source-terms "GSDC competition terms; local evaluation only" \
--role development \
--skip-epochs 1 \
--max-epochs 600
The command fails on malformed or backwards timestamps, inconsistent or
backwards hardware-clock discontinuity counts, malformed WLS ECEF positions,
and missing truth. The frozen development route has one receiver epoch before
truth begins, so the command excludes it explicitly with --skip-epochs 1
and records that choice in the summary. Rows without a derived SignalType are preserved in
observations.csv, counted as <unmapped>, and explicitly excluded from any
future solver input instead of being silently assigned a signal code.
Artifacts:
observations.csv: all original fields and selected raw rows;receiver_wls.csv: the handset-provided WLS ECEF result converted to WGS84;reference.csv: timestamp-aligned independent reference positions;summary.json: source hashes, role, device, clock transitions, signal and constellation populations, truth coverage, and baseline error metrics.rover.obs: GPS L1 C/A mapped to RINEX 3.04 using GPST receiver arrival time and the device WLS ECEF position only as the solver initial value.
device_wls_score.accuracy_claim is deliberately baseline-only. Run the
native standalone and frozen sign-off lanes with:
python3 apps/gnss.py spp \
--obs output/smartphone-r5/development-full/rover.obs \
--nav data/gsdc2023/materialized/dataset_2023/train/2023-05-24-20-26-us-ca-sjc-ge2/brdc.nav \
--out output/smartphone-r5/development-full/libgnsspp_spp.pos \
--summary-json output/smartphone-r5/development-full/libgnsspp_spp_summary.json
python3 apps/gnss.py smartphone-gnss-signoff \
--position output/smartphone-r5/development-full/libgnsspp_spp.pos \
--ground-truth data/gsdc2023/materialized/dataset_2023/train/2023-05-24-20-26-us-ca-sjc-ge2/pixel7pro/ground_truth.csv \
--adapter-summary output/smartphone-r5/development-full/summary.json \
--solver-summary output/smartphone-r5/development-full/libgnsspp_spp_summary.json \
--output-dir output/smartphone-r5/development-full \
--profile configs/benchmarks/smartphone_r5_gsdc2023.json
The profile prevents command-line threshold overrides and verifies the adapter dataset role, ID, and source-file hashes before scoring.
Frozen development and holdout contract¶
| Role | Dataset | Device/raw SHA-256 | Truth SHA-256 |
|---|---|---|---|
| Development | 2023-05-24-20-26-us-ca-sjc-ge2/pixel7pro |
c5af6cc3...ff10e42 |
d32d0108...981638a |
| Holdout | 2023-09-06-22-49-us-ca-routebb1/pixel7pro |
f6c05015...aba245b |
abb40762...58879a7 |
The archive SHA-256 is
bda30ab456e6fd6f83550c246e8dbd287306d5385f1f1069c99c16298e647408.
The complete hashes and exact signal/time mapping are versioned in
configs/benchmarks/smartphone_r5_gsdc2023.json.
The 1,383-epoch development run produced 1,376 truth-matched solutions: 99.49% availability, 4.93 m horizontal median, 16.35 m horizontal p95, 28.38 m absolute vertical p95, and an 8 s maximum solution gap. The frozen standalone thresholds are respectively 98%, 7 m, 25 m, 45 m, and 10 s. These are phone-grade standalone bounds, not decimetre or survey claims.
The untouched holdout was opened only after commit 98b15f4 froze the route,
hashes, mapping, invocation, and thresholds. Holdout run1 produced 1,596
truth-matched solutions from 1,601 selected epochs: 99.69% availability,
4.13 m horizontal median, 14.91 m horizontal p95, 29.89 m absolute vertical
p95, and a 4 s maximum gap. All six frozen gates passed. The immutable result
is recorded in docs/use_cases/records/smartphone_r5_holdout_run1.json.
The development-only precise-product variant applied CODE final SP3/CLK to
8,125 measurements, but horizontal median error regressed from 4.93 m to
11.82 m. It is recorded as evaluated-not-promoted in
docs/use_cases/records/smartphone_r5_precise_development.json; no holdout run
was spent on that rejected variant. Standalone GPS L1 remains the promoted R5
lane.
Release sequence¶
- Freeze a development phone/route and an untouched truth-bearing holdout.
- Publish archive and extracted-file hashes plus the clean-room command.
- Run the 600-epoch adapter smoke and inspect excluded signal populations.
- Map only supported signals into the native observation interface. GPS L1 standalone is complete; other signals remain explicitly unsupported.
- Produce and truth-score standalone and precise-product POS outputs. The standalone lane is complete; a precise-product lane remains pending.
- Freeze thresholds and invocation before opening the holdout.
- Run the holdout once and publish Go/No-Go without post-failure tuning.
Reject the workflow when truth is absent, source terms are unknown, clock state cannot be interpreted, supported observations are empty, or the selected route cannot meet its frozen coverage and error gates.