Open
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
Major features: - C++ QZSS L6 CSSR decoder (ST1-ST9, ST11) in qzss_l6.cpp - Direct L6 binary → PPP pipeline (--ssr file.l6 auto-detected) - L6 → Python CSV expander → CSV loader achieves 0.14m (identical to CSV) - C++ native L6 fallback achieves 1.13m (no Python dependency) L6 decoder improvements: - Flush-on-clock epoch emit matching CSV pipeline timing - Retroactive atmos update for same-subframe ST9 data - ST6 per-network phase bias as separate SSR corrections - Trop sanity check (reject distant-network grid trop) - STEC polynomial overlay from all networks - Dual atmos corrections (preferred network STEC-only + main grid) - Base/network bias separation (ST5 base + ST6 network) - Atmos carry-forward across epochs PPP refactoring: - Extract ppp_wlnl.cpp (WLNL AR, 439 lines from ppp.cpp) - Extract ppp_clas_epoch.cpp (CLAS epoch processing, 279 lines) - Create core/signals.hpp (deduplicate signalFrequencyHz across 4 files) - Create ppp_utils.hpp (shared helpers: findCarrierObservation, ssrRacToEcef) - Extract 30+ magic numbers to PPPConfig parameters - Remove dead ppp_sd_filter code - Add pppDebugEnabled() to ppp_shared.hpp - Unify rtcmSsrSignalId across files Other changes: - Add RTK vs RTKLIB comparison to README - Remove internal planning/experiment docs from public tree - Update RTK regression test thresholds - Add clock-free SD filter infrastructure (experimental, disabled) - Add single-epoch and multi-epoch SD AR (experimental) ppp.cpp: 4185 → 3334 lines (-20%)
Implement Python CSV expander's token merge logic natively in C++: - Post-process all epochs with message-order union merge for atmos (pending_atmos equivalent: flat dict, last writer wins) - Merge ST5 base + ST6 network phase biases across epochs (ST5 resets, ST6 updates carry forward) - Set bias_network_id from last ST6 that updated each satellite - Keep dual atmos correction for preferred network grid selection Results identical to Python CSV pipeline: Last100 = 0.1464m, Min = 0.0346m, 366 epochs under 10cm ENU: E=-0.106 N=-0.075 U=0.067 No Python dependency required for 0.14m L6 PPP accuracy.
- Add site-pages/index.html: hero landing page with feature highlights, benchmark stats, and navigation to docs and demo - Add site-pages/demo/index.html: static interactive demo with 5 tabs (overview, trajectory, visibility, solver comparison, time series) using embedded sample data and Canvas rendering - Update docs.yml workflow to assemble landing + demo + MkDocs into unified GitHub Pages deployment - Update mkdocs.yml site_url to /docs/ subdirectory - Add missing docs/experiments.md and docs/decisions.md for nav - Update .gitignore to allow site-pages HTML files
Replace the marketing-style tab demo with a multi-panel linked-view GNSS solution viewer inspired by RTKLIB's rtkplot: - Ground track with zoom/pan (mouse wheel + drag) - E/N/U position time series (3 stacked subplots) - Solution status bar with epoch-level coloring - Satellite count stacked bar chart (per constellation) - DOP time series (PDOP/HDOP/VDOP) - Polar satellite skyplot - Per-satellite SNR bar chart - Crosshair synchronization across all panels - Toolbar toggles for status types and constellations - Realistic 1800-epoch Odaiba driving data via Catmull-Rom spline with Markov-chain status transitions
Replace synthetic data with 2,329 real epochs downsampled from 11,637-epoch libgnss++ RTK solution (output/rtk_solution.pos). Data: UrbanNav Tokyo Odaiba dataset, 10Hz, ~20min urban driving. Status distribution: FLOAT 90%, FIXED 8%, SPP 2%.
New panels matching RTKLIB AP rtkplot feature set: - Velocity E/N/U time series (computed from position differences) - Baseline length time series (from .pos column 13) - Ambiguity ratio plot with threshold line at 3.0 - Statistics summary: epochs, fix rate, H/V-RMS, P95, distance, average speed, sample rate, satellite/DOP averages Drag & drop .pos file loading: - Drop any .pos file to instantly visualize it - Supports both libgnss++ and RTKLIB formats - Auto-detects format from header, computes ENU, resets view - Downsamples to 3000 epochs for performance
- Time range brush zoom: Shift+drag on time series to zoom, double-click to reset, zoom indicator in toolbar - Animation playback: Play/Pause button with epoch slider, bidirectional sync with hover crosshair - Save PNG export: captures all panels into a single image - Dual solution comparison: drop a second .pos file to overlay, split status bar, side-by-side statistics, blue color scheme for comparison data, Clear Compare button
- RINEX 3.x obs parser in JavaScript (header, SNR extraction, multi-line SYS/OBS TYPES, epoch parsing, auto-downsample) - Per-satellite SNR time series panel (colored by constellation) - Observation summary panel (version, marker, interval, per-system mean SNR and observation type lists) - Drag & drop .obs/.rnx files alongside .pos files - Skyplot SNR update from real obs data when PRNs match - Clear Obs button to remove observation data - Tested with real RINEX 3.02 data (GPS/Galileo/QZSS/SBAS/BeiDou)
… tool (#18) * Add RTK demo5 parity 2026-04-17 investigation notes and analysis script 今日の RTK demo5 parity investigation で以下を確立した結果を notes/ と scripts/ に残す: - Tokyo run1 で libgnss++ satguard12 は精度 4 指標で demo5 を明確に上回り、Fix 数のみ -21 (0.9%) の gap - 4 回の guard 設計試行 (A2 / A3 / P2 threshold sweep) は全て不採用、`satguard12` は local optimum と確定 - 177764.8 の lineage advance は symptom、cause は 177057.4 の preserve seed で lineage drift - 次 iteration は DOP / receiver-motion / inter-system-bias など別 signal へ scripts/analysis/lineage_divergence_diff.py は base/backup CSV 突合で held_pair_keys overlap と lineage ID trajectory を分析する標準ツールとして残す (self-check 付き)。 RTK core file の experimental option (telemetry + guard prototypes) の landing は別 PR で扱う。 * Record RTK experimental notes PR URL
#19) Introduces RTKConfig::ARPolicy {EXTENDED, DEMO5_CONTINUOUS} with four gates in rtk.cpp: relaxed hold ratio, subset/partial AR fallback, hold-fix fallback path, and Q regularization (symmetrize/ridge/eigen-shift). Default EXTENDED is byte-identical to the pre-patch binary (cmp exit code 0 verified). CLI --ar-policy {extended|demo5-continuous} added to gnss_solve.cpp. Three unit tests added to RTKLegacyCompatibilityStandaloneTest.
…ault-off) (#20) - RTKConfig: add max_hold_divergence_m and max_position_jump_m fields (default 0.0) - rtk.cpp: hold fix path rejects if test_pos diverges from float baseline > max_hold_divergence_m - rtk.cpp: validateFixedSolution rejects AR fix if absolute jump > max_position_jump_m - gnss_solve.cpp: --max-hold-div and --max-pos-jump CLI options wired to RTKConfig - test_rtk_legacy.cpp: MaxHoldDivergenceDefaultDisabled + MaxPositionJumpDefaultDisabled unit tests - Both gates default 0.0 (disabled); existing behavior byte-identical with no flags specified
) Add experimental recovery gate that resets ambiguity state (n1/n2 indices state+covariance to 0/900) and position to SPP after N consecutive float epochs, enabling forced AR reconvergence on false-lineage situations. Default threshold=0 disables the gate; existing behavior byte-identical. Introduces consecutive_float_count_ counter alongside existing consecutive_fix_count_; bookkeeping is symmetric across all fix/float and fallback exit paths. DEMO5_CONTINUOUS policy skips the state reset (counter-only reset) to preserve its own state management.
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.
No description provided.