Concept · 1 paper · updated 2026-11-03
Rotation averaging
Rotation averaging estimates one absolute rotation per camera from noisy pairwise relative rotations, by a robust least-metric fit over the view graph. Global structure-from-motion uses it before positioning. One paper so far: GLOMAP uses Chatterjee et al.'s scalable solver and names rotation-averaging collapse on symmetric structure as its main failure source. Other solvers are not covered.
structure-from-motioncamera-poseoptimizationrobust-estimation
Markdown3 min read
AI-compiled overview, updated 2026-11-03, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
Overview
Given a set of cameras and a relative rotation for each pair that has a verified two-view geometry, rotation averaging looks for one absolute rotation per camera such that the relative rotations are as consistent as possible. The objective is a sum over pairs of a robust distance between each measured relative rotation and the one implied by the absolute rotations 2407.20219 §2.2 eq. 1.
The inputs are pairwise relative rotations on the view graph, which come from two-view geometry after correspondence search and calibration 2407.20219 §3.5. The output feeds the next stage: in global structure-from-motion the rotations are held fixed while camera centres and 3D points are solved, so rotation errors pass straight into the positions 2407.20219 §3.2.
\arg\min_{R} \sum_{i,j} \rho\left( d\left( R_j^\top R_{ij} R_i, I \right)^p \right) eq. 1
Here R_i are the absolute rotations, R_{ij} the measured relative rotation for pair (i, j), d a distance on rotations, p an exponent and \rho a robust loss 2407.20219 §2.2 eq. 1.
Variants
Robust least-metric average with a scalable solver
This is the only variant documented so far. The objective is eq. 1 above. The paper solves it with Chatterjee et al.'s scalable approach, implemented by the authors 2407.20219 §2.2. The authors' code defaults to a stratified form of that solver. The card records this as a code default, not a paper statement Card: GLOMAP. Edges are then filtered by how far their relative rotation disagrees with the solved rotations, and the solve runs again on the kept edges 2407.20219 §3.5.
Reported behaviour: the results the card records are end-to-end pipeline scores on ETH3D, LaMAR, IMC 2023 and MIP360, not scores for the rotation step on its own 2407.20219 §4. The authors name failures of rotation averaging on symmetric structure as the main cause of error 2407.20219 §4.4. In the ETH3D DSLR exhibition-hall scene, the GLOMAP score at 1° is 25.5 against 85.4 for COLMAP 2407.20219 tab. 3. The table does not isolate the rotation step, so the gap is not proof that the solver alone caused it.
Other solvers
No card in this wiki covers another rotation-averaging method. Their trade-offs are not described here.
When to use which
| Situation | Use | Why |
|---|---|---|
| Global SfM on unordered photos with good pairwise rotations | Robust least-metric average, as in GLOMAP | Rotations are needed before a global positioning step, and the paper reports results on par with or above COLMAP on average 2407.20219 §2.2 2407.20219 §3.5 2407.20219 tab. 5 2407.20219 tab. 6 |
| Scene with repeated or symmetric structure | Check the result against an incremental pipeline before trusting it | The authors name rotation-averaging collapse on symmetric structure as the main failure, and their own table shows COLMAP ahead on one such scene 2407.20219 §4.4 2407.20219 tab. 3 |
| Nearly co-linear camera motion, e.g. video | The rotation step still applies, but translation averaging is avoided | Translation averaging is degenerate for co-linear motion, which is the reason the paper drops it 2407.20219 §1 2407.20219 §2.2 |
| Intrinsics unknown | Calibrate the view graph before averaging | The pipeline updates intrinsics first, then estimates relative poses and rotations; uncalibrated cameras get half weight in positioning 2407.20219 §3.5 2407.20219 §3.2 |
Only the GLOMAP row has direct support in the wiki. No other solver is compared here, so this table does not rank rotation averaging against alternatives.
Implementation sketch
Our own pseudocode of the pipeline step, with the paper's two-pass filter. The paper does not state the filter threshold; the code default is noted in the comment 2407.20219 §3.5.
# Robust rotation averaging with edge filtering [arxiv:2407.20219 §2.2] [§3.5]
# Input: pairs (i, j) with measured relative rotation R_ij
# Output: absolute rotations R_i, one per camera
def average_rotations(pairs, max_angle_deg):
# 1. Solve the robust objective over all edges [arxiv:2407.20219 eq. 1]
rotations = solve_robust_average(pairs)
# 2. Drop edges that disagree with the solution [arxiv:2407.20219 §3.5]
# the paper gives no threshold; the code default is 10 degrees
kept = []
for (i, j, R_ij) in pairs:
residual = rotations[j].T @ R_ij @ rotations[i]
if angle_of(residual) <= max_angle_deg:
kept.append((i, j, R_ij))
# 3. Solve again on the kept edges [arxiv:2407.20219 §3.5]
return solve_robust_average(kept)Notes: solve_robust_average stands for any solver of eq. 1; the card names
Chatterjee et al.'s method, and the code's stratified default is recorded on
the card. Keep the filter threshold as a parameter, because the paper leaves
it open.
Contradictions
None between papers, since only one paper cites this concept. Within the GLOMAP paper, the code has a comment saying rotation averaging runs three times, while the code runs one filtering pass and a final pass; this is recorded on the card as a code-level mismatch, not a disagreement between papers Card: GLOMAP.
Papers
- Global Structure-from-Motion Revisited: GLOMAP. Uses a robust least-metric rotation average, with Chatterjee et al.'s solver, as the first solve of its global pipeline; reports failures on symmetric structure.
Source and license
Compiled from the papers listed on this page, all published under CC BY, CC BY-SA or CC0, with citations. See each paper's page for its authors and license.