Skip to content

Expose corrected pseudoranges via preprocessEpoch API#3

Open
rsasaki0109 wants to merge 72 commits intomainfrom
feature/expose-corrected-pseudoranges
Open

Expose corrected pseudoranges via preprocessEpoch API#3
rsasaki0109 wants to merge 72 commits intomainfrom
feature/expose-corrected-pseudoranges

Conversation

@rsasaki0109
Copy link
Copy Markdown
Owner

Summary

  • Add SPPProcessor::preprocessEpoch() that returns per-epoch corrected measurements
  • Add CorrectedMeasurement struct with satellite ECEF, corrected pseudorange, weight, elevation, system ID
  • Add Python binding preprocess_spp_file()

Motivation

Enable external solvers (particle filter, FGO) to use gnssplusplus's full correction pipeline as input.

Results (UrbanNav Odaiba, trimble G,E,J)

Method P50 P95 RMS >100m
gnssplusplus SPP 1.66 m 12.96 m 63.25 m 0.082%
PF + gnssplusplus PR 4.48 m 13.57 m 7.24 m 0.000%
RTKLIB demo5 2.67 m 32.41 m 13.08 m

PF with gnssplusplus corrected pseudoranges achieves RMS 7.24m (half of RTKLIB) with zero catastrophic failures.

rsasaki0109 and others added 30 commits September 5, 2025 00:00
…recalculation

Major improvements to RTK positioning implementation:

- Fix filter initialization to use RINEX header position directly
- Implement ECEF to geodetic coordinate conversion (WGS84)
- Recalculate geometric ranges in updateFilter using current filter state
- Fix ambiguity initialization to use current geometric range
- Add outlier rejection for state updates > 10km to prevent divergence
- Add convert_rtklib_to_kml.py utility for visualization

Results:
- 118 stable FLOAT solutions (no divergence)
- 0.3-0.4m horizontal accuracy compared to RTKLIB reference
- Outlier rejection successfully prevents catastrophic divergence

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
…ncy)

Major milestone: libgnss++ is now a fully self-contained modern C++17 GNSS
positioning library with no runtime dependency on RTKLIB.

RTK Performance:
- Kinematic (1.2km): 100% fix rate, 12mm RMS (exceeds RTKLIB 98.3%)
- Short static (36m): 99% fix rate, 90mm RMS
- Long static (3.3km): 52% fix rate with WL-NL AR

New self-contained implementations:
- Eigen-based Kalman filter (algorithms/kalman.hpp)
- LAMBDA integer least-squares (algorithms/lambda.hpp + lambda.cpp)
- Saastamoinen troposphere model (models/troposphere.hpp)
- Klobuchar ionosphere model (models/ionosphere.hpp)
- Coordinate conversions with geodist (core/coordinates.hpp)
- Consolidated constants (core/constants.hpp)
- Solution writer (io/solution_writer.hpp)
- Native SPP with WLS + iono + trop (spp.cpp)

RTK algorithm improvements:
- Separate rover/base satellite positions from respective pseudoranges
- Analytical Sagnac correction in geodist()
- Wide-lane/Narrow-lane AR for long baseline ionosphere mitigation
- Melbourne-Wubbena cross-validation of LAMBDA integers
- Fix-and-hold with direct state constraint (PSD-preserving)
- Position-based hold validation
- High-variance DD pair exclusion (median-relative threshold)

RINEX 3 support:
- Navigation file parsing (G/R/E/C system chars, 4-digit year)
- Observation file parsing (epoch markers, per-satellite lines)
- Broadcast ionosphere parameter extraction (ION ALPHA/BETA, GPSA/GPSB)

Infrastructure:
- Regression test suite (tests/run_regression.sh)
- Analysis tools (tools/rtk_stats.py, plot_rtk.py, compare_rtklib.py)
- CLAUDE.md development guide
- Updated README.md with actual performance data
rsasaki0109 and others added 28 commits March 28, 2026 00:00
Modules added:
- ge-gnss-visibility C++ port (libgnss::visibility): fisheye camera,
  pinhole-to-fisheye conversion, obstacle mask, satellite LOS/NLOS
- ge-drive-visualizer integration (libgnss::kml): KML/KMZ generation
  with elements, animation, camera, tour, writer, 3D models
- UBX parser: NAV-PVT, RXM-RAWX, NAV-SAT, NAV-DOP with Fletcher-16
- SBF parser: PVTGeodetic, PVTCartesian, DOP with CRC-16-CCITT
- Serial port (POSIX termios), protocol auto-detector
- ROS 2 gnss_raw_driver: live driver + bag processor with .pos/.kml output
- gnss_data_generator: PTY-based synthetic UBX/SBF for testing
Add SPPProcessor::preprocessEpoch() that returns per-epoch:
- Sagnac-corrected satellite ECEF positions
- Fully corrected pseudoranges (sat clock + tropo + iono + TGD)
- Elevation-based weights
- System IDs for inter-system bias handling

Add CorrectedMeasurement struct and Python binding preprocess_spp_file().

Enables external solvers (e.g. particle filter) to use gnssplusplus
corrections as input:
  gnssplusplus SPP alone: P50=1.66m, RMS=63.25m
  PF + gnssplusplus PR:   P50=4.48m, RMS=7.24m, >100m=0%
@rsasaki0109 rsasaki0109 force-pushed the feature/expose-corrected-pseudoranges branch from 2e10727 to 918e575 Compare April 16, 2026 12:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant