Skip to content

Add blog post: Centimeter-Level Positioning with GTSAM: Double-Difference Factors for RTK GNSS#80

Open
inuex35 wants to merge 12 commits into
borglab:masterfrom
inuex35:claude/gtsam-blog-post-VW8Bh
Open

Add blog post: Centimeter-Level Positioning with GTSAM: Double-Difference Factors for RTK GNSS#80
inuex35 wants to merge 12 commits into
borglab:masterfrom
inuex35:claude/gtsam-blog-post-VW8Bh

Conversation

@inuex35
Copy link
Copy Markdown

@inuex35 inuex35 commented May 27, 2026

This PR adds a blog post introducing the double-difference GNSS factors from borglab/gtsam#2502.
The post covers:
Why double differencing cancels satellite/receiver clock biases and atmospheric terms
The four new factors (DoubleDifferencePseudorangeFactor, DoubleDifferenceCarrierPhaseFactor, and their lever-arm variants)
A factor graph diagram for tightly-coupled GNSS-IMU positioning

Blog post covering the new DD pseudorange and carrier-phase factors
contributed in borglab/gtsam#2502, including tightly-coupled GNSS-IMU
fusion and a factor graph diagram.

https://claude.ai/code/session_01GXrAYZRa5dsPzajT6cMfUW
@inuex35 inuex35 force-pushed the claude/gtsam-blog-post-VW8Bh branch from d4dafc8 to 46bf56a Compare May 29, 2026 01:03
@dellaert
Copy link
Copy Markdown
Member

Nice start! Maybe add one of the challenge images and your result ?

@inuex35 inuex35 force-pushed the claude/gtsam-blog-post-VW8Bh branch from 16e206e to 47ca857 Compare May 29, 2026 23:18
@inuex35
Copy link
Copy Markdown
Author

inuex35 commented May 29, 2026

Thanks! Added a Results on PPC-Dataset section with a Tokyo trajectory figure (truth / float / fix + error-colored view) — let me know what you think.

@dellaert
Copy link
Copy Markdown
Member

Some more comments:

  • i don’t have to be a co-author - you wrote this ;-)
  • Is there is a reason you want to remain anonymous? A real name with affiliation (or, independent researcher) would be preferable
  • Spelling mistake in formula (comma after lambda)
  • If N variables are assumed known, make them square nodes. If not, how do we find them?
  • could you add the formulas for the actual factors (both unary and binary) ?
  • I can’t make heads of tails of the figure caption - does not seem to correspond to figure

inuex35 and others added 7 commits May 31, 2026 10:12
…ormatting

- Replace co-author with single author (Kosuke Inoue, independent researcher)
- Fix carrier-phase formula: replace LaTeX thin space after lambda with \cdot
- Restore bullets for basic/lever-arm factor variants with short labels;
  disable justify on this list to avoid wide gaps around long code tokens
- Add paragraph on LAMBDA fix-and-hold workflow (two enforcement modes,
  held until cycle slip)
- Extend factor-graph caption with the ambiguity-variable workflow
- Correct Tokyo trajectory caption: truth=gray, FLT=red, FIX=green;
  bottom row shows 3D error vs. ground truth via blue-to-red colormap

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Address review request to show the actual factor equations: the unary
pseudorange residual and the binary carrier-phase residual, matching the
GTSAM PR #2502 implementation (model + lambda*(N_ref - N_target) - observed).
Add that the reference satellite is typically chosen with high elevation
and strong signal strength, since it is shared across all double
differences in an epoch and is least affected by multipath/atmosphere.
Double differences are only formed within the same GNSS system (shared
time reference); mixing constellations would leave inter-system biases
uncancelled, so a reference satellite is picked per constellation.
Each DD carrier-phase factor is now drawn connecting the pose to BOTH
ambiguity variables (N_ref and N_target), matching the ternary factor in
the text/residual. The figure shows one unary DD pseudorange factor and
one DD carrier-phase factor per reference/target satellite pair per
epoch, with N_ref/N_target shared across epochs. Caption and intro
paragraph updated accordingly.
It connects the pose plus N_ref and N_target (three variables).
@inuex35
Copy link
Copy Markdown
Author

inuex35 commented Jun 1, 2026

Thanks, Frank! Addressed all points:

  1. Co-authorship — Removed; single-author now.

  2. Byline — Real name: Kosuke Inoue, independent researcher. Personal project.

  3. Formula typo — Fixed; now λ·(N_ref − N_target) (no stray comma).

  4. Square vs. round N nodes — They're unknown, so kept round. Added how we find them: estimated as floats in the graph, fixed by LAMBDA outside it, then held via fix-and-hold (tight prior or constant substitution), reset on cycle slip.

  5. Factor formulas — Added explicit residuals:

    • pseudorange (unary): e_P = Δ∇ρ(x) − Δ∇P̃
    • carrier phase: e_Φ = Δ∇ρ(x) + λ·(N_ref − N_target) − Δ∇Φ̃

    Note it's actually ternary (pose + both ambiguities), matching the code.

  6. Caption vs. figure — Revised the factor-graph figure and its caption so they match (one shared reference + two targets; each carrier-phase factor connects the pose and both ambiguities, each pseudorange factor is unary). Could you clarify which figure you meant, though — the factor graph or the Tokyo results figure? Want to make sure I fixed the right one.

Let me know if you'd like more changes!

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.

3 participants