Expose corrected pseudoranges via preprocessEpoch API#3
Open
rsasaki0109 wants to merge 72 commits intomainfrom
Open
Expose corrected pseudoranges via preprocessEpoch API#3rsasaki0109 wants to merge 72 commits intomainfrom
rsasaki0109 wants to merge 72 commits intomainfrom
Conversation
…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
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%
2e10727 to
918e575
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
SPPProcessor::preprocessEpoch()that returns per-epoch corrected measurementsCorrectedMeasurementstruct with satellite ECEF, corrected pseudorange, weight, elevation, system IDpreprocess_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)
PF with gnssplusplus corrected pseudoranges achieves RMS 7.24m (half of RTKLIB) with zero catastrophic failures.