---
kind: concept
slug: rotation-averaging
title: Rotation averaging
summary: >-
  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.
tags: [structure-from-motion, camera-pose, optimization, robust-estimation]
papers: ["2407.20219"]
related: [multi-view-reconstruction, bundle-adjustment, pose-graph-optimization, unit-quaternion-rotation, outlier-rejection]
status: draft
updated_at: 2026-11-03
---

## 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 [arxiv: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 [arxiv: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 [arxiv: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 [arxiv: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 [arxiv: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](/papers/2407.20219). Edges are then filtered by how far
their relative rotation disagrees with the solved rotations, and the solve runs
again on the kept edges [arxiv: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
[arxiv:2407.20219 §4].
The authors name failures of rotation averaging on symmetric structure as the
main cause of error [arxiv:2407.20219 §4.4]. In the ETH3D DSLR exhibition-hall
scene, the GLOMAP score at 1° is 25.5 against 85.4 for COLMAP [arxiv: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 [arxiv:2407.20219 §2.2] [arxiv:2407.20219 §3.5] [arxiv:2407.20219 tab. 5] [arxiv: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 [arxiv:2407.20219 §4.4] [arxiv: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 [arxiv:2407.20219 §1] [arxiv: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 [arxiv:2407.20219 §3.5] [arxiv: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 [arxiv: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/2407.20219).

## Papers

- [Global Structure-from-Motion Revisited](/papers/2407.20219): 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.
