wikillm

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

SituationUseWhy
Global SfM on unordered photos with good pairwise rotationsRobust least-metric average, as in GLOMAPRotations 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 structureCheck the result against an incremental pipeline before trusting itThe 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. videoThe rotation step still applies, but translation averaging is avoidedTranslation averaging is degenerate for co-linear motion, which is the reason the paper drops it 2407.20219 §1 2407.20219 §2.2
Intrinsics unknownCalibrate the view graph before averagingThe 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.

Pseudocode
# 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.