<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://gtsam.org/feed.xml" rel="self" type="application/atom+xml" /><link href="http://gtsam.org/" rel="alternate" type="text/html" /><updated>2026-06-24T09:14:07+00:00</updated><id>http://gtsam.org/feed.xml</id><title type="html">GTSAM</title><subtitle>GTSAM is a BSD-licensed C++ library that implements sensor fusion for robotics and computer vision using factor graphs.</subtitle><entry><title type="html">Bringing Geometric Foundation Models to SLAM: VGGT-SLAM and SL(4) Factor Graph Optimization</title><link href="http://gtsam.org/2026/06/24/vggt-slam.html" rel="alternate" type="text/html" title="Bringing Geometric Foundation Models to SLAM: VGGT-SLAM and SL(4) Factor Graph Optimization" /><published>2026-06-24T00:00:00+00:00</published><updated>2026-06-24T00:00:00+00:00</updated><id>http://gtsam.org/2026/06/24/vggt-slam</id><content type="html" xml:base="http://gtsam.org/2026/06/24/vggt-slam.html"><![CDATA[<p>Author: <a href="https://dominic101.github.io/DominicMaggio/">Dominic Maggio</a></p>

<!-- - TOC -->

<p>In the past couple years, a new type of foundation models called the Geometric Foundation Model (GFM) has been creating a lot of excitement for 3D scene reconstruction starting with initial works <a href="https://arxiv.org/abs/2312.14132">DUSt3R</a> and 
<a href="https://arxiv.org/abs/2406.09756">MASt3R</a>. GFMs take in uncalibrated monocular RGB images and output a dense 3D point cloud and camera poses. One of the most popular models, <a href="https://arxiv.org/abs/2503.11651">VGGT</a>, won best paper at CVPR 2025 and 
follow-up work <a href="https://arxiv.org/abs/2605.15195">VGGT-Omega</a> was a best paper finalist at CVPR 2026. 
Their simplicity and ability to create dense reconstruction without depending on known camera calibration or stereo rigs begs the question of how to best leverage them for a robotic SLAM system. 
In this post, we’ll discuss how <a href="https://arxiv.org/abs/2505.12549">VGGT-SLAM</a> (and its extension 
<a href="https://arxiv.org/abs/2601.19887">VGGT-SLAM 2.0</a>) does just that.</p>

<h2 id="using-vggt-for-a-slam-system">Using VGGT for a SLAM System</h2>

<p>The first challenge in bringing GFMs to SLAM is robots may need to process many thousands of images; however, GPU memory bounds how many frames VGGT can process (around 60 on a 3090 GPU with 24 GB of memory). The second challenge is most practical use cases require incremental mapping as the robot explores a scene – not just one large batch processing of images for the entire scene.</p>

<p>Both challenges can be solved by a simple idea: create smaller submaps with VGGT as the robot explores a scene and chain these submaps together to create a global map. Sounds easy enough; now we just need to pick which transformation to use to align the submaps. Classical SLAM logic tells us $\text{Sim(3)}$ should do it. Each VGGT submap is defined in its own local frame ($\text{SE(3)}$ alignment is needed) and since VGGT doesn’t estimate metric scale we need the extra DoF of $\text{Sim(3)}$ to align the submaps. Unfortunately, this $\text{Sim(3)}$ alignment isn’t always enough. As an example, chaining two submaps together in this apartment scene with a $\text{Sim(3)}$ transformation shows poor alignment.</p>

<figure class="center" style="width: 100%; max-width: 400px; text-align: center;">
  <img src="/assets/images/vggt-slam/vggt-slam-sim3.png" alt="Using a $\text{Sim(3)}$ transformation to align VGGT submaps is not always sufficient. Here, the alignment of two submaps shows 
  substantial discrepancy." style="width: 100%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>Using a $\text{Sim(3)}$ transformation to align VGGT submaps is not always sufficient. Here, the alignment of two submaps shows 
  substantial discrepancy. Figure adapted from the Maggio et al. VGGT-SLAM paper.</figcaption>
</figure>
<p><br /></p>

<h2 id="the-need-for-a-higher-dof-transformation">The need for a higher DoF transformation</h2>

<p>The missing piece is VGGT does not know the camera calibration. While it tries to estimate the calibration, this uncertainty causes the submaps to have a higher DoF ambiguity. To understand what transformation we need for this state-of-the-art foundation model, we find the answer buried deep in what’s considered the bible of classical computer vision – Multiple View Geometry in Computer Vision by Hartley and Zisserman. Which is kind of amusing since during their CVPR talk, the VGGT authors had a slide saying “You don’t have to be Zisserman” to do 3D reconstruction anymore. Anyway, chapter 10 (second edition) mentions “The Projective Reconstruction Theorem” which in summary states that if you have a set of images and solve for a 3D reconstruction given known pixel correspondences, the reconstruction has a 15 DoF projective ambiguity to the true scene. Given extra information such as the vanishing point, this can be reduced to a 12 DoF affine ambiguity.</p>

<p>This 15 DoF transformation is a $4 \times 4$ homography matrix (the lesser known 3D version of the common $3 \times 3$ homography used in 2D vision tasks like image stitching). Now that we know to use a 15 DoF projective transformation, we can solve for the homography between submaps. The homography can be estimated with a 5-point RANSAC solver.</p>

<p>Looking at the apartment example from before, we get a much cleaner submap alignment using the homography matrix.</p>

<figure class="center" style="width: 100%; max-width: 1100px; text-align: center;">
  <img src="/assets/images/vggt-slam/vggt-slam-projective.png" alt="A 15 DoF projective transformation provides correct alignment between VGGT submaps." style="width: 100%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>A 15 DoF projective transformation provides correct alignment between VGGT submaps. Figure adapted from the Maggio et al. VGGT-SLAM paper.</figcaption>
</figure>
<p><br /></p>

<h2 id="integration-with-gtsam">Integration with GTSAM</h2>

<p>Now for the really cool part. We can normalize the $4 \times 4$ homography matrix to have determinant 1 which maps it to a unique matrix on the Special Linear Group, $\text{SL(4)}$, manifold. 
$\text{SL(4)}$ is the group of $4 \times 4$ matrices with determinant 1.
This lets us chain submaps together (along with loop closure constraints) and use GTSAM to 
create a factor graph optimized on the $\text{SL(4)}$ manifold. Support for $\text{SL(4)}$ factors was added to GTSAM in <a href="https://github.com/borglab/gtsam/pull/2207">PR #2207</a> and has a similar interface as $\text{SE(3)}$ factors.</p>

<figure class="center" style="width: 100%; max-width: 1100px; text-align: center;">
  <img src="/assets/images/vggt-slam/vggt-slam-map.png" alt="Left: reconstruction of a loop around an office corridor showing each submap as a unique color. There is a loop closure 
  at the end of the trajectory. Right: reconstruction of a large 4200 sq ft barn." style="width: 100%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>Left: reconstruction of a loop around an office corridor showing each submap as a unique color. There is a loop closure 
  at the end of the trajectory. Right: reconstruction of a large 4200 sq ft barn. 
  Figure adapted from the Maggio and Carlone VGGT-SLAM 2.0 paper.</figcaption>
</figure>
<p><br /></p>

<h2 id="vggt-slam-20">VGGT-SLAM 2.0</h2>

<p>One downside to solving 15 DoF transformations for submap alignment is high-dimensional drift can quickly build up without loop closures. Additionally, a 5-point solver for 
the homography matrix requires the 5 points not all be co-planar - which can cause degeneracy when submaps view flat floors or a single wall. To get around this, VGGT-SLAM 2.0 maintains an $\text{SL(4)}$ factor graph but recognizes the VGGT submap alignment problem 
can be constrained to a subset of variables. For example, consecutive submaps are created so that they share a common keyframe - the first keyframe of submap $n$ is the same keyframe as the last one of submap $n-1$. This means that their respective translation and rotation must be trivially identical in the world frame. Likewise, while the true calibration is unknown, we know that the shared frames must come from a camera with the same calibration, allowing us to further reduce the variables when estimating projective alignments.</p>

<p>Multiple additional improvements, such as more reliable loop closures, are also included in the VGGT-SLAM 2.0 paper and a demonstration that the entire SLAM system can run in real-time onboard a robot with a Jetson Thor.</p>

<h2 id="further-browsing">Further browsing</h2>
<ul>
  <li>Example of using $\text{SL(4)}$ factors are available in a GTSAM example <a href="https://github.com/borglab/gtsam/blob/2b56701e2ab22ba4ad5ff4d8d4d2cdd579798e0c/python/gtsam/examples/SL4SLAMExample.ipynb">notebook</a></li>
  <li><a href="https://arxiv.org/abs/2505.12549">ArXiv: VGGT-SLAM</a></li>
  <li><a href="https://arxiv.org/abs/2601.19887">ArXiv: VGGT-SLAM 2.0</a></li>
  <li><a href="https://arxiv.org/abs/2605.25371">ArXiv: FOUND-IT</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Author: Dominic Maggio]]></summary></entry><entry><title type="html">Toward Centimeter-Level Positioning with GTSAM: Double-Difference Factors for RTK GNSS</title><link href="http://gtsam.org/2026/06/10/rtk-gnss-double-difference.html" rel="alternate" type="text/html" title="Toward Centimeter-Level Positioning with GTSAM: Double-Difference Factors for RTK GNSS" /><published>2026-06-10T00:00:00+00:00</published><updated>2026-06-10T00:00:00+00:00</updated><id>http://gtsam.org/2026/06/10/rtk-gnss-double-difference</id><content type="html" xml:base="http://gtsam.org/2026/06/10/rtk-gnss-double-difference.html"><![CDATA[<p>Author: <a href="https://github.com/inuex35">Kosuke Inoue</a>, independent researcher</p>

<!-- - TOC -->

<p>Global Navigation Satellite System (GNSS) positioning is foundational to autonomous driving, surveying, and precision agriculture. Standard single-point positioning achieves meter-level accuracy, but many applications need tighter estimates. Real-Time Kinematic (RTK) GNSS moves toward centimeter-level positioning by exploiting <strong>double-difference</strong> observations that cancel or reduce common-mode errors such as satellite clock biases and atmospheric delays.</p>

<p>GTSAM now includes built-in double-difference factors for both pseudorange and carrier-phase observations, contributed in <a href="https://github.com/borglab/gtsam/pull/2502">PR #2502</a>. This post explains the technique, walks through the new factors, and shows how they enable tightly-coupled GNSS-IMU fusion via factor graphs.</p>

<h2 id="why-double-differencing">Why Double Differencing?</h2>

<p>A raw GNSS pseudorange measurement from a receiver $r$ to a satellite $s$ can be written as:</p>

\[P_r^s = \rho_r^s + c\,(\delta t_r - \delta t^s) + I_r^s + T_r^s + \epsilon_P\]

<p>where $\rho_r^s$ is the geometric range, $c$ is the speed of light, $\delta t_r$ and $\delta t^s$ are the receiver and satellite clock biases, $I$ and $T$ represent ionospheric and tropospheric delays, and $\epsilon_P$ is the measurement noise.</p>

<p><strong>Single differencing</strong> between a rover receiver and a nearby base station eliminates the satellite clock bias $\delta t^s$ and greatly reduces atmospheric terms that are spatially correlated. <strong>Double differencing</strong> then takes the difference between two satellites (a reference satellite and a target satellite), which additionally eliminates the receiver clock bias $\delta t_r$. Using the operator $\Delta\nabla$ to denote the double difference:</p>

\[\Delta\nabla P = (\rho_r^i - \rho_b^i) - (\rho_r^j - \rho_b^j) + \epsilon_{\Delta\nabla P}\]

<p>where $i$ is the reference satellite, $j$ is the target satellite, $r$ is the rover, $b$ is the base station, and $\epsilon_{\Delta\nabla P}$ is the double-differenced noise. The result is a measurement that depends almost entirely on the rover position and geometry. A reference satellite is chosen <em>per constellation</em> (GPS, Galileo, BeiDou, QZSS, …), typically the one with a high elevation angle and strong signal strength.</p>

<p>For carrier-phase observations, the double-difference of the phase measurement $\Phi$ is:</p>

\[\Delta\nabla \Phi = \Delta\nabla \rho + \lambda \cdot (N_{\text{ref}} - N_{\text{target}}) + \epsilon_{\Delta\nabla \Phi}\]

<p>where $\Phi$ is the carrier-phase observable in meters, $\lambda$ is the carrier wavelength, $N$ is the integer ambiguity, and $\epsilon_{\Delta\nabla \Phi}$ is the noise. Carrier-phase measurements are far more precise than pseudorange (millimeter-level noise vs. meter-level), so resolving these integer ambiguities is the key to centimeter-level positioning.</p>

<h2 id="what-gtsam-now-provides">What GTSAM Now Provides</h2>

<p>GTSAM’s <code class="language-plaintext highlighter-rouge">navigation</code> module now includes four double-difference factors along with shared helpers, all contributed in <a href="https://github.com/borglab/gtsam/pull/2502">PR #2502</a>.</p>

<p>For each satellite pair, the user adds a <strong>pseudorange factor</strong> and a <strong>carrier-phase factor</strong> to the graph. The pseudorange factor is a unary factor on the rover position, while the carrier-phase factor additionally connects to ambiguity variables $N$ that persist across epochs (as long as no cycle slip occurs).</p>

<p>The basic factors, <code class="language-plaintext highlighter-rouge">DoubleDifferencePseudorangeFactor</code> and <code class="language-plaintext highlighter-rouge">DoubleDifferenceCarrierPhaseFactor</code>, take a <code class="language-plaintext highlighter-rouge">Point3</code> antenna position in ECEF directly. The lever-arm variants, <code class="language-plaintext highlighter-rouge">DoubleDifferencePseudorangeFactorArm</code> and <code class="language-plaintext highlighter-rouge">DoubleDifferenceCarrierPhaseFactorArm</code>, take a <code class="language-plaintext highlighter-rouge">Pose3</code> in the navigation frame plus a body-frame lever arm, computing the antenna position internally. These are essential for tightly-coupled IMU fusion, where the optimized state is the vehicle pose.</p>

<p>A shared helper, <code class="language-plaintext highlighter-rouge">gnss::DoubleDifferenceData</code>, bundles the rover/base observations and satellite positions for a given satellite pair and provides the Sagnac-corrected geometric range model $\Delta\nabla\rho(\cdot)$ with Jacobians. This keeps the individual factors thin. The <strong>pseudorange factor</strong> is <em>unary</em> in the rover antenna position $\mathbf{x}$ and simply evaluates the model-minus-observation residual:</p>

\[e_P(\mathbf{x}) = \Delta\nabla\rho(\mathbf{x}) - \Delta\nabla\tilde{P}\]

<p>The <strong>carrier-phase factor</strong> is <em>ternary</em>, connecting the rover position $\mathbf{x}$ to the two satellite ambiguities $N_\text{ref}$ and $N_\text{target}$, and adds the $\lambda \cdot (N_\text{ref} - N_\text{target})$ term on top:</p>

\[\begin{aligned}
e_\Phi(\mathbf{x}, N_\text{ref}, N_\text{target})
&amp;= \Delta\nabla\rho(\mathbf{x})
 + \lambda (N_\text{ref} - N_\text{target}) \\
&amp;\quad - \Delta\nabla\tilde{\Phi}
\end{aligned}\]

<p>where $\Delta\nabla\tilde{P}$ and $\Delta\nabla\tilde{\Phi}$ are the double-differenced pseudorange and carrier-phase observations. For the lever-arm variants the state $\mathbf{x}$ is a <code class="language-plaintext highlighter-rouge">Pose3</code> and the antenna position is obtained from the pose and body-frame lever arm before the same residual is evaluated.</p>

<p>GTSAM treats each $N$ as a continuous variable during optimization (the “float” solution). Integer fixing is done outside the graph: at each epoch the float estimates and covariance are handed to the LAMBDA algorithm, which searches for the most likely integer vector. Validated fixes are then enforced in one of two ways (fix-and-hold): either a tight prior factor is added on the corresponding $N$ variables, or the integer values are substituted as constants inside the carrier-phase factors so that $N$ no longer appears as a variable at all. A fixed ambiguity is held until a cycle slip on that satellite invalidates it, at which point the corresponding $N$ is reset and re-estimated as a float.</p>

<h2 id="tightly-coupled-gnss-imu-factor-graph">Tightly-Coupled GNSS-IMU Factor Graph</h2>

<p>The diagram below illustrates how these factors fit into a factor graph for tightly-coupled GNSS-IMU positioning. At each epoch, the rover pose is connected to a pair of double-difference factors per reference/target satellite pair: a pseudorange factor (red), which is unary on the pose, and a carrier-phase factor (blue), which additionally connects to <em>both</em> ambiguity variables of the pair — the reference-satellite ambiguity $N_\text{ref}$ and the target-satellite ambiguity $N_\text{target}$ — which persist across epochs. IMU pre-integration factors connect consecutive poses, bridging the gap when satellite signals are blocked.</p>

<figure class="center" style="width: 100%; max-width: 820px;">
  <img src="/assets/images/rtk-gnss/rtk-factor-graph.svg" alt="Factor graph for tightly-coupled GNSS-IMU positioning showing double-difference factors, ambiguity variables, and IMU factors." style="width: 100%;" />
  <figcaption>Factor graph for tightly-coupled GNSS-IMU RTK positioning. For each reference/target satellite pair, the double-difference pseudorange factor (red, unary on the pose) and carrier-phase factor (blue) form a pair. Each carrier-phase factor connects to the pose <em>and</em> both ambiguity variables of the pair, <em>N</em><sub>ref</sub> and <em>N</em><sub>tgt</sub>, which persist across epochs. IMU pre-integration factors (black) connect consecutive poses. The ambiguity variables are estimated as floats inside the graph and snapped to integers by LAMBDA outside the graph; once fixed they are either constrained with a tight prior or substituted as constants in the carrier-phase factors.</figcaption>
</figure>
<p><br /></p>

<p>By using the lever-arm factor variants, the rover state becomes a <code class="language-plaintext highlighter-rouge">Pose3</code> in the navigation frame, which can be directly connected to GTSAM’s IMU pre-integration factors. This tightly-coupled approach uses raw satellite measurements directly. The full covariance structure between position, velocity, and biases is maintained throughout the graph, and when buildings block satellite signals in urban canyons, the IMU bridges the gap while GNSS constrains long-term drift.</p>

<p>In practice, achieving centimeter-level accuracy requires additional infrastructure beyond the GTSAM factors themselves: satellite selection, cycle-slip detection, multipath mitigation, and integer ambiguity resolution (typically via the LAMBDA algorithm). Our implementation uses <a href="https://github.com/inuex35/cssrlib-numba">cssrlib-numba</a> for these observation-modeling tasks.</p>

<h2 id="results-on-ppc-dataset">Results on PPC-Dataset</h2>

<p>We evaluated the tightly-coupled system on the Tokyo sequences of the <a href="https://github.com/taroz/PPC-Dataset">PPC-Dataset</a>, an open dataset of urban driving in Japan. Tokyo’s dense urban canyons present a particularly challenging environment for GNSS positioning: tall buildings block direct line-of-sight to many satellites, and reflections produce multipath that corrupts both pseudorange and carrier-phase observations.</p>

<p>The evaluation uses the lever-arm DD factors together with <code class="language-plaintext highlighter-rouge">CombinedImuFactor</code>, non-holonomic constraint factors, and integer ambiguity variables resolved via LAMBDA with fix-and-hold. The graph is solved incrementally with <code class="language-plaintext highlighter-rouge">IncrementalFixedLagSmoother</code>.</p>

<figure class="center" style="width: 100%; max-width: 820px;">
  <img src="/assets/images/rtk-gnss/tokyo-result.png" alt="Trajectory results on three Tokyo urban driving sequences from the PPC-Dataset." style="width: 100%;" />
  <figcaption>Trajectory estimation results on three Tokyo urban driving sequences from the PPC-Dataset. Top row: estimated trajectories with ground truth (gray), float solutions (red), and ambiguity-fixed solutions (green). Bottom row: trajectories colored by 3D position error relative to the ground truth, using a blue-to-red colormap (clipped at 0.5 m; see colorbar).</figcaption>
</figure>
<p><br /></p>

<p>The three runs achieve <strong>49.5–60.8% fix rates</strong> and <strong>56.7–69.9% of epochs within 50 cm</strong> error. Fixed epochs are mostly accurate to a few centimeters, but occasional incorrect fixes inflate the RMS to 0.21–0.81 m.</p>

<p>With GNSS and IMU alone, the estimate drifts during long GNSS outages (under overpasses or in tunnels). Adding LiDAR or wheel odometry factors on the same poses keeps the estimate stable through these gaps.</p>

<h2 id="takeaway">Takeaway</h2>

<p>GTSAM now provides native support for RTK GNSS double-difference pseudorange and carrier-phase factors, an important step toward centimeter-level positioning in full GNSS pipelines. These factors integrate naturally with the existing factor graph framework, enabling tightly-coupled multi-sensor fusion with IMU, wheel odometry, or any other GTSAM factor. The lever-arm variants make it straightforward to model the physical offset between the navigation state and the antenna position.</p>

<h2 id="additional-reading">Additional Reading</h2>

<ul>
  <li>The DD factors are available in GTSAM’s <code class="language-plaintext highlighter-rouge">navigation</code> module (<a href="https://github.com/borglab/gtsam/pull/2502">PR #2502</a>)</li>
  <li><strong><a href="https://github.com/inuex35/gnss-gtsam-rtk">gnss-gtsam-rtk</a></strong>: A standalone RTK example using GTSAM’s DD factors with ISAM2</li>
  <li><strong><a href="https://github.com/inuex35/tightly-coupled-gnss-imu-fgo">tightly-coupled-gnss-imu-fgo</a></strong>: Tightly-coupled GNSS-IMU factor graph optimization for urban driving</li>
  <li><strong><a href="https://github.com/taroz/PPC-Dataset">PPC-Dataset</a></strong>: Open dataset with multi-frequency GNSS and 100 Hz IMU data from urban environments in Japan</li>
</ul>

<p><em>Disclosure: AI was used to help draft this post.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Author: Kosuke Inoue, independent researcher]]></summary></entry><entry><title type="html">Certifiable Optimization, Part 3: Global Solvers for 3D Vision</title><link href="http://gtsam.org/2026/06/05/luca-heng-global-solvers.html" rel="alternate" type="text/html" title="Certifiable Optimization, Part 3: Global Solvers for 3D Vision" /><published>2026-06-05T00:00:00+00:00</published><updated>2026-06-05T00:00:00+00:00</updated><id>http://gtsam.org/2026/06/05/luca-heng-global-solvers</id><content type="html" xml:base="http://gtsam.org/2026/06/05/luca-heng-global-solvers.html"><![CDATA[<p>Author: <a href="https://dellaert.github.io/">Frank Dellaert</a></p>

<!-- - TOC -->

<p>This third and final ICRA-week post zooms out to the broader global-solvers ecosystem.
<a href="/2026/06/01/icra-for-workshop.html">Part 1</a> focused on our chordal-sparsity work, which uses Bayes-tree structure to make SDP relaxations more scalable.
<a href="/2026/06/03/certifiable-factor-graphs.html">Part 2</a> focused on David Rosen’s group’s <a href="https://openreview.net/forum?id=hAtI0KkdAg">Certifiable Factor Graph Optimization</a>, which approaches related factor-graph problems through Burer-Monteiro-style low-rank optimization.
But these are only two efforts in a broader push toward global solvers for 3D vision and robot perception, a lot of it started by Luca Carlone &amp; collaborators over the last 10 years. At ICRA this year we were very fortunate to have a workshop keynote by Heng Yang, his former Ph.D. student and now a professor at Harvard:</p>

<ul>
  <li><a href="https://sites.google.com/robotics.utias.utoronto.ca/icra26-frontiers-optimization/schedule">Scaling Semidefinite Relaxations for Robot Perception and Control</a> at the <a href="https://sites.google.com/robotics.utias.utoronto.ca/icra26-frontiers-optimization/">Frontiers of Optimization for Robotics workshop</a>.</li>
</ul>

<p>So, in this Part 3, I want to draw some attention to Luca and Heng’s seminal work in this area</p>

<h2 id="a-short-lineage">A short lineage</h2>

<p>One way to see the field’s trajectory is through rotation estimation, pose-graph optimization, and registration. Our 2015 ICRA paper, <a href="https://repository.gatech.edu/entities/publication/ae22ec18-65d1-4075-8c0b-55c694ac5467">Initialization Techniques for 3D SLAM</a>, was about making hard nonconvex SLAM problems behave better by separating out the rotation-estimation structure before running local pose-graph optimization. At MIT, David Rosen pioneered <a href="https://arxiv.org/abs/1612.07386">SE-Sync</a>, which showed how pose synchronization over <code class="language-plaintext highlighter-rouge">SE(d)</code> could be solved efficiently while certifying global optimality in the relevant noise regime. I also worked with David and Luca and others on <a href="https://arxiv.org/abs/2008.02737">Shonan Rotation Averaging</a>, that connected SDP relaxation and manifold optimization to large-scale rotation averaging.</p>

<p>Heng and Luca then pushed certifiable registration toward extreme outlier robustness in the context of point cloud registration, with <a href="https://arxiv.org/abs/2001.07715">TEASER, by Heng Yang, Jingnan Shi, and Luca Carlone</a>. This paper already has &gt; 1100 citations, and Heng has been on a convex relaxation binge since then!</p>

<h2 id="global-solvers-for-3d-vision">Global solvers for 3D vision</h2>

<p>A lot of the recent developments in this area, by Heng and others, were collected in the workshop paper <a href="https://openreview.net/forum?id=D1bVYYUh8m">Global Solvers for 3D Vision: Foundations, Frontiers, and a Call to the Robotics Community</a>. A longer-form version with Heng as a co-author is available on Arxiv here: <a href="https://arxiv.org/abs/2602.14662">Advances in Global Solvers for 3D Vision</a>.</p>

<figure class="center" style="width: 100%; max-width: 1100px; text-align: center;">
  <img src="/assets/images/global-solvers-2026/global-solvers-taxonomy.png" alt="Taxonomy of global solvers for 3D vision, including branch-and-bound, convex relaxation, graduated non-convexity, comparative analysis, and applications." style="width: 100%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>Global solvers for 3D vision span branch-and-bound, convex relaxation, and graduated non-convexity, with applications from Wahba's problem to bundle adjustment. Figure adapted from the Zhao et al. survey.</figcaption>
</figure>
<p><br /></p>

<p>If you’re interested in knowing more, that survey is a very useful entry point. The authors introduce branch-and-bound (B&amp;B), convex relaxation (CR), and graduated non-convexity (GNC) in the context of geometric estimation problems that show up constantly in robot perception, for example absolute and relative pose estimation, 3D registration, rotation and translation averaging, and even full bundle adjustment.</p>

<h2 id="back-to-gtsam">Back to GTSAM</h2>

<p>The recent <a href="/2026/05/13/qp-qcqp-in-gtsam.html">QP and QCQP support in GTSAM</a> is a preview of the modeling layer needed to lift, relax, decompose, and eventually certify factor-graph problems. We hope to bring certifiable optimization to GTSAM soon, and I hope this will allow more robotics people to join in the fun!</p>

<h2 id="further-browsing">Further browsing</h2>

<ul>
  <li><a href="https://openreview.net/forum?id=D1bVYYUh8m">Workshop paper: Global Solvers for 3D Vision</a></li>
  <li><a href="https://arxiv.org/abs/2602.14662">ArXiv: Advances in Global Solvers for 3D Vision</a></li>
  <li><a href="https://openreview.net/forum?id=hAtI0KkdAg">OpenReview: Certifiable Factor Graph Optimization</a></li>
  <li><a href="https://arxiv.org/abs/1612.07386">ArXiv: SE-Sync</a></li>
  <li><a href="https://arxiv.org/abs/2001.07715">ArXiv: TEASER</a></li>
  <li><a href="https://arxiv.org/abs/2008.02737">ArXiv: Shonan Rotation Averaging</a></li>
  <li><a href="/2026/06/01/icra-for-workshop.html">Post: Certifiable Optimization at the ICRA Workshop</a></li>
  <li><a href="/2026/05/13/qp-qcqp-in-gtsam.html">Post: Quadratic Programs and QCQPs in GTSAM</a></li>
</ul>

<p><em>Disclosure: AI was used to help draft this post and prepare the figure.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Author: Frank Dellaert]]></summary></entry><entry><title type="html">Certifiable Optimization, Part 2: Certifiable Factor Graph Optimization</title><link href="http://gtsam.org/2026/06/03/certifiable-factor-graphs.html" rel="alternate" type="text/html" title="Certifiable Optimization, Part 2: Certifiable Factor Graph Optimization" /><published>2026-06-03T00:00:00+00:00</published><updated>2026-06-03T00:00:00+00:00</updated><id>http://gtsam.org/2026/06/03/certifiable-factor-graphs</id><content type="html" xml:base="http://gtsam.org/2026/06/03/certifiable-factor-graphs.html"><![CDATA[<p>Author: <a href="https://david-m-rosen.github.io/">David M. Rosen</a></p>

<!-- - TOC -->

<p>Certifiable estimation is rapidly maturing as a practical tool for robust robotic perception and state estimation, enabling both <em>fast</em> and <em>certifiably correct</em> (i.e. <em>verifiably globally optimal</em>) inference.  Frank’s <a href="/2026/06/01/icra-for-workshop.html">companion post</a> highlights one way to implement certifiable estimators in GTSAM by exploiting the Bayes Tree  to perform chordal decomposition; here we describe complementary work from <a href="https://neural.lab.northeastern.edu/">Northeastern</a> that exploits <a href="https://arxiv.org/abs/2410.00117">Burer-Monteiro factorization</a> to implement certifiable estimation using the factor graph modeling and <em>local</em> optimization paradigm already familiar to users of GTSAM.</p>

<p>Our workshop paper is:</p>

<blockquote>
  <p><a href="https://arxiv.org/abs/2603.01267">Certifiable Factor Graph Optimization</a>, by <a href="https://zhexin1904.github.io/">Zhexin (Jason) Xu</a>, <a href="https://www.linkedin.com/in/niksand">Nikolas R. Sanderson</a>, <a href="https://www.linkedin.com/in/hannajiameizhang/">Hanna Jiamei Zhang</a>, and <a href="https://david-m-rosen.github.io/">David M. Rosen</a>. Workshop page: <a href="https://openreview.net/forum?id=hAtI0KkdAg">OpenReview</a>.</p>
</blockquote>

<h2 id="two-paradigms-for-robotic-state-estimation">Two paradigms for robotic state estimation</h2>

<p>Factor graphs are well-established as the dominant paradigm for modeling and solving robotic state estimation tasks, primarily because they are so wonderfully easy to use. The factor graph abstraction that GTSAM is built on lets you easily model a wide range of estimation problems by composing a handful of standard variable and factor types; moreover, GTSAM can <em>automatically</em> synthesize and run fast local optimizers to perform inference directly from a factor graph model. The catch is <em>reliability</em>: because factor graph inference is typically performed using <em>local</em> optimization, it can sometimes silently converge to a badly wrong estimate, even on a well-posed problem.</p>

<p>More recently, <em>certifiable estimation</em> has emerged as a powerful new approach for implementing trustworthy robotic perception and state estimation systems.  The main idea behind certifiable estimators is to construct a <em>convex</em> (typically <em>semidefinite</em>) <em>approximation</em> of the target maximum likelihood estimation problem, and then solve this convex surrogate to recover a high-quality solution to the original estimation task.  This approach has three major advantages. First, because the surrogate is convex, it <em>can</em> be solved globally. Second, its minimizer often turns out to be an <em>exact, globally optimal solution</em> of the original problem. Third, these methods yield an <em>a posteriori certificate of optimality</em> whenever they succeed — that is, they can tell you whether they actually found the right answer.</p>

<p>However, the catch to using certifiable estimation methods is <em>effort</em>: the SDP relaxations underpinning these methods are typically very high-dimensional, and therefore require specialized, structure-exploiting optimization techniques in order to solve them efficiently.   The standard pipeline for deploying a high-dimensional certifiable estimator thus involves developing a problem-specific SDP relaxation, designing a custom-built <em>local</em> optimizer for its (low-dimensional) Burer-Monteiro factorization, and then wrapping that optimizer in the Riemannian Staircase to ensure global optimality.  Executing this process can require <em>weeks to months</em> of specialized effort, which must be repeated from scratch for every new problem.</p>

<h2 id="the-key-insight-certifiable-estimation-inherits-factor-graph-structure">The key insight: Certifiable estimation inherits factor graph structure</h2>

<p>The standard pipeline treats the SDP machinery and the factor graph model as separate worlds. Our central observation is that they aren’t: the two transformations at the heart of certifiable estimation — Shor’s relaxation and Burer-Monteiro factorization — <em>preserve the factor graph structure</em> of the problem that they start from.</p>

<p>The reason is almost embarrassingly simple. The maximum likelihood problems we care about can be written as <em>quadratically-constrained quadratic programs</em> (QCQPs), and the factor graph structure of such a QCQP is encoded directly in the data matrices that define it: factor connectivity shows up as <em>block sparsity</em> in the objective matrices, and the product structure of the feasible set shows up as <em>block-diagonal</em> constraint matrices. The key point is that the <em>same data matrices</em> that define the original QCQP <em>also</em> define its Shor relaxation, as well as <em>every Burer-Monteiro factorization</em> of that relaxation. None of this structure is lost along the way!</p>

<p>The consequence is that the Burer-Monteiro-factored Shor relaxation <em>automatically inherits</em> a factor graph structure from the original estimation problem. This induced factor graph has <em>identical connectivity</em> to the original; only the variables and factors themselves change. And these change in the simplest possible way: each is a (slightly) higher-dimensional, one-to-one algebraic transformation — a <em>lift</em> — of its counterpart in the original factor graph. For example, a rotation variable lifts to a Stiefel-manifold variable, a unit vector lifts to a higher-dimensional unit vector, a translation lifts to a (higher-dimensional) translation, and the factors lift accordingly. We call the resulting factor graph a <em>lifted</em> (or <em>certifiable</em>) factor graph.</p>

<figure class="center" style="width: 100%;  text-align: left;">
  <img src="/assets/images/certifiable-factor-graphs/framework.png" alt="Framework diagram showing an input factor graph and QCQP lifted into a Burer-Monteiro factor graph inside a Riemannian Staircase." style="width: 100%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>The factor graph for the Burer-Monteiro-factored Shor relaxation has the same connectivity as the original QCQP's factor graph; only the variable and factor types change, and these do so according to simple one-to-one algebraic transformations.</figcaption>
</figure>
<p><br /></p>

<h2 id="certifiable-estimation-is-factor-graph-optimization">Certifiable estimation <em>is</em> factor graph optimization</h2>

<p>Because the Burer-Monteiro-factored Shor relaxation <em>is itself</em> a factor graph, the local optimizations appearing inside the Riemannian Staircase can be carried out by an ordinary factor graph optimizer — exactly what GTSAM is built to do. Consequently, the Riemannian Staircase meta-algorithm for certifiable estimation collapses to a thin wrapper around standard local factor graph optimization:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Input: factor graph G for a QCQP-representable MLE problem
for p = d, d+1, ... do
    build lifted factor graph G_p for the rank-p BM factorization of G
    Y* &lt;- LocalOptimization(G_p)        # ordinary factor graph optimization
    if Z = Y*(Y*)^T certifiably solves Shor's relaxation:
        return Y*                       # globally optimal!
end
</code></pre></div></div>

<p>For anyone already comfortable with factor graphs, this turns certifiable estimation from a research project into a modeling exercise. You take a factor graph model of your problem, replace each variable and factor with its lifted counterpart, and hand the result to the optimizer you already use. No problem-specific SDP derivation, no custom Riemannian solver, no hand-analysis of manifold geometry — and yet the Staircase still guarantees recovery of a globally optimal solution, with a certificate.</p>

<figure class="center" style="width: 100%; max-width: 980px; text-align: center;">
  <img src="/assets/images/certifiable-factor-graphs/CertiFGO.png" alt="Astronaut meme: 'Certifiable estimation is just factor graph optimization?' / 'Always has been.'" style="width: 100%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>It's factor graphs all the way down!</figcaption>
</figure>
<p><br /></p>

<h2 id="experiments">Experiments</h2>

<p>We implemented our certifiable factor graph optimization framework in GTSAM and evaluated it on three problem classes — pose-graph optimization, landmark SLAM, and range-aided SLAM — across a broad set of standard benchmarks. Two findings stand out:</p>

<ul>
  <li>
    <p>It <strong>matches purpose-built certifiable estimators.</strong> Our general-purpose factor graph-based  estimator recovers the same objective values and the same certified suboptimality bounds as the specialized, hand-engineered solvers <a href="https://journals.sagepub.com/doi/10.1177/0278364918784361">SE-Sync</a>, <a href="https://ieeexplore.ieee.org/document/9143200">Landmark SE-Sync</a>, and <a href="https://ieeexplore.ieee.org/document/10665918">CORA</a> — all because it is solving the very same underlying relaxations.</p>
  </li>
  <li>
    <p>It <strong>preserves the speed of local factor graph optimization.</strong> When the initialization is already good, the method terminates at the first level of the Staircase after a single local solve (plus a <a href="https://ieeexplore.ieee.org/document/9940527">cheap verification step</a>), behaving just like ordinary factor graph optimization. It only invokes the full Staircase machinery when global optimality cannot be certified, and even then the cost scales roughly linearly in the number of levels.</p>
  </li>
</ul>

<figure class="center" style="width: 100%; max-width: 980px; text-align: left;">
  <img src="/assets/images/certifiable-factor-graphs/benchmarks.png" alt="Globally optimal solutions for pose graph optimization, landmark SLAM, and range-aided SLAM benchmarks." style="width: 100%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>Globally optimal or certifiably near-optimal solutions recovered on pose graph optimization, landmark SLAM, and range-aided SLAM benchmarks.</figcaption>
</figure>
<p><br /></p>

<p>In short, you get the global-optimality guarantees of a specialized certifiable estimator at essentially the cost of a standard local solve — and the development effort drops from the <em>weeks-to-months</em> of the bespoke pipeline to a <em>few hours</em> of modeling with standard GTSAM factor graphs.</p>

<h2 id="why-this-matters-for-gtsam">Why this matters for GTSAM</h2>

<p>Certifiable factor graph optimization provides a path for bringing certifiable estimation into the software stack roboticists already use. Instead of choosing between a convenient local factor graph model and a separate bespoke certifiable solver, the same model can now support <em>both</em> fast local optimization <em>and</em> global optimality guarantees.</p>

<p>This fits naturally with GTSAM’s recent <a href="/2026/05/13/qp-qcqp-in-gtsam.html">QP and QCQP support</a>. QCQPs provide the algebraic bridge from factor graph estimation problems to semidefinite relaxations, while GTSAM already provides the factor graph abstraction, sparse optimization machinery, and many of the variable and factor types used in robotics. Our implementation in the paper is built in C++ using GTSAM, and the broader goal is to make certifiable estimation a reusable part of the factor graph workflow rather than a separate custom project for each new problem.</p>

<h2 id="further-browsing">Further browsing</h2>

<ul>
  <li><a href="https://sites.google.com/robotics.utias.utoronto.ca/icra26-frontiers-optimization/">Frontiers of Optimization for Robotics workshop</a></li>
  <li><a href="https://arxiv.org/abs/2603.01267">Arxiv: Certifiable Factor Graph Optimization</a></li>
  <li><a href="https://openreview.net/forum?id=hAtI0KkdAg">OpenReview: Certifiable Factor Graph Optimization</a></li>
  <li><a href="https://github.com/SLAM-Handbook-contributors/slam-handbook-public-release/blob/main/main.pdf">The SLAM Handbook (Chapter 6)</a></li>
  <li><a href="/2026/06/01/icra-for-workshop.html">Post: Certifiable Optimization at the ICRA Workshop</a></li>
  <li><a href="/2026/05/13/qp-qcqp-in-gtsam.html">Post: Quadratic Programs and QCQPs in GTSAM</a></li>
</ul>

<p><em>Disclosure: AI was used to help draft this post and prepare the figures.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Author: David M. Rosen]]></summary></entry><entry><title type="html">Certifiable Optimization, Part 1: Exploiting Chordal Sparsity with Bayes Trees</title><link href="http://gtsam.org/2026/06/01/icra-for-workshop.html" rel="alternate" type="text/html" title="Certifiable Optimization, Part 1: Exploiting Chordal Sparsity with Bayes Trees" /><published>2026-06-01T00:00:00+00:00</published><updated>2026-06-01T00:00:00+00:00</updated><id>http://gtsam.org/2026/06/01/icra-for-workshop</id><content type="html" xml:base="http://gtsam.org/2026/06/01/icra-for-workshop.html"><![CDATA[<p>Author: <a href="https://dellaert.github.io/">Frank Dellaert</a></p>

<!-- - TOC -->

<p>This post focuses on our chordal-sparsity paper, while last week’s post already covered <a href="/2026/05/26/two-new-arxiv-papers.html">CMC-Opt and our new legged-robot estimators</a>, including Yetong Zhang’s workshop paper on constraint manifolds with corners.
Both papers will be presented at the <a href="https://sites.google.com/robotics.utias.utoronto.ca/icra26-frontiers-optimization/">Frontiers of Optimization for Robotics workshop</a> at ICRA shows how much momentum there is right now around certifiable optimization, convex relaxation, and structure-exploiting solvers for robotics.</p>

<h2 id="chordal-sparsity">Chordal sparsity</h2>

<figure class="center" style="width: 100%; max-width: 1100px; text-align: center;">
  <img src="/assets/images/icra-for-2026/chordal-framework.png" alt="Factor graph lifted to a QCQP, converted to a Bayes tree, and decomposed into clique-wise semidefinite variables." style="width: 100%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>From a factor graph to a lifted QCQP, then through the Bayes tree to a chordally decomposed SDP relaxation.</figcaption>
</figure>
<p><br /></p>

<p>The chordal-sparsity paper is here:</p>

<blockquote>
  <p><a href="https://arxiv.org/abs/2605.30617">Exploiting Chordal Sparsity for Globally Optimal Estimation with Factor Graphs</a>, by Avinash Subramanian, <a href="https://www.linkedin.com/in/connor-holmes-538726109/">Connor Holmes</a>, <a href="https://asrl.utias.utoronto.ca/~tdb/">Timothy D. Barfoot</a>, <a href="https://dellaert.github.io/">Frank Dellaert</a>, and <a href="https://duembgen.github.io/">Frederike Dümbgen</a>.</p>
</blockquote>

<p>The paper combines factor-graphs and structured optimization via the Bayes-tree with the certifiable-estimation viewpoint that Connor, Tim, and Frederike have helped push forward at the University of Toronto.
Local solvers such as Gauss-Newton and Levenberg-Marquardt are fast and exploit sparsity beautifully, but they do not promise that the answer is globally optimal. Convex SDP relaxations can give global solutions or certificates, but the naive monolithic SDP is usually too expensive.</p>

<p>Our contribution is to make the relaxation respect the graph structure. Starting from a GTSAM factor graph, we lift the problem to a QCQP, construct the Bayes tree through variable elimination, and use the resulting cliques to build a chordally decomposed SDP. In plain terms: instead of solving one <em>enormous</em> positive semidefinite matrix problem, we solve many smaller clique-wise matrix problems that follow the same sparse structure GTSAM already understands.</p>

<figure class="center" style="width: 100%; max-width: 820px; text-align: center;">
  <img src="/assets/images/icra-for-2026/chordal-ring-solver-time.png" alt="Solver time scaling for a 3D pose-graph SLAM ring factor graph comparing monolithic SDP, chordal SDP, and local solvers." style="width: 90%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>For the 3D ring pose-graph example, the chordal estimator scales much better than the monolithic SDP while retaining global-optimality guarantees when the relaxation is tight.</figcaption>
</figure>
<p><br /></p>

<p>The graph above shows the benefit of using the cliques of the Bayes tree: the chordal approach is not as fast a a local solver, but it is <em>globally optimal</em>, at a cost that is vastly less than a monolithic SDP solver, which OOMs on problems of moderate size.</p>

<h2 id="the-certifiable-wave">The certifiable wave</h2>

<p>The workshop has several papers that combine certifiable optimization, convex relaxations, and structure-exploiting solvers, which is fast becoming a theme in both estimation and control. Our chordal-sparsity paper is part of the “certifiable wave”, but here are many other papers touching on the theme:</p>

<ul>
  <li><a href="https://openreview.net/forum?id=hAtI0KkdAg">Certifiable Factor Graph Optimization</a>, by Zhexin Xu, Nikolas R. Sanderson, Hanna Jiamei Zhang, and David M. Rosen.</li>
  <li><a href="https://openreview.net/forum?id=SYsWOHYCx0">Low-Degree Implied Equalities for Strengthening Semidefinite Relaxations</a>, by Alexandre Amice, Bernhard Paus Graesdal, Russ Tedrake, and Pablo A. Parrilo.</li>
  <li><a href="https://openreview.net/forum?id=Kp1BbGAbCG">A Generalized Theorem of the Alternative for Certifiable Optimization with Redundant Constraints</a>, by Hanna Jiamei Zhang, Alan Papalia, Michael Everett, and David M. Rosen.</li>
  <li><a href="https://openreview.net/forum?id=GO890Hiwc2">Tightening Mixed-Integer Convex Relaxations for Efficient Temporal Logic Motion Planning via Logic Network Flow</a>, by Xuan Lin, Jiming Ren, Yandong Luo, Weijun Xie, and Ye Zhao.</li>
  <li><a href="https://openreview.net/forum?id=D1bVYYUh8m">Global Solvers for 3D Vision: Foundations, Frontiers, and a Call to the Robotics Community</a>, by Zhenjun Zhao and Javier Civera.</li>
</ul>

<h2 id="gtsam-preview">GTSAM preview</h2>

<p>I am exited to announce that soon GTSAM will support certifiable estimation in a big way, based on the recent <a href="/2026/05/13/qp-qcqp-in-gtsam.html">QP and QCQP support in GTSAM</a>. QCQPs are a natural bridge between factor-graph models and many convex-relaxation pipelines: once a nonconvex estimation problem is lifted into a quadratically constrained quadratic form, semidefinite relaxations and certificates can be handled ina  systematic way. Keep watching this space !</p>

<h2 id="further-browsing">Further browsing</h2>

<ul>
  <li><a href="https://sites.google.com/robotics.utias.utoronto.ca/icra26-frontiers-optimization/">Frontiers of Optimization for Robotics workshop</a></li>
  <li><a href="https://sites.google.com/robotics.utias.utoronto.ca/icra26-frontiers-optimization/accepted-contributions">Accepted contributions</a></li>
  <li><a href="https://arxiv.org/abs/2605.30617">Arxiv: Exploiting Chordal Sparsity for Globally Optimal Estimation with Factor Graphs</a></li>
  <li><a href="/2026/05/26/two-new-arxiv-papers.html">Post: Last week’s post on CMC-Opt and legged estimators</a></li>
  <li><a href="/2026/05/13/qp-qcqp-in-gtsam.html">Post: Quadratic Programs and QCQPs in GTSAM</a></li>
</ul>

<p><em>Disclosure: AI was used to help draft this post and prepare the figures.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Author: Frank Dellaert]]></summary></entry><entry><title type="html">Speaking of Legged Robots</title><link href="http://gtsam.org/2026/05/26/two-new-arxiv-papers.html" rel="alternate" type="text/html" title="Speaking of Legged Robots" /><published>2026-05-26T00:00:00+00:00</published><updated>2026-05-26T00:00:00+00:00</updated><id>http://gtsam.org/2026/05/26/two-new-arxiv-papers</id><content type="html" xml:base="http://gtsam.org/2026/05/26/two-new-arxiv-papers.html"><![CDATA[<p>Author: <a href="https://dellaert.github.io/">Frank Dellaert</a></p>

<!-- - TOC -->

<p>On June 1, I will be presenting <a href="https://arxiv.org/abs/2605.20796">CMC-Opt</a>, new work by <a href="https://www.cc.gatech.edu/people/yetong-zhang">Yetong Zhang</a> on constraint manifolds with corners, at the <a href="https://sites.google.com/robotics.utias.utoronto.ca/icra26-frontiers-optimization/">Frontiers of Optimization for Robotics workshop</a> at ICRA. The paper is now available on arXiv:</p>

<blockquote>
  <p><a href="https://arxiv.org/abs/2605.20796">CMC-Opt: Constraint Manifold with Corners for Inequality-Constrained Optimization</a>, by <a href="https://www.cc.gatech.edu/people/yetong-zhang">Yetong Zhang</a> and <a href="https://dellaert.github.io/">Frank Dellaert</a>.</p>
</blockquote>

<p>The paper presents a new way to use manifold optimization to solve large inequality-constrained optimization problems, such as state estimation and motion planning in legged systems: think quadrupeds and humanoids.</p>

<p>Speaking of legged systems, I’m also excited to announce more details and extensive experimental results on the four simple proprioceptive estimators for legged robots that we recently added to GTSAM. This work was done in collaboration with my recently graduated Ph.D. student <a href="https://varunagrawal.github.io/">Varun Agrawal</a>, and with the awesome <a href="https://chiyunnoh.github.io/">Chiyun Noh</a> and <a href="https://ayoungk.github.io/">Ayoung Kim</a> from the <a href="https://rpm.snu.ac.kr/">RPM Robotics Lab</a> at Seoul National University (SNU):</p>

<blockquote>
  <p><a href="https://arxiv.org/abs/2605.23100">Four Simple Proprioceptive Estimators for Legged Robots</a> by <a href="https://dellaert.github.io/">Frank Dellaert</a>, <a href="https://chiyunnoh.github.io/">Chiyun Noh</a>, <a href="https://varunagrawal.github.io/">Varun Agrawal</a>, and <a href="https://ayoungk.github.io/">Ayoung Kim</a>.</p>
</blockquote>

<p>What these two papers have in common is that we turn the many constraints in legged systems (and robotic systems in general) into factor graphs that can be <em>optimized</em> to do both perception and planning. Some might say it’s <a href="/2026/04/21/factor-graphs-and-world-models.html">sense-think-act with factor graphs</a>.</p>

<h2 id="cmc-opt-at-icra">CMC-Opt at ICRA</h2>

<figure class="center" style="width: 100%; max-width: 920px; text-align: center;">
  <img src="/assets/images/arxiv-may-2026/cmc-manifold-with-corners.png" alt="Constraint manifolds with corners, tangent spaces, and retraction examples." style="width: 90%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>Constraint manifolds with corners: feasible geometry, tangent spaces, and retractions.</figcaption>
</figure>
<p><br /></p>

<p>The core idea in <a href="https://arxiv.org/abs/2605.20796">CMC-Opt</a> is to transform the hard problem of constrained optimization into an <em>unconstrained</em> problem directly on the feasible state space. <a href="https://www.cc.gatech.edu/people/yetong-zhang">Yetong Zhang</a>, who is now on the motion planning team at <a href="https://waymo.com/">Waymo</a>, did a Ph.D. thesis with me on using geometry to make constrained robotic inference and planning problems easier to solve.
The figure above illustrates <strong>constraint manifolds with corners</strong>, which can capture nonlinear equalities <em>and</em> inequalities.</p>

<figure class="center" style="width: 100%; max-width: 920px; text-align: center;">
  <img src="/assets/images/arxiv-may-2026/cmc-quadruped-trajectory.png" alt="Quadruped jumping trajectory comparison for penalty optimization and CMC-Opt." style="width: 80%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>Quadruped jumping example: penalty baseline versus CMC-Opt.</figcaption>
</figure>

<p>Instead of using a monolithic classical constraint solver, his idea was to use the sparse graph structure and manifold optimization (as GTSAM provides) to create new manifolds out of the original variables and the constraints that involve them. Yetong created an algorithm to automatically identify “constraint-connected components” and turn them into new manifold types: lower-dimensional feasible spaces that reflect the robot’s inherent topological structure. The result is a new, coarser factor graph, which can really pay off in kinodynamic motion planning. For example, in the quadruped jumping example illustrated above, the search space drops from 32,194 dimensions to 2,260, and constraints will be satisfied <em>by construction</em>.</p>

<p>This is a continuation of the CM-Opt work that previously appeared at ICRA 2023 as <a href="https://ieeexplore.ieee.org/document/10161024">Constraint Manifolds for Robotic Inference and Planning</a>.</p>

<h2 id="legged-robot-estimators">Legged robot estimators</h2>

<p>The <a href="https://arxiv.org/abs/2605.23100">second paper</a> is just as exciting! In a previous post, <a href="/2026/03/17/legged-state-estimation-part2.html">Legged State Estimation</a>, I wrote about four simple <em>proprioceptive</em> estimators for legged robots, i.e., they only use an IMU and internal joint angles over time to determine the trajectory of the robot. They are basically KISS-style versions of the ideas first explored by <a href="https://infoscience.epfl.ch/server/api/core/bitstreams/bb6c046d-6633-4c8c-8a5f-f8729667c6b6/content">Michael Bloesch et al.</a> and <a href="https://arxiv.org/abs/1904.09251">Ross Hartley et al.</a>, and our own <a href="https://arxiv.org/abs/2209.05644">Humanoids 2022 publication</a>, where footholds are treated as landmarks: <a href="https://en.wikipedia.org/wiki/Footloose">foot SLAM</a>, so to speak.</p>

<p><a href="https://varunagrawal.github.io/">Varun Agrawal</a> was instrumental in creating legged-robot locomotion and estimation capabilities in the same factor-graph style used elsewhere in GTSAM, and those four estimators were directly inspired by his work. All four variants <a href="https://borglab.github.io/gtsam/leggedestimator/">are available in GTSAM</a>.
But the question remained: how well do they perform on real, hardcore data?</p>

<figure class="center" style="width: 100%; max-width: 720px; text-align: center;">
  <img src="/assets/images/arxiv-may-2026/garliLeo-spot-platform.png" alt="Boston Dynamics Spot robot used for the GaRLILEO dataset." style="width: 50%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>The Boston Dynamics Spot at SNU, platform used in the GaRLILEO dataset.</figcaption>
</figure>

<p>Enter the collaboration with <a href="https://chiyunnoh.github.io/">Chiyun Noh</a> and <a href="https://ayoungk.github.io/">Ayoung Kim</a> at Seoul National University (SNU): their group has done amazing work in LiDAR- and radar-based state estimation and was kind enough to help us properly evaluate our new estimators, using the data they painstakingly collected with a Boston Dynamics Spot robot to create the <a href="https://garlileo.github.io/GaRLILEO/">GaRLILEO dataset</a>.
And, to top it off, Chiyun created a <a href="https://github.com/ChiyunNoh/GTSAM-Legged-Estimator-ROS2">ROS2-compatible implementation</a>, so you can try it yourself!</p>

<figure class="center" style="width: 100%; max-width: 920px; text-align: center;">
  <img src="/assets/images/arxiv-may-2026/legged-trajectory-comparison.png" alt="Representative trajectory comparisons for four proprioceptive legged estimators." style="width: 80%; display: block; margin-left: auto; margin-right: auto;" />
  <figcaption>Representative trajectory comparisons for invariant filtering, local graph updates, and fixed-lag smoothing, with and without evolving bias. (a) "CorriLoop" emphasizes horizontal loop consistency, while (b) "Downstair" highlights vertical tracking during sustained elevation change.</figcaption>
</figure>

<p>The main discovery, hinted at in the figure above: the simple GTSAM legged estimators are not half bad, one might even say they are pretty good! <em>In this dataset</em> they beat out all of the state-of-the-art estimators that we tested them against. This is absolutely not the end of the story: we are working to test these estimators in several other environments and against other recent estimators. But for something that originated as an example in my <a href="https://dellaert.github.io/26S-AMR/">advanced robotics class</a>, they are at the very least very good baselines to test against.</p>

<p>Of course, these “blind” estimators are just the basis for a practical robot perception system. You need to fuse these with an external sensor, such as vision, LiDAR, or radar, which is exactly what <a href="https://ayoungk.github.io/">Ayoung Kim</a>’s group excels at doing. But it’s good to start from an estimator that at least keeps very good track of where you walk while closing your eyes!</p>

<h2 id="further-browsing">Further browsing</h2>

<ul>
  <li><a href="https://sites.google.com/robotics.utias.utoronto.ca/icra26-frontiers-optimization/">Frontiers of Optimization for Robotics workshop</a></li>
  <li>arXiv link: <a href="https://arxiv.org/abs/2605.20796">CMC-Opt: Constraint Manifold with Corners for Inequality-Constrained Optimization</a>.</li>
  <li>blog post: <a href="/2026/03/17/legged-state-estimation-part2.html">Legged State Estimation</a></li>
  <li>arXiv link: <a href="https://arxiv.org/abs/2605.23100">Four Simple Proprioceptive Estimators for Legged Robots</a>.</li>
  <li>STAG: <a href="/2026/04/21/factor-graphs-and-world-models.html">sense-think-act with factor graphs</a></li>
</ul>

<p><em>Disclosure: AI was used to help draft this post and prepare the figures.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Author: Frank Dellaert]]></summary></entry><entry><title type="html">Smoothing Out the Edges: Continuous-Time State Estimation Tools in GTSAM via Gaussian Processes</title><link href="http://gtsam.org/2026/05/20/gp-ct-in-gtsam.html" rel="alternate" type="text/html" title="Smoothing Out the Edges: Continuous-Time State Estimation Tools in GTSAM via Gaussian Processes" /><published>2026-05-20T00:00:00+00:00</published><updated>2026-05-20T00:00:00+00:00</updated><id>http://gtsam.org/2026/05/20/gp-ct-in-gtsam</id><content type="html" xml:base="http://gtsam.org/2026/05/20/gp-ct-in-gtsam.html"><![CDATA[<p>Authors: <a href="https://www.linkedin.com/in/connor-holmes-538726109/">Connor Holmes</a>, <a href="https://www.torontomu.ca/cs/our-people/sven-lilge/">Sven Lilge</a>, <a href="https://www.linkedin.com/in/zi-cong-daniel-guo/">Zi Cong Guo</a>, <a href="https://dellaert.github.io/">Frank Dellaert</a>, and <a href="https://asrl.utias.utoronto.ca/~tdb/">Timothy D. Barfoot</a></p>

<!-- - TOC -->

<p>In modern robotics, we often represent trajectories using discrete-time elements, but many real-world scenarios benefit from a continuous representation. Whether you are dealing with high-rate asynchronous sensors, rolling-shutter cameras, or the need to sample a trajectory at arbitrary times for control and planning, continuous-time (CT) estimation provides a principled solution.</p>

<p>The two main approaches for CT estimation to date involve either parametric approaches, such as splines, or non-parametric ones, such as Gaussian processes (GPs). While GTSAM is traditionally used for discrete-time factor graph problems, it now features powerful capabilities for GP-based continuous-time estimation, accompanying our <a href="https://arxiv.org/abs/2605.09073">recent paper</a>.</p>

<p>An example of GP-based CT trajectory is shown below. The trajectory specifically includes states $\mathbf{x}$ (e.g., position or pose of a robot over time) at discrete times $t_k$ (typically when measurements occur), but retains the ability to query the mean and covariance of the state at any arbitrary time $\tau$ through the interpolation capabilities of the underlying Gaussian process.</p>

<figure class="center" style="width: 100%; max-width: 820px;">
  <img src="/assets/images/gp-ct/gp-trajectory.png" alt="Continuous-time representation of a trajectory using a Gaussian process." style="width: 100%;" />
  <figcaption>A continuous-time trajectory represented as a Gaussian process. The interpolation capabilities of the Gaussian process allow querying both the mean and the covariance of the state at any arbitrary time.</figcaption>
</figure>
<p><br /></p>

<p>A core insight that we share in our <a href="https://arxiv.org/abs/2605.09073">recent paper</a> is that querying such a trajectory at any time is mathematically equivalent to an application of the standard factor-graph elimination algorithm. This perspective not only makes the math more intuitive but also reveals how to perform efficient $O(1)$ interpolation for both the state’s mean and covariance.</p>

<p>GTSAM now features built-in capabilities to carry out GP-based continuous-time estimation within the existing factor graph framework.</p>

<h2 id="new-gtsam-features">New GTSAM Features</h2>
<p>We introduce several key components to GTSAM for performing CT estimation on vector spaces (<code class="language-plaintext highlighter-rouge">Point1</code>, <code class="language-plaintext highlighter-rouge">Point2</code>, <code class="language-plaintext highlighter-rouge">Point3</code>) and Lie groups (<code class="language-plaintext highlighter-rouge">Pose2</code>, <code class="language-plaintext highlighter-rouge">Pose3</code>):</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">StateData</code></strong>: A custom struct that links poses, velocities, and timestamps for a given state.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">WnoaMotionFactor</code></strong>: A binary motion prior factor that connects neighboring pose and velocity pairs based on a White-Noise-on-Acceleration (WNOA) model. This prior smooths the trajectory by assuming constant velocities and endows the estimation with a continuous-time GP interpretation.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">WnoaInterpFactor</code></strong>: A powerful wrapper factor that allows you to add measurements to your graph at arbitrary timestamps, even those not included in the main graph. It internally handles the GP-interpolation, linking asynchronous data to the discrete states you are optimizing.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">interpolateFactorGraph</code></strong>: A convenience function that can automatically convert a standard factor graph into a reduced, equivalent graph where selected states are interpolated, significantly reducing the size of the optimization problem.</li>
  <li><strong>Post-Solve Querying</strong>: Functions like <code class="language-plaintext highlighter-rouge">updateInterpValues</code> and <code class="language-plaintext highlighter-rouge">updateInterpValuesWithCovariance</code> allow you to query the full, smooth trajectory and its uncertainty after the main optimization is complete.</li>
</ul>

<h2 id="an-example-on-se3">An Example on $SE(3)$</h2>

<p>To see these tools in action, let’s consider a simple $SE(3)$ trajectory example.</p>

<p>The most straightforward workflow is to define a trajectory by creating <code class="language-plaintext highlighter-rouge">StateData</code> entries for the states at discrete times and linking them with the binary <code class="language-plaintext highlighter-rouge">WnoaMotionFactor</code>. We can then add measurements to any of those states at discrete times, such as pose or velocity observations. In this example, we use pose measurements. The resulting graph contains both binary and unary factors, and solving it with standard GTSAM solvers gives us the mean and covariance of each state, as shown in the figure below.</p>

<figure class="center" style="width: 100%; max-width: 820px;">
  <img src="/assets/images/gp-ct/discrete-time-traj.png" alt="Top: Factor graph with discrete states and motion priors. Bottom: Rendering of the discrete-time trajectory mean and covariance." style="width: 100%;" />
  <figcaption>Top: Factor graph representation of the estimation problem, including states at discrete times connected with WNOA motion prior factors. Unary measurement factors can be included for any of those states. Bottom: Resulting solution of the estimated trajectory at the discrete times, including mean and covariance.</figcaption>
</figure>
<p><br /></p>

<p>We can now use the new GTSAM functionalities to additionally query the mean and covariance of the trajectory at any arbitrary time. The figure below shows a much denser trajectory with a smooth state. States at queried times can be recovered by drawing an analogy to factor-graph elimination, as illustrated in the figure. This lets us query the trajectory after solving the discrete problem at any time, which is useful for downstream tasks such as planning and control.</p>

<figure class="center" style="width: 100%; max-width: 820px;">
  <img src="/assets/images/gp-ct/cont-time-traj.png" alt="Top: Factor graph showing interpolated state recovery. Bottom: Rendering of smooth trajectory with post-solve interpolated states." style="width: 100%;" />
  <figcaption>Top: Factor graph representation of the estimation problem. States at arbitrary times can be recovered by drawing analogies to the factor-graph eliminiation algorithm. Bottom: Resulting solution of the estimated trajectory including both discrete-time states and post-solve interpolated states.</figcaption>
</figure>
<p><br /></p>

<p>Finally, we are not restricted to measurements, or any other factors, that align exactly with the optimization states at discrete times.</p>

<p>As illustrated in the figure below, suppose we receive a measurement at an arbitrary time $\tau$. In a traditional setup (left), we would need to insert a new state $\mathbf{x}_\tau$ into the optimization graph. Instead, we can conceptually eliminate $\mathbf{x}_\tau$ using the GP motion model. This elimination produces two distinct components (right):</p>

<ol>
  <li>A conditional density $p(\mathbf{x}_\tau \mid \mathbf{x}_k, \mathbf{x}_{k-1})$ representing the eliminated state $\mathbf{x}_\tau$ (shown in gray).</li>
  <li>A new measurement factor $\phi_y(\mathbf{x}_{k-1}, \mathbf{x}_k)$ that depends solely on the two neighboring bounding states, $\mathbf{x}_{k-1}$ and $\mathbf{x}_k$.</li>
</ol>

<p>In GTSAM, we implement this mechanism using the wrapper factor <code class="language-plaintext highlighter-rouge">WnoaInterpFactor</code>. It converts a factor at an arbitrary time into this neighboring-state factor, allowing GTSAM to optimize the trajectory while correctly accounting for exact time associations via GP interpolation.</p>

<p>The bottom of the figure demonstrates this in practice. This formulation is especially useful when measurements are asynchronous or arrive at high rates (shown in red). Rather than including states in the graph for every single measurement, we only need to optimize a subset of discrete states (dark blue) at a lower rate, such as 10 Hz. The wrapper factor relies on GP interpolation to correctly relate the asynchronous measurements to the discrete states, effectively enabling exact continuous-time interpolation during the solve rather than only post-solve.</p>

<figure class="center" style="width: 100%; max-width: 820px;">
  <img src="/assets/images/gp-ct/asynchronous-traj.png" alt="Top: Factor graph showing a wrapper factor linking to neighbor states. Bottom: Trajectory rendering incorporating asynchronous measurements." style="width: 100%;" />
  <figcaption>Top: Converting a factor associated with a state at an interpolated time to a factor associated with the neighboring discrete-time states using the factor-graph elimination algorithm. Bottom: Resulting solution of the estimated trajectory including both discrete-time states and post-solve interpolated states, while incorporating asynchronous measurements.</figcaption>
</figure>
<p><br /></p>

<h2 id="takeaway">Takeaway</h2>

<p>The integration of GP-based continuous-time estimation into GTSAM provides a flexible, modular framework that maintains the library’s standard workflow. It allows practitioners to handle asynchronous sensor data in a principled way and reduce problem sizes without sacrificing the fidelity of the continuous trajectory.</p>

<h2 id="additional-reading">Additional Reading</h2>

<p>For a deeper dive into the theory and broader context of these methods, we recommend reading our <a href="https://arxiv.org/abs/2605.09073">recent paper</a>, “Smoothing Out the Edges: Continuous-Time Estimation with Gaussian Process Motion Priors on Factor Graphs”.</p>

<p>You can find more details on the example used in this blogpost in our <a href="https://borglab.github.io/gtsam/gaussianprocesswnoainterpolationse3/">GTSAM Example Notebook</a> and interactive <a href="https://colab.research.google.com/github/borglab/gtsam/blob/develop/python/gtsam/examples/GaussianProcessWnoaInterpolationSE3.ipynb">Google Colab Notebook</a>. Please also visit our <a href="https://github.com/utiasASRL/2025-fnt-ctfg">GitHub Repository</a> for further real-world robotics examples. These specifically include:</p>

<ol>
  <li><strong>1D (Giant Glass of Milk)</strong>: A mobile robot driving back and forth in a straight line, demonstrating basic smoothing.</li>
  <li><strong>2D (Lost in the Woods)</strong>: SLAM and localization for a wheeled robot using asynchronous landmark observations, showing problem-size reduction via aggressive interpolation.</li>
  <li><strong>3D (Starry Night)</strong>: $SE(3)$ localization using a stereo camera and IMU, illustrating high-fidelity trajectory recovery with 80% fewer states in the main solve by relying on GP interpolation.</li>
</ol>

<p><em>Disclosure: AI was used to help draft this post.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Authors: Connor Holmes, Sven Lilge, Zi Cong Guo, Frank Dellaert, and Timothy D. Barfoot]]></summary></entry><entry><title type="html">Quadratic Programs and QCQPs in GTSAM</title><link href="http://gtsam.org/2026/05/13/qp-qcqp-in-gtsam.html" rel="alternate" type="text/html" title="Quadratic Programs and QCQPs in GTSAM" /><published>2026-05-13T00:00:00+00:00</published><updated>2026-05-13T00:00:00+00:00</updated><id>http://gtsam.org/2026/05/13/qp-qcqp-in-gtsam</id><content type="html" xml:base="http://gtsam.org/2026/05/13/qp-qcqp-in-gtsam.html"><![CDATA[<p>Author: <a href="https://dellaert.github.io/">Frank Dellaert</a> and <a href="https://scholar.google.com/citations?user=Js_AA5IAAAAJ&amp;hl=en">Yetong Zhang</a></p>

<!-- - TOC -->

<p>Quadratic programming is one of the quiet workhorses behind modern robot motion. In legged robot locomotion, QPs show up in contact-force allocation, whole-body control, and model-predictive control loops that have to respect friction, torque, and unilateral-contact constraints. In quadrotor flight, small QPs appear whenever a desired thrust vector has to be mapped onto bounded rotor speeds. These are everyday constrained optimization problems that many GTSAM users already solve somewhere else in their stack.</p>

<p>GTSAM now has first-class building blocks for QP and QCQP modeling in the <code class="language-plaintext highlighter-rouge">constrained</code> module. The new pieces let you express quadratic objectives, linear constraints, and quadratic constraints over direct <code class="language-plaintext highlighter-rouge">Vector</code> and <code class="language-plaintext highlighter-rouge">Matrix</code> entries in <code class="language-plaintext highlighter-rouge">Values</code>, while still living inside GTSAM’s factor-graph-flavored ecosystem. There is also LP support, which is useful and closely related, but less central to the typical GTSAM user. This post therefore focuses on QP and QCQP.</p>

<h2 id="qp-quadratic-objectives-with-linear-constraints">QP: Quadratic objectives with linear constraints</h2>

<p>A QP optimizes a quadratic objective subject to linear equalities or inequalities. In GTSAM terms, that means you can combine a quadratic cost, such as one coming from a <code class="language-plaintext highlighter-rouge">HessianFactor</code> or <code class="language-plaintext highlighter-rouge">QpCost</code>, with constraints like <code class="language-plaintext highlighter-rouge">A x = b</code>, <code class="language-plaintext highlighter-rouge">A x &lt;= b</code>, or <code class="language-plaintext highlighter-rouge">A x &gt;= b</code>. Geometrically, the optimizer is looking for the lowest point of a bowl after slicing it by planes and half-spaces. The active constraints are the boundaries that actually determine the final solution.</p>

<figure class="center" style="width: 100%; max-width: 820px;">
  <img src="/assets/images/qp-qcqp/qp-projection.png" alt="QP contour plot showing an unconstrained target projected onto a feasible line segment with an active upper-bound constraint." style="width: 100%;" />
  <figcaption>A small QP from the <a href="https://borglab.github.io/gtsam/qpproblemexample/">QP notebook</a>: the unconstrained quadratic minimum is infeasible, so the solution lands on the feasible segment where the upper-bound inequality is active.</figcaption>
</figure>
<p><br /></p>

<p>The two-dimensional QP example above makes these active constraints visible. The yellow point is the unconstrained target, the dashed line is an equality constraint, and the green segment is the part of that line that survives the inequalities. The optimizer yields the best target-compatible point that still satisfies all constraints. This same model describes many robotics QPs, even when the variables are contact forces, accelerations, or actuator commands rather than two plotted coordinates.</p>

<figure class="center" style="width: 100%; max-width: 920px;">
  <img src="/assets/images/qp-qcqp/quadrotor-qp.png" alt="Quadrotor QP dashboard showing one saturated rotor, desired and achieved wrench bars, residuals, and upper-bound margins." style="width: 100%;" />
  <figcaption>A quadrotor allocation QP: one rotor hits its upper bound, while the remaining rotors choose the closest feasible wrench.</figcaption>
</figure>
<p><br /></p>

<p>The quadrotor allocation example above shows why small QPs matter in real-time systems. Given a desired thrust and body torque, the allocation matrix maps four normalized rotor thrusts into a wrench, while box constraints keep each rotor inside its physical range. The unconstrained request would push one rotor beyond its limit, so the constrained solution saturates that rotor and distributes the remaining effort across the others. This is a tiny, fixed-structure problem where warm starts and solver overhead matter.</p>

<p>In terms of solves, both LP and QP problems have a sparse active-set solver, which is the natural starting point for chains, grids, and SLAM-like structures, where sparsity matters. QP also has a dense active-set path for tiny warm-started fixed-structure problems, such as the control-allocation QP above. There dense linear algebra beats graph setup costs. Because QPs are constrained optimization problems, they can also be handed to any constrained optimizer, such as the augmented Lagrangian optimizer.</p>

<h2 id="qcqp-quadratic-constraints">QCQP: Quadratic constraints</h2>

<p>A QCQP keeps the quadratic objective but allows the constraints themselves to be quadratic. Instead of only carving a bowl with lines or planes, a QCQP can impose boundaries such as ellipses, spheres, norm bounds, and other scalar quadratic relations. That small change is important because many robotics constraints are naturally quadratic, e.g., “being on the $SO(3)$ manifold” can be expressed as a set of quadratic constraints.</p>

<figure class="center" style="width: 100%; max-width: 820px;">
  <img src="/assets/images/qp-qcqp/qcqp-geometry.png" alt="QCQP contour plot showing a target outside a unit disk and strip, with the solution at the intersection of two active quadratic constraints." style="width: 100%;" />
  <figcaption>A QCQP from the <a href="https://borglab.github.io/gtsam/qcqpproblemexample/">QCQP notebook</a>: the feasible set is shaped by quadratic constraints, and the solution lands where the active circular and strip boundaries meet.</figcaption>
</figure>
<p><br /></p>

<p>The QCQP geometry example above shows how much changes when constraints can curve. The target lies outside the feasible region, but the feasible region is no longer a polygonal slice of the plane. One quadratic constraint creates the circular boundary, while another bounds the squared vertical coordinate. The solution sits where those two active quadratic constraints meet. This is still an optimization problem over familiar <code class="language-plaintext highlighter-rouge">Values</code>, but the feasible set has become rich enough to express a much broader family of robotics problems.</p>

<p>In particular, QCQP is a common language for convex relaxation and certifiable state estimation. Many estimation problems that start as non-convex geometry can be lifted, relaxed, or bounded through quadratic objectives and quadratic constraints, and those formulations are often the bridge to certificates of global optimality. That is the exciting part we are only hinting at today: future posts will go deeper into how these ideas connect to certifiable estimators in GTSAM. Stay tuned !</p>

<h2 id="takeaway">Takeaway</h2>

<p>The takeaway is that GTSAM’s constrained module now reaches beyond nonlinear least squares into optimization models robotics users already rely on. QP gives you a standard way to model constrained quadratic objectives, QCQP adds quadratic feasible sets, and the docs and notebooks (see below) provide runnable examples without requiring a separate optimization package just to get started. LP, QP, and QCQP open a path toward richer constrained estimation, control, and certifiable inference inside GTSAM.</p>

<h2 id="additional-reading">Additional Reading</h2>

<p>The practical entry points are the notebooks and docs rather than a long API tour here. The <a href="https://borglab.github.io/gtsam/qpproblem/">QpProblem docs</a> describe the core QP model, and the runnable <a href="https://borglab.github.io/gtsam/qpproblemexample/">QP example notebook</a> shows both a two-dimensional geometry example and a quadrotor allocation example. The corresponding <a href="https://borglab.github.io/gtsam/qcqpproblem/">QcqpProblem docs</a> and <a href="https://borglab.github.io/gtsam/qcqpproblemexample/">QCQP example notebook</a> cover quadratic constraints. If you want the linear-programming sibling, the <a href="https://borglab.github.io/gtsam/lpproblemexample/">LP example notebook</a> is the right place to start.</p>

<p><em>Disclosure: AI was used to help draft this post and prepare the figures.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Author: Frank Dellaert and Yetong Zhang]]></summary></entry><entry><title type="html">The Manifold Kalman Filter Hierarchy, Part 4: Awesome Equivariant Filters!</title><link href="http://gtsam.org/2026/05/06/awesome-eqfs.html" rel="alternate" type="text/html" title="The Manifold Kalman Filter Hierarchy, Part 4: Awesome Equivariant Filters!" /><published>2026-05-06T00:00:00+00:00</published><updated>2026-05-06T00:00:00+00:00</updated><id>http://gtsam.org/2026/05/06/awesome-eqfs</id><content type="html" xml:base="http://gtsam.org/2026/05/06/awesome-eqfs.html"><![CDATA[<p><em>Authors</em>: <a href="https://rbansal.dev/academic">Rohan Bansal</a> and <a href="https://dellaert.github.io">Frank Dellaert</a>
<em>GTSAM Contributors</em>: Jennifer Oum, Darshan Rajasekaran (ABC) and Rohan Bansal (EqVIO).
<em>EqVIO paper authors</em>: <a href="https://pvangoor.github.io/">Pieter van Goor</a> and <a href="https://eng.anu.edu.au/people/robert-mahony">Robert Mahony</a>.
<em>ABC-EqF paper authors</em>: <a href="https://scholar.google.com/citations?user=mb8ewjgAAAAJ&amp;hl=it">Alessandro Fornasier</a>, Yonhon Ng, Christian Brommer, Christoph Böhm, <a href="https://eng.anu.edu.au/people/robert-mahony">Robert Mahony</a>, and <a href="https://scholar.google.com/citations?user=dQmvEyUAAAAJ&amp;hl=de">Stephan Weiss</a>.</p>

<!-- - TOC -->

<figure class="center" style="width: 100%; max-width: 900px;">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="/assets/images/awesome-eqf/AwesomeEqF-dark.png" />
    <source media="(prefers-color-scheme: light)" srcset="/assets/images/awesome-eqf/AwesomeEqF-light.png" />
    <img src="/assets/images/awesome-eqf/AwesomeEqF-light.png" alt="AwesomeEqF logo showing cursive text in the symmetry group reflected onto a curved manifold surface, with a mapping arrow labeled phi." style="width: 100%;" />
  </picture>
</figure>
<p><br /></p>

<p>In <a href="https://gtsam.org/2026/04/28/equivariant.html">Part 3</a> of the Manifold Filter Hierarchy, we introduced the <code class="language-plaintext highlighter-rouge">EquivariantFilter</code> template in GTSAM and walked through the geometry that makes EqF useful: a state on a manifold $\mathcal{M}$, a symmetry group $\mathcal{G}$ acting on it, and an error expressed around a fixed reference state instead of the current estimate. In that post, we discussed a very simple toy problem of an attitude-on-a-sphere.</p>

<p>In today’s post, we consider more complex problems which can be tackled using an EqF, such as VIO (Visual-Inertial-Odometry) and ABC (Attitude-Bias-Calibration). In tandem, we also announce <strong><a href="https://borglab.github.io/AwesomeEqF/">AwesomeEqF</a></strong>: a community-curated collection of papers and runnable notebooks for equivariant filtering, built around GTSAM.</p>

<h2 id="what-is-awesomeeqf">What is AwesomeEqF?</h2>

<p>AwesomeEqF is a <a href="https://borglab.github.io/AwesomeEqF/">website</a> (and <a href="https://github.com/borglab/AwesomeEqF">repo</a>) containing:</p>

<ul>
  <li>A reading list of papers, organized from foundational invariant-observer papers through to recent EqF architectures</li>
  <li>A growing set of notebooks that utilize GTSAM’s EqF filter implementation and perform on real data</li>
  <li>A soon-to-be blog for tutorials and write-ups that contextualize specific papers.</li>
</ul>

<p>The intent is for AwesomeEqF to be the place a roboticist lands when they have read about the potential of equivariant filtering and are excited to get their hands dirty. Contributions are welcome, see the <a href="https://borglab.github.io/AwesomeEqF/contributing/">Contributing Guide</a>.</p>

<h2 id="a-quick-recap-of-the-eqf">A Quick Recap of the EqF</h2>

<p>From <a href="https://gtsam.org/2026/04/28/equivariant.html">Part 3</a>: an EqF stores the estimate as a fixed reference state $\xi^\circ \in \mathcal{M}$ together with a group element $\hat{g} \in \mathcal{G}$. The current estimate is recovered by the group action $\hat{\xi}$, and the natural error $e$ lands at $\xi^\circ$ when the filter is correct.</p>

\[\hat{\xi} = \phi(\hat{g}, \xi^\circ),\]

\[e = \phi(\hat{g}^{-1}, \xi)\]

<p>Because the linearization happens around that fixed reference rather than the moving estimate, covariance propagation depends much less on whether the current guess is right.</p>

<p>Every new EqF needs two problem-specific ingredients before it can run like an ordinary EKF. We need to supply the <strong>lift</strong> that turns physical dynamics into a small motion in the group, and the <strong>equivariance conditions</strong> that the dynamics and outputs have to satisfy. Once those are in, the actual runtime loop looks like an ordinary EKF on the group tangent space.</p>

<p>The rest of this post applies that EqF pattern to two practical cases: visual-inertial odometry (VIO) and attitude estimation.</p>

<h2 id="the-eqvio-equivariant-visual-inertial-odometry">The EqVIO: Equivariant Visual-Inertial Odometry</h2>

<p>The <strong>EqVIO</strong> filter by <a href="https://arxiv.org/abs/2205.01980">Pieter van Goor and Robert Mahony</a> is the answer to a long-standing complaint about EKF-based VIO: standard filters such as MSCKF (Multi-State Constraint Kalman Filter) accumulate inconsistency because the linearization point drifts with the (possibly wrong) estimate, and the filter ends up more confident than its actual error warrants. The EqVIO removes that source of inconsistency by construction, using equivariance.</p>

<h3 id="the-vio-state">The VIO state</h3>

<p>The EqVIO represents VIO with a manifold state containing pose, velocity, IMU biases, camera extrinsics, and tracked landmarks. At every timestep, its physical state is composed of:</p>

<ol>
  <li>body pose $P \in SE(3)$,</li>
  <li>body linear velocity $v \in \mathbb{R}^3$,</li>
  <li>gyroscope bias $b_\omega \in \mathbb{R}^3$,</li>
  <li>accelerometer bias $b_a \in \mathbb{R}^3$,</li>
  <li>camera-to-IMU rigid offset $T_{ci} \in SE(3)$,</li>
  <li>a set of 3D landmarks $p_i \in \mathbb{R}^3$ corresponding to tracked image features.</li>
</ol>

<p><br /></p>
<figure class="center" style="width: 100%; max-width: 700px;">
  <img src="/assets/images/awesome-eqf/eqvio_state.png" alt="EqVIO state diagram." style="width: 100%;" />
  <figcaption>Figure from <a href="https://arxiv.org/pdf/2205.01980">van Goor et. al</a>, visualizing the state of the system relative to the origin.</figcaption>
</figure>
<p><br /></p>

<p>Note that the state is <em>not</em> a Lie group, but rather a manifold, which is exactly the situation an EqF is good for.</p>

<h3 id="the-symmetry-group">The symmetry group</h3>

<p>The key construction in the EqVIO is a symmetry group $\mathcal{G}$ that <em>acts</em> on the full composite VIO state. The group is built as a product Lie group whose factors mirror the state itself:</p>

\[\mathcal{G} = SE_2(3) \ltimes \mathbb{R}^6 \times SE(3) \times \prod_i \mathrm{SOT}(3).\]

<p>Each group factor corresponds to a specific part of the VIO state:</p>

<ul>
  <li><strong>$SE_2(3)$</strong>, the “extended pose” group, jointly handles attitude, position, and velocity.</li>
  <li><strong>$\mathbb{R}^6$</strong> for the two IMU biases, which the semi-direct product couples back into the inertial frame.</li>
  <li><strong>$SE(3)$</strong> for the camera offset $T_{ci}$, so online extrinsic refinement is part of the geometry.</li>
  <li><strong>$\mathrm{SOT}(3)$</strong> (rotation plus scaling) per landmark, capturing the rotation-and-depth ambiguity that visual measurements really do have.</li>
</ul>

<p>The action $\phi$ of $\mathcal{G}$ on the state is then the natural one inherited from each factor.</p>

<p><strong>$\mathrm{SOT}(3)$ is the rotation-and-positive-scale group that the EqVIO uses to encode each landmark’s monocular bearing-depth ambiguity.</strong> Some readers may be unfamiliar with this group, as it is not a commonly defined group in GTSAM, but rather specific to the EqVIO implementation. Concretely,</p>

\[\mathrm{SOT}(3) = SO(3) \times \mathbb{R}_{&gt;0}\]

<p>is the direct product of a rotation $R \in SO(3)$ and a strictly positive scalar $s \in \mathbb{R}_{&gt;0}$, acting on a 3D point as $q \mapsto s\, R\, q$. This group matters because monocular projection only fixes a landmark up to its bearing direction and a positive depth scaling, which is exactly the ambiguity that $\mathrm{SOT}(3)$ encodes, so making it part of the symmetry is what lets the equivariant output approximation in the next section work.</p>

<h3 id="the-equivariant-output-approximation">The equivariant output approximation</h3>

<p>Camera measurements are “equivariant” when transforming the state produces a predictable transformation of the measurement.</p>

<p>EqVIO takes advantage of the <strong>equivariant output approximation</strong>, a general EqF construction that is available when the output map is equivariant.  As is classic for VIO systems, the camera observes a landmark and produces a bearing vector. In the paper, van Goor and Mahony show that the landmark bearing measurement is equivariant with respect to the SOT(3) symmetry, which enables this same approximation in the camera update.</p>

<p>The equivariant output approximation can reduce camera measurement approximation error by an order of magnitude. Traditionally, EKFs use a first-order approximation of the measurement function; by exploiting the equivariance property, we can use the group structure to process input camera data with a more faithful local approximation.</p>

<p>The same symmetry argument also motivates inverse-depth-style landmark parameterizations. It is <a href="https://en.wikipedia.org/wiki/Inverse_depth_parametrization">well known</a> that representing landmarks by inverse distance can improve stability of a filter. The authors present a polar parameterization derived from $\mathrm{SOT}(3)$ that can act similar to inverse-depth but also further minimize linearization error. Currently, this polar parameterization is not implemented into GTSAM’s EqVIO implementation, but it is a near-future change on the roadmap.</p>

<h3 id="what-the-runtime-loop-looks-like">What the runtime loop looks like</h3>

<p>The EqVIO runtime loop has the familiar predict-update shape, with extra feature management for a changing landmark set:</p>

<ol>
  <li><strong>Predict.</strong> IMU frames drive a small motion in the group via the lift.</li>
  <li><strong>Update.</strong> For each tracked feature in a new image frame, predict the normalized image coordinate, compare to the observation, form the equivariant innovation, and apply a correction in the tangent space.</li>
  <li><strong>Manage features.</strong> Add new landmarks for unseen features, drop features that fall out of the image, and keep the covariance block consistent with the live landmark set.</li>
</ol>

<p>Feature management is essential bookkeeping for running the EqVIO filter on real sequences without the state vector blowing up. This bookkeeping step is new compared with the smaller examples in the previous posts.</p>

<h2 id="the-eqvio-in-gtsam">The EqVIO in GTSAM</h2>

<p>GTSAM exposes the EqVIO through three implementation files in <code class="language-plaintext highlighter-rouge">gtsam_unstable/navigation</code>:</p>

<ul>
  <li><a href="https://github.com/borglab/gtsam/blob/develop/gtsam_unstable/navigation/EqVIOState.h"><code class="language-plaintext highlighter-rouge">EqVIOState.h</code></a>: the manifold state described above, including the dynamic landmark list.</li>
  <li><a href="https://github.com/borglab/gtsam/blob/develop/gtsam_unstable/navigation/EqVIOSymmetry.h"><code class="language-plaintext highlighter-rouge">EqVIOSymmetry.h</code></a>: the semi-direct-product group $\mathcal{G}$, its action on <code class="language-plaintext highlighter-rouge">EqVIOState</code>, and the lift used during prediction.</li>
  <li><a href="https://github.com/borglab/gtsam/blob/develop/gtsam_unstable/navigation/EqVIOFilter.h"><code class="language-plaintext highlighter-rouge">EqVIOFilter.h</code></a>: the filter class and the <code class="language-plaintext highlighter-rouge">predict</code> / <code class="language-plaintext highlighter-rouge">update</code> entry points.</li>
</ul>

<p><code class="language-plaintext highlighter-rouge">EqVIOFilter</code> is built on the <code class="language-plaintext highlighter-rouge">EquivariantFilter</code> template that <a href="https://gtsam.org/2026/04/28/equivariant.html">Part 3</a> introduced. <code class="language-plaintext highlighter-rouge">xi_ref_</code> is the EqVIO reference state, and <code class="language-plaintext highlighter-rouge">g_</code> is the lifted group estimate that the IMU drives.</p>

<p>Python users can access the same EqVIO filter through <code class="language-plaintext highlighter-rouge">gtsam_unstable.eqvio</code> bindings that closely mirror the C++ API. The snippet below walks through the initialization and propagation of the filter, which is described in more detail in the <a href="https://borglab.github.io/AwesomeEqF/notebooks/eqvio-example/">AwesomeEqF notebook</a>!</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">gtsam</span><span class="p">,</span> <span class="n">gtsam_unstable</span>

<span class="n">xi_ref</span> <span class="o">=</span> <span class="n">gtsam_unstable</span><span class="p">.</span><span class="n">eqvio</span><span class="p">.</span><span class="n">State</span><span class="p">()</span>
<span class="n">xi_ref</span><span class="p">.</span><span class="n">cameraOffset</span> <span class="o">=</span> <span class="n">T_ci</span>
<span class="n">params</span> <span class="o">=</span> <span class="n">gtsam_unstable</span><span class="p">.</span><span class="n">eqvio</span><span class="p">.</span><span class="n">EqVIOFilterParams</span><span class="p">()</span>
<span class="nb">filter</span> <span class="o">=</span> <span class="n">gtsam_unstable</span><span class="p">.</span><span class="n">eqvio</span><span class="p">.</span><span class="n">EqVIOFilter</span><span class="p">(</span>
    <span class="n">xi_ref</span><span class="p">,</span> <span class="n">initial_covariance</span><span class="p">,</span> <span class="n">gtsam</span><span class="p">.</span><span class="n">KeyVector</span><span class="p">(),</span> <span class="n">params</span>
<span class="p">)</span>

<span class="nb">filter</span><span class="p">.</span><span class="n">initializeFromIMU</span><span class="p">(</span><span class="n">first_imu</span><span class="p">)</span>
<span class="k">for</span> <span class="n">imu_input</span><span class="p">,</span> <span class="n">dt</span> <span class="ow">in</span> <span class="n">imu_stream</span><span class="p">:</span>
    <span class="nb">filter</span><span class="p">.</span><span class="n">predict</span><span class="p">(</span><span class="n">imu_input</span><span class="p">,</span> <span class="n">dt</span><span class="p">)</span>
<span class="k">for</span> <span class="n">features</span><span class="p">,</span> <span class="n">R</span> <span class="ow">in</span> <span class="n">vision_stream</span><span class="p">:</span>  <span class="c1"># features: dict[int, np.ndarray(2,)]
</span>    <span class="nb">filter</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">features</span><span class="p">,</span> <span class="n">camera</span><span class="p">,</span> <span class="n">R</span><span class="p">)</span>
</code></pre></div></div>

<p>The full Python walkthrough lives <a href="https://borglab.github.io/AwesomeEqF/notebooks/eqvio-example/">here</a>, as a notebook on AwesomeEqF. Take a look!</p>

<p>This paper-to-code-to-notebook path is the main reason AwesomeEqF exists. Equivariant filtering papers often introduce useful geometry, but it can be hard to see how that geometry turns into a working estimator on data. AwesomeEqF is meant to close that gap by pairing the paper trail with GTSAM implementations and runnable examples, so a reader can move from the idea to a filter they can inspect, modify, and run.</p>

<h2 id="the-abc-eqf-attitude-bias-calibration">The ABC-EqF: Attitude, Bias, Calibration</h2>

<p>We also added a second example on the website. The “ABC-EqF” applies the same equivariant-filter design idea to attitude estimation with bias and calibration. The filter comes from <a href="https://arxiv.org/abs/2209.12038">Fornasier, Ng, Brommer, Böhm, Mahony, and Weiss</a>, whose paper covers equivariant filter design for attitude state estimation.</p>

<p>The ABC-EqF state stacks three attitude-estimation quantities:</p>

<ul>
  <li>attitude $R \in SO(3)$,</li>
  <li>gyroscope bias $b \in \mathbb{R}^3$,</li>
  <li>and a sensor calibration rotation $C \in SO(3)$ that aligns a reference direction sensor (e.g. magnetometer) with the body frame</li>
</ul>

<p>Note that the formulation generalizes to $N$ direction sensors with $n \leq N$ calibration states, so if there are more than 1 uncalibrated sensor, the last item in the state would be $SO(3)^n$.</p>

<p>The classical EKF treats bias and calibration as ordinary linear states tacked onto attitude, but the ABC-EqF instead uses the symmetry group</p>

\[\mathcal{G} = (SO(3) \ltimes \mathfrak{so}(3)) \times SO(3)^n\]

<p>so the attitude and gyro-bias live in a coupled semi-direct-product geometry (the first two terms) while the calibration rotation carries its own $SO(3)$ factor, where $n$ is the number of sensors with extrinsic calibration states to be estimated. The result is better linearization behavior, faster bias convergence, and an estimator whose consistency does not depend on the bias estimate being good.</p>

<p>In GTSAM this is implemented as the <a href="https://github.com/borglab/gtsam/blob/develop/gtsam_unstable/geometry/ABCEquivariantFilter.h"><code class="language-plaintext highlighter-rouge">ABCEquivariantFilter</code></a> in <code class="language-plaintext highlighter-rouge">gtsam_unstable</code>; there, the $(SO(3) \ltimes \mathfrak{so}(3))$ factor is represented using <code class="language-plaintext highlighter-rouge">Pose3</code>, leveraging the Lie-group isomorphism $(SO(3) \ltimes \mathfrak{so}(3)) \cong SE(3)$.</p>

<p>A complete C++ example lives at <a href="https://github.com/borglab/gtsam/blob/develop/examples/AbcEquivariantFilterExample.cpp"><code class="language-plaintext highlighter-rouge">AbcEquivariantFilterExample.cpp</code></a>, and the AwesomeEqF notebook <a href="https://borglab.github.io/AwesomeEqF/notebooks/abc-eqf-example/">here</a> walks through that code in Python with interactive plots for the attitude, bias, and calibration errors over time.</p>

<h2 id="takeaway">Takeaway</h2>

<p>The EqVIO and the ABC-EqF show that the EqF machinery from <a href="https://gtsam.org/2026/04/28/equivariant.html">Part 3</a> now reaches practical robotics estimators in GTSAM. The EqVIO filter is the most recent application, and it is now usable from Python through GTSAM.</p>

<p><a href="https://borglab.github.io/AwesomeEqF/">AwesomeEqF</a> is meant to grow with the field. If you have a paper, a notebook, or a write-up that fits, please open a pull request.</p>

<h2 id="further-reading">Further Reading</h2>

<ul>
  <li><a href="https://arxiv.org/abs/2205.01980">“EqVIO: An Equivariant Filter for Visual Inertial Odometry”</a>, van Goor and Mahony.</li>
  <li><a href="https://arxiv.org/abs/2209.12038">“Overcoming Bias: Equivariant Filter Design for Biased Attitude Estimation with Online Calibration”</a>, Fornasier, Ng, Brommer, Böhm, Mahony, and Weiss.</li>
  <li><a href="https://arxiv.org/abs/2407.14297">“Equivariant Symmetries for Aided Inertial Navigation”</a>, Fornasier (dissertation).</li>
  <li>AwesomeEqF site: <a href="https://borglab.github.io/AwesomeEqF/">borglab.github.io/AwesomeEqF</a>.</li>
  <li>GTSAM EqVIO source: <a href="https://github.com/borglab/gtsam/blob/develop/gtsam_unstable/navigation/EqVIOFilter.h"><code class="language-plaintext highlighter-rouge">gtsam_unstable/navigation/EqVIOFilter.h</code></a>.</li>
  <li>AwesomeEqF EqVIO notebook: <a href="https://borglab.github.io/AwesomeEqF/notebooks/eqvio-example/">EqVIO Example</a>.</li>
  <li>AwesomeEqF ABC-EqF notebook: <a href="https://borglab.github.io/AwesomeEqF/notebooks/abc-eqf-example/">ABC-EqF Example</a>.</li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[Authors: Rohan Bansal and Frank Dellaert GTSAM Contributors: Jennifer Oum, Darshan Rajasekaran (ABC) and Rohan Bansal (EqVIO). EqVIO paper authors: Pieter van Goor and Robert Mahony. ABC-EqF paper authors: Alessandro Fornasier, Yonhon Ng, Christian Brommer, Christoph Böhm, Robert Mahony, and Stephan Weiss.]]></summary></entry><entry><title type="html">The Manifold Kalman Filter Hierarchy, Part 3: Equivariant Filters</title><link href="http://gtsam.org/2026/04/28/equivariant.html" rel="alternate" type="text/html" title="The Manifold Kalman Filter Hierarchy, Part 3: Equivariant Filters" /><published>2026-04-28T00:00:00+00:00</published><updated>2026-04-28T00:00:00+00:00</updated><id>http://gtsam.org/2026/04/28/equivariant</id><content type="html" xml:base="http://gtsam.org/2026/04/28/equivariant.html"><![CDATA[<p><em>Authors</em>: <a href="https://dellaert.github.io/">Frank Dellaert</a> and <a href="https://rbansal.dev/">Rohan Bansal</a>.
<em>GTSAM Contributors</em>: Jennifer Oum, Darshan Rajasekaran, Alessandro Fornasier (on whose code our examples are based).</p>

<!-- - TOC -->

<p>Last week we zoomed out and talked about <a href="/2026/04/21/factor-graphs-and-world-models.html">STAG</a>: state, dynamics, measurements, objectives, and how factor graphs can tie those pieces together. We discussed fixed-lag smoothing, which optimizes over a short window of recent states using measurement factors. This week we zoom back in on single-state <em>filters</em>, specifically filters in which the state lives on a <strong>manifold</strong>.</p>

<p>In GTSAM, we now also provide an <strong>equivariant filter</strong>. The word <em>equivariant</em> has the same basic meaning here as it does in equivariant neural networks: if you transform the input, the output should transform in the corresponding way. In filtering, the payoff is not just elegance. If the dynamics and measurements respect the symmetry, the filter can express its error around a fixed reference state instead of around the current, possibly wrong, estimate.</p>

<p>This post is meant as a quick tutorial introduction for GTSAM users. The foundations were developed by Mahony, Hamel, and Trumpf in <a href="https://arxiv.org/abs/2006.08276">“Equivariant Systems Theory and Observer Design”</a>, and the main EqF reference is <a href="https://arxiv.org/abs/2010.14666">“Equivariant Filter (EqF)”</a> by van Goor, Hamel, and Mahony. An earlier short paper, <a href="https://arxiv.org/abs/2004.00828">“Equivariant Filter Design for Kinematic Systems on Lie Groups”</a> by Mahony and Trumpf, is also useful background.</p>

<h2 id="eqf-the-missing-piece-in-the-hierarchy">EqF: the Missing Piece in the Hierarchy</h2>

<p>This is the third post in the manifold Kalman filter hierarchy series. <a href="/2026/03/09/manifold-kf-part1.html">Part 1</a> introduced <code class="language-plaintext highlighter-rouge">ManifoldEKF</code>, <code class="language-plaintext highlighter-rouge">LieGroupEKF</code>, <code class="language-plaintext highlighter-rouge">InvariantEKF</code>, and <code class="language-plaintext highlighter-rouge">LeftLinearEKF</code>; <a href="/2026/03/17/legged-state-estimation-part2.html">Part 2</a> showed why invariant filtering matters in legged state estimation.</p>

<p>The <strong>Equivariant Filter (EqF)</strong> is the final missing piece. The <code class="language-plaintext highlighter-rouge">ManifoldEKF</code> can handle a broad range of manifold states, including <code class="language-plaintext highlighter-rouge">Unit3</code>, but its covariance propagation is tied to the current estimate because the transition Jacobian is computed in the tangent space at the current linearization point. A bad estimate can therefore give you a bad local error model. The <code class="language-plaintext highlighter-rouge">InvariantEKF</code> and <code class="language-plaintext highlighter-rouge">LeftLinearEKF</code> get the invariant-error behavior we like, where the propagated error can be much less dependent on the current estimate, but they assume the state itself is a Lie group.</p>

<p>The new <code class="language-plaintext highlighter-rouge">EquivariantFilter</code> fills the gap: it is an error-state Kalman filter where the physical state can live on a general manifold $\mathcal{M}$, while a separate symmetry group $\mathcal{G}$ acts on that state. The group action gives the filter an invariant-style error without requiring the state itself to be a group.</p>

<h2 id="a-simple-example">A Simple Example</h2>

<p>Imagine a robot carrying a gyroscope and a magnetometer. We want to estimate the direction of the magnetic field in the robot’s body frame. That direction is a unit vector</p>

\[\eta \in \mathbb{S}^2,\]

<p>with dynamics</p>

\[\dot{\eta} = -\Omega^\times \eta,\]

<p>and measurement</p>

\[y = c_m \eta.\]

<p>Here, $\Omega$ is the angular velocity measured by the gyroscope. The matrix $\Omega^\times$ is the cross-product matrix, so the dynamics say that the magnetic-field direction appears to rotate in the robot’s body frame as the robot turns. The measurement equation says the magnetometer observes that same direction, scaled by a constant magnetic-field strength $c_m$.</p>

<p><em>The important detail is that the state is not a group</em>. It is a point on the sphere:</p>

\[\mathcal{M} = \mathbb{S}^2.\]

<p>In GTSAM, that is a <code class="language-plaintext highlighter-rouge">Unit3</code>. You can perturb it locally with two tangent coordinates, but you cannot compose two directions and get another direction in the group-theoretic sense. So this is a natural state for <code class="language-plaintext highlighter-rouge">ManifoldEKF</code>, not for <code class="language-plaintext highlighter-rouge">InvariantEKF</code>.</p>

<p>However, rotations act on directions. The group</p>

\[\mathcal{G} = SO(3)\]

<p>moves points around on $\mathbb{S}^2$. In GTSAM terms, the physical state can be <code class="language-plaintext highlighter-rouge">Unit3</code>, while the symmetry group can be <code class="language-plaintext highlighter-rouge">Rot3</code>. This is exactly the kind of situation EqF is designed for: the state is not a group, but a group still acts on it.</p>

<h2 id="the-eqf-idea">The EqF Idea</h2>

<figure class="center" style="width: 100%; max-width: 900px;">
  <img src="/assets/images/equivariant/group-action-manifold.png" alt="A symmetry group hovering above a physical manifold, with red dynamics arrows from timestep k to k plus one and purple group-action arrows from the reference state to each estimate" style="width: 100%;" />
  <figcaption>EqF keeps the physical estimate on the manifold $\mathcal{M}$, while the lifted estimate evolves on the symmetry group $\mathcal{G}$. The dashed purple arrows show the group actions from the reference state to the estimates at <i>k</i> and <i>k+1</i>, and the dashed gray lift arrow maps the manifold dynamics to the corresponding group dynamics.</figcaption>
</figure>
<p><br /></p>

<p>There are three geometric objects in play. The physical state lives on a manifold $\mathcal{M}$, the symmetry lives in a group $\mathcal{G}$, and the group action</p>

\[\phi : \mathcal{G} \times \mathcal{M} \rightarrow \mathcal{M}\]

<p>tells us how a group element moves a state. For the sphere example, the state is a direction $\eta \in \mathbb{S}^2$, the group is $SO(3)$, and the action rotates the direction. This is the extra structure beyond <code class="language-plaintext highlighter-rouge">ManifoldEKF</code>: the state does not have to be a group, but there must be a useful group action on it.</p>

<p>Instead of storing the estimate only as a state $\hat{\xi}$ on the manifold, the EqF also stores a group element $\hat{g}$ and applies it to a fixed reference state $\xi^\circ$:</p>

\[\hat{\xi} = \phi(\hat{g}, \xi^\circ).\]

<p>In the sphere example, $\xi^\circ$ might be the north pole direction, and $\hat{g}$ is a rotation that moves that reference direction to the current estimate.</p>

<p>In the GTSAM implementation, the physical estimate is still an element of <code class="language-plaintext highlighter-rouge">M</code>, but EqF also maintains a group element <code class="language-plaintext highlighter-rouge">g_</code>; applying <code class="language-plaintext highlighter-rouge">g_</code> to <code class="language-plaintext highlighter-rouge">xi_ref_</code> recovers the current state estimate.</p>

<p>This also gives a natural error:</p>

\[e = \phi(\hat{g}^{-1}, \xi).\]

<p>If the estimate is correct, the error lands back at the fixed reference point:</p>

\[e = \xi^\circ.\]

<p>That fixed reference point is the key. In a usual manifold EKF, the tangent space and linearization move with the current estimate. In an <em>equivariant</em> filter, the symmetry action lets us express the error around a fixed origin. Equivariance is the consistency condition that makes this legitimate: moving the state by the symmetry and then applying the dynamics or measurement model must match applying the model first and then moving the result in the corresponding way. When that holds, covariance propagation is less tied to the filter’s current guess.</p>

<p>The runtime loop still looks like an EKF: predict the state, propagate covariance, compare predicted and observed measurements, compute a Kalman gain, and apply a correction. The difference is where the geometry enters. During prediction, the <strong>lift</strong> $\Lambda$ converts physical dynamics into a small motion in the group. In the attitude-direction example, the gyroscope moves the group estimate, and the direction estimate follows from the group action. During update, the Kalman correction is lifted back through the group instead of directly nudging arbitrary coordinates on the sphere.</p>

<h2 id="the-gtsam-template">The GTSAM Template</h2>

<p>The generic implementation lives in <a href="https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/EquivariantFilter.h"><code class="language-plaintext highlighter-rouge">gtsam/navigation/EquivariantFilter.h</code></a>. It is templated on $\mathcal{M}$, the physical manifold state type, and <code class="language-plaintext highlighter-rouge">Symmetry</code>, the functor that defines the group action. The class inherits from <code class="language-plaintext highlighter-rouge">ManifoldEKF&lt;M&gt;</code>, so it reuses the same covariance, Kalman gain, and Joseph-form update machinery from the base hierarchy.</p>

<p>Importantly, the covariance has the dimension of <code class="language-plaintext highlighter-rouge">M</code>, not the dimension of <code class="language-plaintext highlighter-rouge">Symmetry::Group</code>: the group is not replacing the physical state with a larger Kalman state. It is used to transport the estimate and corrections in a way that respects the symmetry. The EqF-specific part is the additional symmetry bookkeeping:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">Symmetry::Group</code> is the internal group $\mathcal{G}$</li>
  <li><code class="language-plaintext highlighter-rouge">xi_ref_</code> is the fixed reference state $\xi^\circ$</li>
  <li><code class="language-plaintext highlighter-rouge">g_</code> is the lifted group estimate</li>
  <li><code class="language-plaintext highlighter-rouge">act_on_ref_(g_)</code> recovers the current manifold estimate</li>
  <li><code class="language-plaintext highlighter-rouge">Dphi0_</code> maps group tangent perturbations down to manifold tangent perturbations</li>
  <li><code class="language-plaintext highlighter-rouge">InnovationLift_</code> maps the EKF innovation back up to the group tangent space</li>
</ul>

<p>So, you need to provide more structure than a plain <code class="language-plaintext highlighter-rouge">ManifoldEKF</code>: the physical state type, the <code class="language-plaintext highlighter-rouge">Symmetry</code> action, the lift from physical dynamics to group motion, the input and output actions needed for equivariance, and the usual process and measurement noise models. The payoff is that the filter is using the geometry of the problem rather than an arbitrary local coordinate choice.</p>

<p>The EqF is worth considering when all three of these are true:</p>

<ol>
  <li>Your state lives naturally on a manifold that is not necessarily a group.</li>
  <li>A Lie group acts on that state in a meaningful way.</li>
  <li>You care about the invariant-filter benefit: error and covariance propagation that are less dependent on the current estimate being right.</li>
</ol>

<p>If the state is just a generic manifold with no useful symmetry, <code class="language-plaintext highlighter-rouge">ManifoldEKF</code> is the right abstraction. If the state is a Lie group and the dynamics have the invariant form, <code class="language-plaintext highlighter-rouge">InvariantEKF</code> or <code class="language-plaintext highlighter-rouge">LeftLinearEKF</code> might be simpler.</p>

<h2 id="takeaway">Takeaway</h2>

<p>The <code class="language-plaintext highlighter-rouge">EquivariantFilter</code> is a natural next step after the hierarchy in Part 1 and the invariant-filter application in Part 2. We now have a better answer for states such as directions on a sphere: keep the state on the physical manifold, but let a symmetry group push that state around. That gives GTSAM users a way to model states that are not groups <em>without</em> giving up on invariant filtering.</p>

<h2 id="further-reading">Further Reading</h2>

<ul>
  <li><a href="https://arxiv.org/abs/2006.08276">“Equivariant Systems Theory and Observer Design”</a>, Mahony, Hamel, and Trumpf</li>
  <li><a href="https://arxiv.org/abs/2010.14666">“Equivariant Filter (EqF)”</a>, van Goor, Hamel, and Mahony</li>
  <li><a href="https://arxiv.org/abs/2004.00828">“Equivariant Filter Design for Kinematic Systems on Lie Groups”</a>, Mahony and Trumpf</li>
  <li><a href="https://arxiv.org/abs/2209.12038">“Overcoming Bias: Equivariant Filter Design for Biased Attitude Estimation with Online Calibration”</a>, Fornasier, Ng, Brommer, Böhm, Mahony, and Weiss. This is the ABC paper that directly inspired the GTSAM ABC example.</li>
  <li>GTSAM EqF test: <a href="https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/tests/testEquivariantFilter.cpp"><code class="language-plaintext highlighter-rouge">testEquivariantFilter.cpp</code></a></li>
  <li>A more complicated ABC EqF example in GTSAM: <a href="https://github.com/borglab/gtsam/blob/develop/examples/AbcEquivariantFilterExample.cpp">Example</a>, <a href="https://github.com/borglab/gtsam/blob/develop/gtsam_unstable/geometry/ABCEquivariantFilter.h">Filter</a></li>
</ul>

<p><em>Disclosure: AI was used to help draft this post.</em></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Authors: Frank Dellaert and Rohan Bansal. GTSAM Contributors: Jennifer Oum, Darshan Rajasekaran, Alessandro Fornasier (on whose code our examples are based).]]></summary></entry></feed>