A Micro Lie Theory for State Estimation

An engineer's walk-through of Solà, Deray & Atchuthan (2018), “A micro Lie theory for state estimation in robotics”, arXiv:1812.01537
The problem this paper solves. Every state estimator — Kalman filter, factor graph, least squares — is built from additions, subtractions, means, covariances and derivatives. Those operations are only defined in vector spaces. But the states we care about (orientations, poses) are not vectors: a rotation matrix has 9 entries and 3 degrees of freedom, and two rotations don't add. Lie theory gives you a rigorous replacement for + and − on curved state spaces, so every estimator you already know keeps working — with + swapped for a curved-space equivalent. The paper strips Lie theory down to exactly that working set (“micro”), and this page walks through it.
CONTENTS
  1. Why vector math breaks (S¹ example)
  2. Lie groups: manifold + group
  3. Tangent spaces and the Lie algebra
  4. Exp and Log: the wrap/unwrap maps
  5. Plus and minus: the new + and −
  6. The adjoint: local ↔ global
  7. Jacobians on manifolds
  8. Uncertainty and covariance
  9. Discrete integration (gyros)
  10. Estimation: ESKF and graph optimization
  11. The big picture & cheat sheet

1 · Why vector-space math breaks on rotations

Motivation. Before touching any theory, look at the smallest rotation group there is: the circle. If the naive operations fail here — where you can see the failure — they will fail in 3D where you can't.

A 2D orientation is a point \(z\) on the unit circle \(S^1\) (a unit complex number). Say your compass reads \(350^\circ\) and \(10^\circ\) and you want the mean heading. The arithmetic mean gives \((350+10)/2 = 180^\circ\) — pointing exactly the wrong way. The true mean, \(0^\circ\), is the midpoint of the short arc, not of the angle readings.

Circular vs naive averaging on the unit circle
Fig. 1 — The wrap-around problem. The circle is curved: there is no globally consistent way to “add two headings”. \(350^\circ\) and \(10^\circ\) are only \(20^\circ\) apart on the manifold, but \(340^\circ\) apart as numbers. Any estimator that treats headings as scalars inherits this failure.

The failure generalizes: a 3D orientation is a \(3\times3\) matrix with 9 entries constrained by \(R^\top R = I\). What is the mean of two such matrices? The covariance of a 9-entry vector that really has 3 degrees of freedom? The derivative of \(Rp\) with respect to \(R\)? None of these questions has an answer inside linear algebra — which is exactly the gap Lie theory fills.

DEMO 1 Circular mean vs arithmetic mean (drag the sliders)

arithmetic mean:
circular mean (midpoint of short arc):

Push A and B to opposite sides (e.g. \(120^\circ\)/\(300^\circ\)): the two unit vectors cancel and even the circular mean becomes undefined — the manifold keeps you honest about what is and isn't knowable.

Takeaway. Estimation needs +, −, means, covariances and derivatives; on curved state spaces these must be re-invented — that re-invention is the whole paper.

2 · Lie groups: a smooth manifold that is also a group

Motivation. We need two properties at once. The manifold property encodes “my state satisfies constraints” (unit norm, orthogonality) and gives us a flat place to do calculus. The group property encodes “states compose” (pose \(A\) followed by pose \(B\)) and gives inverses and an origin. Neither alone is enough.

A smooth manifold \(\M\) is a curved but edge- and spike-free surface embedded in a higher-dimensional space: locally it looks like a flat \(\mathbb{R}^m\) — the unit sphere, the set of orthogonal matrices. The dimension \(m\) is the number of degrees of freedom of the state. A group \((\G, \circ)\) is a set with a composition \(\circ\) satisfying, for \(X, Y, Z \in \G\):

$$ \begin{aligned} \text{Closure:} &&& X \circ Y \in \G \\ \text{Identity } E: &&& E \circ X = X \circ E = X \\ \text{Inverse } X^{-1}: &&& X^{-1} \circ X = X \circ X^{-1} = E \\ \text{Associativity:} &&& (X \circ Y) \circ Z = X \circ (Y \circ Z) \end{aligned} \eqtag{(1–4)} $$

A Lie group is a set that is both. In robotics the composition law is matrix (or quaternion/complex) multiplication, and each axiom is something you already rely on: closure — composing two poses gives a pose; inverse — \(X^{-1}\) is the relative pose “from the body back to the world”; identity — the origin frame.

Each group also acts on other objects: \(X \cdot v\) rotates a vector (\(\SO(3)\)), or moves a point (\(\SE(3)\): \(X\cdot p = Rp + t\)). Estimation residuals are always built from actions, e.g. “where should the beacon appear in my camera” is \(X^{-1}\cdot b\).

group \(\M, \circ\)element \(X\)constraintdim \(m\)action \(X\cdot v\)
\(\mathbb{R}^n, +\)\(v \in \mathbb{R}^n\)— (trivial)\(n\)\(v + x\)
\(S^1, \cdot\)unit complex \(z\)\(z^*z = 1\)1\(zx\) (rotate in plane)
\(\SO(2), \cdot\)\(2\times2\) rotation matrix\(R^\top R = I\)1\(Rx\)
\(S^3, \cdot\)unit quaternion \(q\)\(q^*q = 1\)3\(qxq^*\)
\(\SO(3), \cdot\)\(3\times3\) rotation matrix\(R^\top R = I\)3\(Rx\)
\(\SE(3), \cdot\)\(\begin{bmatrix}R & t\\ 0 & 1\end{bmatrix}\)\(R^\top R = I\)6\(Rp + t\)
Takeaway. A Lie group is exactly the algebraic home of a “constrained state that composes”: the manifold supplies the constraints and a place for calculus, the group supplies composition, inversion and the origin.

3 · Tangent spaces and the Lie algebra

Motivation. If the state lives on a curved surface, where do velocities, perturbations and uncertainties live? They can't live on the surface — a velocity is not an orientation. The manifold's smoothness hands us the answer: at every point \(X\) there is a flat tangent space \(\TR{X}\), a vector space of the same dimension \(m\) as the manifold, hugging the surface at \(X\).

Concretely: let \(X(t)\) be any smooth path on \(\M\) through \(X\). Its velocity \(\dot{X} = \partial X/\partial t\) lies in \(\TR{X}\) — a velocity is a direction you could leave \(X\) in, and all such directions form the tangent plane.

Sphere with tangent plane at X
Fig. 2 — Tangent space. The state \(X\) moves on the manifold \(\M\) (here a sphere — drawn because it can be drawn; the real rotation group lives in higher dimensions). The red plane is \(\TR{X}\): a flat vector space where increments \(\delta\), velocities and covariances live. The green arc is where the state actually goes.

3.1 · The Lie algebra \(\mf = T_E\M\)

Motivation. Every point's tangent space is a different plane, but — because the group looks the same everywhere — they are all copies of one flat space. It pays to nominate one representative: the tangent space at the identity \(E\). That space is the Lie algebra, noted \(\mf\). All calculus (derivatives, covariances) will ultimately be done in \(\mf\) or \(\mathbb{R}^m\), then carried to wherever it's needed.

$$ \mf \;,=\; T_E\M \eqtag{(8)} $$

Why does \(\mf\) have the structure it has? Differentiate the group constraint at the identity. For \(\SO(3)\), the constraint \(R^\top R = I\) gives \(R^\top\dot{R} + \dot{R}^\top R = 0\), i.e. \(R^\top\dot R\) equals the negative of its own transpose — it is skew-symmetric:

$$ \sk{\omega} = \begin{bmatrix} 0 & -\omega_z & \omega_y \\ \omega_z & 0 & -\omega_x \\ -\omega_y & \omega_x & 0 \end{bmatrix} \in \mathfrak{so}(3), \qquad \dot{R} = R\,\sk{\omega}. $$

Skew matrices are 3-dimensional, so \(m = 3\): the 9 entries of \(R\) really carry 3 DoF, as promised. Any \(\sk{\omega}\) is a linear combination \(\omega_x E_x + \omega_y E_y + \omega_z E_z\) of three generator matrices, so \(\mathfrak{so}(3)\) is secretly just \(\mathbb{R}^3\). We make this identification with two mutually inverse linear maps (the paper's Figs. 5–6):

$$ \text{hat}: \quad \mathbb{R}^3 \to \mathfrak{so}(3); \quad \omega \mapsto \omega^\wedge = \sk{\omega} \qquad\quad \text{vee}: \quad \mathfrak{so}(3) \to \mathbb{R}^3; \quad \sk{\omega} \mapsto \omega^\vee = \omega \eqtag{(10–11)} $$

From here on the paper (and this page) works with the Cartesian representatives \(\tau \in \mathbb{R}^m\) rather than with \(\tau^\wedge \in \mf\): vectors stack into state vectors, and all the operators below (\(\oplus, \ominus, \Ad\), Jacobians, covariances) are ordinary matrices over \(\mathbb{R}^m\). Nothing is lost — \(\mf \cong \mathbb{R}^m\).

Takeaway. Velocities, perturbations and uncertainties are not states — they are tangent vectors; and all tangent spaces are copies of one flat space, the Lie algebra \(\mf \cong \mathbb{R}^m\), which is where calculus is legal.

4 · Exp and Log: wrapping the tangent onto the manifold

Motivation. We now have flat increments \(\tau\) in the tangent space and curved states \(X\) on the manifold. We need a map between them that is exact (not a linearization), so that a small tangent increment is an honest state update. It comes free from the group's own kinematics.

Take the velocity relation \(\dot X = X\,v^\wedge\) with constant body velocity \(v\) (for \(\SO(3)\): constant angular velocity). This is a linear ODE, and linear ODEs are solved by the matrix exponential:

$$ X(t) = X(0)\,\exp(v^\wedge t) \qquad\text{with}\qquad \exp(\tau^\wedge) \;=\; E + \tau^\wedge + \tfrac{1}{2!}{\tau^\wedge}^2 + \tfrac{1}{3!}{\tau^\wedge}^3 + \cdots \eqtag{(13, 16)} $$

Geometrically, \(\exp\) wraps the straight tangent vector around the manifold along the geodesic — like winding a string around a ball (the paper's Fig. 1). Its inverse \(\log\) unwraps. Because the map is exact, every group element has a unique-ish tangent representation: \(X = \exp(\Log(X)^\wedge)\).

4.1 · Worked derivation: Rodrigues' formula for \(\SO(3)\)

Motivation. The infinite series becomes useful only when it collapses to a closed form. For \(\SO(3)\) the collapse is a beautiful one-liner worth seeing once.

Write \(\tau = \theta u\) with unit axis \(u\) and angle \(\theta\). The powers of \(\sk{u}\) cycle, using \(\sk{u}\,\sk{u} = uu^\top - I\) (expand and use \(u^\top u = 1\)):

$$ \sk{u}^0 = I,\quad \sk{u}^1 = \sk{u},\quad \sk{u}^2 = uu^\top - I,\quad \sk{u}^3 = -\sk{u},\quad \sk{u}^4 = -\sk{u}^2,\ \ldots $$

so the series splits into even terms (multiples of \(I\), forming the cosine series) and odd terms (multiples of \(\sk u\), forming the sine series):

$$ \boxed{\;R = \Exp(\theta u) = I + \sin\theta\,\sk{u} + (1-\cos\theta)\,\sk{u}^2\;} \eqtag{\text{Rodrigues}} $$

The same trick (with a factor 2 from the double cover, since \(q\) and \(-q\) are the same rotation) gives the unit quaternion \(q = \cos(\theta/2) + u\sin(\theta/2)\). For \(\SE(n)\) a translation block appears, handled by a matrix \(V(\theta)\) — see the cheat sheet in §11.

4.2 · Capitalized \(\Exp\) / \(\Log\): straight to \(\mathbb{R}^m\)

Motivation. We decided to live in \(\mathbb{R}^m\), so compose hat with exp into one shortcut (paper eqs. 21–24):

$$ \Exp : \mathbb{R}^m \to \M; \quad \tau \mapsto X = \Exp(\tau) \,=\, \exp(\tau^\wedge) \qquad\qquad \Log : \M \to \mathbb{R}^m; \quad X \mapsto \tau = \Log(X) \,=\, \log(X)^\vee $$

Three properties of \(\exp\) do heavy lifting later. The first two say the exponential is a homomorphism along a line; the third is the conjugation rule — verifiable by expanding the series and watching all the \(X^{-1}X\) pairs cancel to 1:

$$ \exp((t+s)\tau^\wedge) = \exp(t\tau^\wedge)\exp(s\tau^\wedge), \qquad \exp(-\tau^\wedge) = \exp(\tau^\wedge)^{-1}, \qquad \exp\!\left(X\tau^\wedge X^{-1}\right) = X\exp(\tau^\wedge)X^{-1} \eqtag{(17, 19, 20)} $$
Takeaway. \(\Exp\) converts a tangent increment into an exact state update by wrapping it along the geodesic; \(\Log\) inverts it. All further machinery is built from these two maps plus composition.

5 · Plus and minus: the replacement for + and −

Motivation. With \(\Exp\), \(\Log\) and \(\circ\) we can finally define the operators the whole estimation machinery runs on. The design goal: make \(X \oplus \tau\) behave like \(x + \delta\) does in vector spaces — go from a state to a nearby state, and back.

$$ \text{right-}\oplus: \;\; Y = X \oplus {}^{X}\tau \;,=\; X \circ \Exp({}^{X}\tau) \qquad\qquad \text{right-}\ominus: \;\; {}^{X}\tau = Y \ominus X \;,=\; \Log\!\left(X^{-1} \circ Y\right) \eqtag{(25, 26)} $$

Read \(\ominus\) as “the increment that takes \(X\) to \(Y\)”, expressed in the tangent space at \(X\). Because composition is not commutative, there are also left versions, \({}^{E}\tau \oplus X = \Exp({}^{E}\tau)\circ X\) and \({}^{E}\tau = Y \ominus X = \Log(Y \circ X^{-1})\), where the increment lives at the identity instead. The superscript keeps track of the reference frame: \({}^{X}\tau\) is a local increment (expressed in \(X\)'s own frame), \({}^{E}\tau\) is a global increment (expressed in the origin frame). The paper's default — and ours — is right/local.

\(E\) (identity)
\(X\)
\(Y = X \oplus {}^{X}\delta\)
\({}^{X}\delta \in \TR{X}\) (local)
\(\Exp\) wraps \(\delta\) along the geodesic
\({}^{E}\delta = \Ad_X\, {}^{X}\delta\)
\(\mf = T_E\M\) (global)
\(\M\) (the manifold)
Fig. 3 — The \(\oplus\) / \(\ominus\) / \(\Ad\) landscape (after the paper's Figs. 6–7). Right-\(\oplus\) wraps a local tangent increment onto the manifold; right-\(\ominus\) is its inverse. The orange arrow is §6: the adjoint carries the same increment between the local tangent at \(X\) and the global tangent at \(E\). Going the left-\(\oplus\) route, \(\Exp({}^E\delta)\circ X\), lands on the same \(Y\) — which is what forces the two increments to be related by \(\Ad_X\).
Takeaway. \(X \oplus \tau = X\circ\Exp(\tau)\) and \(\tau = Y \ominus X = \Log(X^{-1}\circ Y)\) are exact curved-space replacements for \(+\) and \(−\); every estimator operation will be rewritten in terms of them.

6 · The adjoint: carrying increments between frames

Motivation. Sensors and filters disagree about where “here” is: a gyro reports increments in the body frame (local), a SLAM optimizer may want them in the world frame (global). Since both tangent spaces are copies of \(\mathbb{R}^m\), the transfer must be a linear map — the adjoint.

Composing the same two increments in the two orders must land on the same point: \(\Exp({}^{E}\tau)\circ X = X \circ \Exp({}^{X}\tau)\). Apply the conjugation rule (20) on the left and match exponents:

$$ \exp({}^{E}\tau^\wedge) = X\exp({}^{X}\tau^\wedge)X^{-1} = \exp\!\left(X\,{}^{X}\tau^\wedge X^{-1}\right) \;\;\Longrightarrow\;\; {}^{E}\tau^\wedge = X\,{}^{X}\tau^\wedge X^{-1} $$

Definition and matrix form (vee of both sides), for \(\tau \in \mathbb{R}^m\):

$$ \Ad_X : \mf \to \mf; \quad \Ad_X(\tau^\wedge) = X\tau^\wedge X^{-1} \qquad\Longrightarrow\qquad {}^{E}\tau = \Ad_X\,{}^{X}\tau, \qquad \Ad_X\,\tau = \left(X\,\tau^\wedge X^{-1}\right)^\vee \eqtag{(29–31)} $$

Two cases you will use constantly:

$$ \SO(3):\quad \Ad_R = R \qquad\qquad \SE(3):\quad \Ad_{M} = \begin{bmatrix} R & \sk{t}R \\ 0 & R \end{bmatrix} \eqtag{(139, 175)} $$

The \(\SO(3)\) case is a one-liner: \(R\sk{\theta}R^{-1} = \sk{R\theta}\) (rotating a skew matrix rotates its axis), and vee-ing gives \(R\theta\). For \(\SE(3)\), expanding \(M\tau^\wedge M^{-1}\) and using \(\sk{a}\,\sk{b} - \sk{b}\,\sk{a} = \sk{a \times b}\) produces the coupling block \(\sk t R\): in pose increments, translation and rotation leak into each other when you change frames — exactly the cross-term you'd expect. Three properties to remember (paper eqs. 32–34):

$$ X \oplus \tau = (\Ad_X\,\tau) \oplus X, \qquad \Ad_{X^{-1}} = \Ad_X^{-1}, \qquad \Ad_{X\circ Y} = \Ad_X\,\Ad_Y \eqtag{(32–34)} $$

The first is the local-to-global dictionary as a formula; the last says adjoints compose like the states do.

Takeaway. \(\Ad_X\) is the change-of-frame matrix for tangent increments; it is to \(\oplus\)-increments what \(R\) is to point vectors, and it will convert covariances between frames in §8.

7 · Jacobians on manifolds

Motivation. An EKF needs \(\partial(\text{measurement})/\partial(\text{state})\); Gauss–Newton needs \(\partial(\text{residual})/\partial(\text{state})\); covariance propagation needs \(\partial(\text{next state})/\partial(\text{current state})\). The catch: “\(\partial f/\partial X\)” is not defined when \(X\) is a rotation matrix — you can't subtract two rotations. The fix is to write the derivative exactly as in vector spaces, but with all variations expressed in tangent spaces via \(\oplus\) and \(\ominus\).

7.1 · The right Jacobian of a function

Replace \(+\) by \(\oplus\) and \(−\) by \(\ominus\) in the standard limit definition. For \(f: \M \to \mathcal{N}\):

$$ \frac{{}^{X}\D f(X)}{\D X} \;,=\; \lim_{\tau \to 0} \frac{f\left(X \oplus {}^{X}\tau\right) \ominus f(X)}{\tau} \;=\; \lim_{\tau \to 0} \frac{\Log\!\left(f(X)^{-1}\circ f(X\circ\Exp(\tau))\right)}{\tau} \;\in\; \mathbb{R}^{n\times m} \eqtag{(41)} $$

Unpack it once, slowly. The numerator perturbs the state along tangent direction \(\tau\), runs \(f\), and measures the result's change as a tangent vector at \(f(X)\) — both \(\ominus\) operations are exact. Dividing the vector \(\Log(\cdot) \in \mathbb{R}^n\) by the scalar magnitude of \(\tau\) and taking the limit is the ordinary directional derivative. What you get is a plain \(n \times m\) matrix \(J\) mapping local tangents at \(X\) to local tangents at \(f(X)\), satisfying the familiar linearized prediction:

$$ f(X \oplus {}^{X}\tau) \;\longrightarrow\; f(X) \oplus \frac{{}^{X}\D f(X)}{\D X}\,\tau \qquad (\tau \to 0) \eqtag{(43)} $$

And because the definition mirrors the vector-space one, the chain rule reads exactly as always — for \(Z = g(f(X))\):

$$ \frac{{}^{X}\D Z}{\D X} = \frac{{}^{Y}\D Z}{\D Y}\;\frac{{}^{X}\D Y}{\D X} \eqtag{(58)} $$

7.2 · The elementary blocks (build everything else from these)

Motivation. Any estimator function is a composition of a handful of primitives: inverse, composition, \(\Exp\), and the group action. Compute each primitive's Jacobian once, chain them forever after. Each one falls out of the limit definition (41); here is one worked in full, the rotation action on a point — because it's the residual of half the registration problems in robotics:

$$ \frac{{}^{R}\D(R\,p)}{\D R} = \lim_{\theta \to 0} \frac{(R \oplus \theta)\,p \ominus R\,p}{\theta} = \lim_{\theta \to 0} \frac{R\Exp(\theta)p - Rp}{\theta} = \lim_{\theta \to 0} \frac{R\sk{\theta}p}{\theta} = -R\sk{p} \eqtag{(150)} $$

using \(\Exp(\theta) \approx I + \sk\theta\) for small \(\theta\) and \(\sk{\theta}p = -\sk p\,\theta\). The full block library:

function \(f\)Jacobianformulapaper
inverse \(X^{-1}\)\(\dfrac{{}^{X}\D X^{-1}}{\D X}\)\(-\Ad_X\)(62)
composition in \(X\): \(X \circ Y\)\(\dfrac{{}^{X}\D(X\circ Y)}{\D X}\)\(\Ad_{Y^{-1}}\)(65)
composition in \(Y\): \(X \circ Y\)\(\dfrac{{}^{Y}\D(X\circ Y)}{\D Y}\)\(I\)(66)
exponential \(\Exp(\tau)\)\(\Jr(\tau) = \dfrac{\D\Exp(\tau)}{\D\tau}\)closed form below(67)
Log map \(\Log(X)\)\(\dfrac{\D\Log(X)}{\D X}\)\(\Jr^{-1}(\tau),\ \tau=\Log X\)(79)
action on points: \(R\,p\)\(\dfrac{{}^{R}\D(Rp)}{\D R}\ /\ \dfrac{\D(Rp)}{\D p}\)\(-R\sk{p}\ \ /\ \ R\)(150–151)

The only nontrivial block is the Jacobian of the exponential map itself, \(\Jr(\tau)\) — “how does the wrapped point move when I bend the tangent vector?”. For \(\SO(3)\) it has the closed form (with \(\Jl = \Jr^{\top}\), and both \(\to I\) as \(\tau \to 0\)):

$$ \Jr(\theta) = I - \frac{1-\cos\theta}{\theta^2}\sk{\theta} + \frac{\theta - \sin\theta}{\theta^3}\sk{\theta}^2 \eqtag{(143)} $$ $$ \Jr^{-1}(\theta) = I + \frac{1}{2}\sk{\theta} + \left(\frac{1}{\theta^2} - \frac{1}{2\theta}\cot\frac{\theta}{2}\right)\sk{\theta}^2 \eqtag{(144)} $$

It is used through three approximation rules — worth memorizing, they appear in every derivation (EKF prediction, IMU preintegration, covariances):

$$ \Exp(\tau + \delta\tau) \approx \Exp(\tau)\Exp\!\left(\Jr(\tau)\,\delta\tau\right), \qquad \Log\!\left(\Exp(\tau)\Exp(\delta\tau)\right) \approx \tau + \Jr^{-1}(\tau)\,\delta\tau \eqtag{(68, 70)} $$ $$ \Ad_{\Exp(\tau)} = \Jl(\tau)\,\Jr^{-1}(\tau) \eqtag{(75)} $$
Jr coefficient curves
Fig. 4 — Inside \(\Jr(\theta)\). The two scalar coefficients multiplying \(\sk\theta\) and \(\sk\theta^2\). At \(\theta \to 0\) they tend to \(1/2\) and \(1/6\): \(\Jr \to I\), recovering vector-space intuition. But already at \(\theta = 30^\circ\) the antisymmetric part is substantial — the reason you can't just pretend rotations add.
Linearization error with and without Jr
Fig. 5 — What \(\Jr\) buys you. Relative error of the first-order prediction of \(\Log(\Exp(-\delta)\Exp(\tau))\) for \(\delta = 0.3\,\theta\) perpendicular to \(\tau\), plotted vs \(\|\tau\| = \theta\). The naive rule “subtract the vectors” degrades quickly; with the \(\Jl^{-1}\) correction the error stays orders of magnitude smaller — it is genuinely second-order.
Takeaway. A manifold Jacobian is the ordinary derivative with variations in the tangent spaces: define via \(\oplus/\ominus\) (41), build from the block table, chain as usual (58) — and for \(\SO(3)\) the blocks are the matrices \(\Ad\), \(\Jr\), \(-R\sk p\).

8 · Uncertainty: Gaussians that live in the tangent space

Motivation. A Kalman filter is a mean and a covariance. On a manifold, the naive definitions collapse: \(X - \bar X\) doesn't exist, and \(E[(X-\bar X)(X-\bar X)^\top]\) would be a \(9\times 9\) (for \(\SO(3)\)) matrix for a 3-DoF object — always singular, always ill-defined (the paper's footnote 5). The fix uses exactly the pieces we've built: keep the mean on the manifold, and the uncertainty in the tangent space.

Define the local perturbation and its covariance (paper eqs. 51–52):

$$ X = \bar{X} \oplus {}^{\bar X}\tau, \qquad \Sigma_X \;,=\; E\!\left[{}^{\bar X}\tau\,{}^{\bar X}\tau^{\top}\right] \in \mathbb{R}^{m \times m}, \qquad X \sim \mathcal{N}_{\M}\!\left(\bar{X}, \Sigma_X\right) $$

The mean \(\bar X\) is a genuine manifold element; \(\Sigma_X\) is an honest \(m\times m\) PSD matrix. Because \(\Sigma\) describes a tangent vector, its frame matters: a global (at-\(E\)) covariance converts to local by the adjoint — the same \(\Ad\) as in §6, now acting on covariances:

$$ {}^{E}\Sigma_X = \Ad_X\; {}^{X}\Sigma_X\; \Ad_X^{\top} \eqtag{(54)} $$

The paper's example: “3D orientation known up to rotations in the horizontal plane” is a statement about a global covariance \({}^{E}\Sigma = \mathrm{diag}(\sigma_\phi^2, \sigma_\theta^2, \infty)\) — expressible only at \(E\), then pulled to wherever the state is.

How does a tangent Gaussian look on the manifold? Push the distribution through \(\oplus\): sample \(\tau \sim \mathcal N(0,\Sigma)\) in the tangent plane and wrap with \(\Exp\).

Gaussian in tangent space wrapped on sphere
Fig. 6 — A Gaussian on a manifold. The covariance is the dashed ellipse in the tangent plane at the identity \(E\) (drawn anisotropic, \(\sigma_1 = 0.5\), \(\sigma_2 = 0.16\)); the dots are samples wrapped onto the manifold by \(\Exp\). The cloud bends with the manifold — on \(\SO(3)\) an isotropic uncertainty is perfectly well defined, and no “banana” of Euler angles can appear because we never used a chart.

Propagating uncertainty through \(Y = f(X)\) needs only the linearized prediction (43): push the perturbation through \(J\), then take expectations:

$$ \Sigma_Y \;\approx\; \frac{{}^{X}\D f}{\D X}\;\Sigma_X\;\left(\frac{{}^{X}\D f}{\D X}\right)^{\!\top} \eqtag{(55)} $$

— the familiar \(J\Sigma J^\top\), with \(J\) from §7. The mean of samples is found the same way a vector mean is, by iteration: start from any sample, compute the average correction \(\bar\tau = \frac{1}{N}\sum_i (X_i \ominus \bar X)\), apply \(\bar X \leftarrow \bar X \oplus \bar\tau\), repeat. It converges in a few steps because the corrections live in one flat tangent space.

Takeaway. \(X \sim \mathcal N(\bar X, \Sigma)\) means “\(X \ominus \bar X\) is Gaussian”: mean on the manifold, covariance in the tangent, frames converted by \(\Ad\), propagation by \(J\Sigma J^\top\).

9 · Discrete integration: where your gyro code comes from

Motivation. Continuous motion \(X(t) = X_0 \circ \Exp(vt)\) assumes constant velocity. Real IMUs deliver rates in chunks — integration must be discrete, and the \(\oplus\) formalism makes the discretization exact per-step rather than an approximation of some grand addition.

Segment the motion into piecewise-constant velocities \(v_k\) over \(\delta t_k\); each chunk is a tangent increment \(\tau_k = v_k\,\delta t_k\) expressed in the frame where the rate is measured (the body, for a gyro). Then compose (paper eq. 56):

$$ X_k = X_{k-1} \oplus \tau_k = X_{k-1} \circ \Exp(\tau_k) \qquad\Longrightarrow\qquad R_k = R_{k-1}\Exp(\omega_k\,\delta t) $$

— which is precisely the quaternion or matrix update line in every IMU pipeline, now derived rather than ad-hoc. Because each \(\Exp\) is exact, the only errors are sensor errors (bias, noise) — not discretization of the group structure. This is also the backbone of on-manifold IMU preintegration (Forster et al.), where many chunks are composed into one delta with its combined covariance.

Takeaway. Dead-reckoning is a chain of \(\oplus\): exact between updates, with all uncertainty handled in tangent space through §8.

10 · Estimation on manifolds: ESKF and graph optimization

Motivation. Everything so far assembles into the two workhorses of robotic state estimation. The punchline of this section is how little changes: the algorithms keep their vector-space shape; only + becomes \(\oplus\), and every Jacobian comes from the §7 block table.

10.1 · Error-state Kalman filter (paper §V-A)

Setup: a planar robot with pose \(X \in \SE(2) = \begin{bmatrix} R & t \\ 0 & 1\end{bmatrix}\), beacons \(b_k \in \mathbb R^2\), noisy control \(u \in \mathbb R^3 \cong \mathfrak{se}(2)\) (linear + angular velocity over \(\delta t\)), and Cartesian beacon measurements \(y = X^{-1}\cdot b + n\). The error state and covariance are defined in the tangent space at the estimate:

$$ \delta x \;,=\; X \ominus \hat{X} \in \mathbb R^3, \qquad P = E[\delta x\, \delta x^\top] \in \mathbb R^{3\times3} \eqtag{(97–98)} $$

Predict (control \(u_j\) arrives): apply \(\oplus\), then propagate \(P\) with the §7 blocks — the state-transition matrix is the composition Jacobian \(F = \Ad_{\Exp(u)}^{-1}\) and the noise enters through \(G = \Jr(u)\):

$$ \hat{X}_j = \hat{X}_i \oplus u_j, \qquad P_j = F\,P_i\,F^\top + G\,W\,G^\top \eqtag{(99–100)} $$

Correct (measurement \(y_k\) arrives): standard EKF algebra verbatim; the only Lie-theory object is the measurement Jacobian \(H = {}^{X}\D(X^{-1}\cdot b)/\D X = -\left[\,I \;\; R J_2 (b - t)\,\right]\) (with \(J_2 = \begin{bmatrix}0&-1\\1&0\end{bmatrix}\)), itself the action Jacobian (150) chained with the inverse Jacobian (62):

$$ z = y_k - \hat{X}^{-1}\!\cdot b, \qquad Z = HPH^\top + N, \qquad K = PH^\top Z^{-1} \eqtag{(101)} $$ $$ \delta x = Kz, \qquad \hat{X} \leftarrow \hat{X} \oplus \delta x, \qquad P \leftarrow P - KZK^\top \eqtag{(102)} $$

Notice what did not change: the Kalman gain, the innovation covariance, the covariance update — all identical to the textbook filter. The paper's summary is exact: “the only changes with respect to a regular EKF are in (99) and (101), where regular \(+\) are substituted by \(\oplus\)”.

Worked correction step — all numbers

Prior: \(\hat X = \big(\theta{=}30^\circ,\ t{=}(1,2)^\top\big)\), \(P = \mathrm{diag}(0.09,\,0.04,\,0.04)\) (i.e. \(\sigma_x{=}0.3\) m, \(\sigma_y{=}0.2\) m, \(\sigma_\theta{=}0.2\) rad). Beacon \(b = (4,3)^\top\). Measurement \(y = (3.198,\ -0.684)^\top\), \(N = \mathrm{diag}(0.01, 0.01)\).

innovation\(z = y - \hat X^{-1}\cdot b = (0.100,\ -0.050)^\top\)
meas. Jacobian\(H = -\left[I \;\ R J_2(b-t)\right] = \begin{bmatrix}-1 & 0 & 2.366\\ 0 & -1 & -2.098\end{bmatrix}\)
Kalman gain\(K = PH^\top(HPH^\top + N)^{-1} = \begin{bmatrix}-0.602 & -0.529\\ -0.235 & -0.383\\ 0.140 & -0.248\end{bmatrix}\)
optimal correction\(\delta x = Kz = (-0.0338,\ -0.0043,\ 0.0264)^\top\ \ (\text{last entry in rad})\)
update\(\hat X \leftarrow \hat X \oplus \delta x:\ \ \theta = 31.51^\circ,\ \ t = (0.966,\ 1.995)^\top\)
covariance\(P \leftarrow P - KZK^\top = \begin{bmatrix}0.036 & -0.021 & 0.013\\ -0.021 & 0.025 & -0.010\\ 0.013 & -0.010 & 0.006\end{bmatrix}\)

One range-free bearing-only sighting of one beacon pulls the heading estimate by \(+1.5^\circ\) and cuts \(\sigma_\theta\) from 0.20 to 0.077 rad. Nothing in this table needed an angle-wrap special case — \(\oplus\) handled the geometry.

10.2 · Graph-based smoothing and mapping (paper §V-B)

Motivation. Filters are causal and local; smoothers re-estimate the whole trajectory from all measurements. The state is now a heterogeneous stack — poses and landmark positions — and this is where the theory's second payoff appears: a bundle of manifolds is itself a manifold, block by block.

\(X_1\)
\(X_2\)
\(X_3\)
\(b_4\)
\(b_5\)
\(b_6\)
prior on \(X_1\)
motion factor \(u_{ij}\)beacon factor \(y_{ik}\)prior
Fig. 7 — The SAM factor graph (paper Fig. 12). Poses \(X_1..X_3 \in \SE(2)\), beacons \(b_4..b_6 \in \mathbb R^2\). Each edge is one residual and one sparse block-row of \(J\). The state is the composite \(X = \langle X_1, X_2, X_3, b_4, b_5, b_6\rangle\) (eq. 103).

The composite manifold \(\M = \langle \M_1, \ldots, \M_M\rangle\) simply concatenates everything: identity, inverse, composition and \(\Exp^{\langle\rangle}\) act block-wise, so \(\oplus\) acts block-wise and Jacobians are block matrices of the §7 blocks (paper eqs. 85–89). The total squared error is a sum of residual squared norms, each whitened by an information matrix \(\Omega\):

$$ r_{ij}(X) = \Omega_{ij}^{1/2}\left(u_{ij} \ominus (\hat X_j \ominus \hat X_i)\right), \qquad r_{ik}(X) = \Omega_{ik}^{1/2}\left(y_{ik} \ominus (\hat X_i^{-1}\cdot \hat b_k)\right) \eqtag{(104–105)} $$

Gauss–Newton on a manifold is then word for word the vector-space algorithm, with the linearization from (90):

$$ r_p(X \oplus \delta x) \approx r_p(X) + J_p\,\delta x \quad\Longrightarrow\quad \delta x^\star = -\left(J^\top J\right)^{-1} J^\top r, \qquad X \leftarrow X \oplus \delta x^\star \eqtag{(108–110)} $$

Iterate to convergence. Sparsity of \(J\) comes free from the block structure (each factor touches only its own two nodes — the block pattern of the paper's eq. 107). Adding self-calibration (an unknown control bias \(c\)) means appending one more block \(c \in \mathbb R^2\) to the composite and one more column of Jacobian blocks — nothing else in the solver moves (paper §V-C). And going 2D → 3D is \(\SE(2) \to \SE(3)\), \(m{:}\ 3 \to 6\): every equation above is unchanged, which is the entire point of the abstraction.

DEMO 2 On-manifold Gauss–Newton: Wahba point-cloud alignment

Estimate the rotation \(R\) minimizing \(\sum_i \|q_i - R p_i\|^2\) — the residual of §7.2's action Jacobian in the loop (eq. 150). Six points \(p_i\) (blue in your mind's eye) were rotated by a hidden truth \(R^\star=\Exp(0.9,-0.7,0.5)\) (a \(70.9^\circ\) turn) and jittered by noise. Start far away: \(\hat R_0 = \Exp(2.8,\ 1.9,\ -2.4)\). Step the solver and watch the Jacobian block do the work — then uncheck it and watch the solver stall, exactly as in Fig. 8.

iteration k = 0
cost \(\sum_i\|e_i\|^2\) = —
rotation error to truth = —
last update \(\|\delta\|_\infty\) = —

cost per iteration (log scale). With the correct \(J\): quadratic convergence, ~5 steps to the noise floor. With \(J = I\): the direction is wrong and the cost stalls around 10–15.

GN convergence comparison
Fig. 8 — Same problem, computed (log scale). Gauss–Newton with the action Jacobian \(J = \hat R\sk p\) collapses the cost \(16.7 \to 0.0018\) in 5 iterations (final rotation error \(0.8^\circ\), set by the noise). Gradient descent crawls; Gauss–Newton with the wrong Jacobian \(J = I\) never picks a useful direction. The Jacobian is not bookkeeping — it is the solver.
Takeaway. ESKF and graph optimizers keep their exact vector-space shape; the Lie-theory port is mechanical: errors and updates live in tangent spaces (\(\delta x = X \ominus \hat X\)), + becomes \(\oplus\), Jacobians come from the block table.

11 · The big picture, and the cheat sheet

What the “micro” leaves out, and why that's OK. Full Lie theory continues with the Lie bracket (a product on \(\mf\)), the Baker–Campbell–Hausdorff formula (exact composition of exponentials), and the deep fact that the algebra nearly determines the group. The paper deliberately relegates all of it: for estimation you compose, differentiate and propagate — and every one of those operations is carried out on \(\mathbb R^m \cong \mf\) with the \(\oplus/\ominus\) operators. What you give up (closed-form composition of large rotations, i.e. BCH) you rarely need: you iterate instead. When you do need the bigger canvas — continuous-time trajectory estimation on \(\mathrm{SE}_k(3)\), Lie groups of higher symmetry — Barfoot's State Estimation for Robotics and Chirikjian's volume II pick up exactly where this paper stops.

Where you've already met this paper. The operators here are the vocabulary of modern SLAM stacks: GTSAM's Pose3::Expmap and its \(\oplus\)-retraction optimizers, on-manifold IMU preintegration (Forster et al.), and the companion C++ library manif, which implements every formula on this page with analytic Jacobians. The quaternion tutorial of Solà (2017) is the deep-dive companion for the \(S^3\) column.

11.1 · Notation

\(X, Y \in \M\)group elements (poses, orientations); \(E\): identity
\(\TR{X},\ \mf = T_E\M\)tangent space at \(X\); Lie algebra (tangent at identity)
\(\tau \in \mathbb R^m\)tangent increment in Cartesian form; \(\tau^\wedge \in \mf\) its hat image
\(\Exp, \Log\)\(\mathbb R^m \leftrightarrow \M\) wrap/unwrap (geodesic) maps
\(X \oplus \tau,\ \tau = Y \ominus X\)right (local) plus/minus; left versions use \(\Exp(\tau)\circ X\)
\(\Ad_X\)adjoint matrix: local ↔ global tangent change of frame
\(\Jr, \Jl\)right / left Jacobians of \(\Exp\); \(\Jl = \Jr^\top\), \(\Jl(\tau) = \Ad_{\Exp(\tau)}\Jr(\tau)\)
\(\Sigma,\ P,\ \Omega\)covariance (tangent space), filter covariance, information matrix

11.2 · \(\SO(3)\) quick reference

\(\Exp(\theta)\)\(I + \frac{\sin\theta}{\theta}\sk\theta + \frac{1-\cos\theta}{\theta^2}\sk\theta^2\) (Rodrigues)
\(\Log(R)\)\(\theta = \frac{1}{2\sin\theta}\left(R - R^\top\right)^\vee\), \(\ \theta = \cos^{-1}\frac{\mathrm{tr}R - 1}{2}\) (handle \(\theta \to 0, \pi\))
\(\Ad_R\)\(R\)
\(\Jr(\theta)\)\(I - \frac{1-\cos\theta}{\theta^2}\sk\theta + \frac{\theta-\sin\theta}{\theta^3}\sk\theta^2\); \(\ \Jl = \Jr^\top\)
\(J\) of \(Rp\)\(\frac{{}^{R}\D(Rp)}{\D R} = -R\sk p\), \(\quad \frac{\D(Rp)}{\D p} = R\)
\(J\) of \(R^{-1}\), \(R_1 R_2\)\(-R\), \(\quad \Ad_{R_2^{-1}} = R_2^\top\)

11.3 · \(\SE(3)\) quick reference (\(\tau = (\rho, \theta) \in \mathbb R^6\))

\(\Exp(\tau)\)\(\begin{bmatrix} \Exp(\theta) & V(\theta)\rho \\ 0 & 1\end{bmatrix}\), \(\quad V(\theta) = I + \frac{1-\cos\theta}{\theta^2}\sk\theta + \frac{\theta - \sin\theta}{\theta^3}\sk\theta^2\)
\(\Log(M)\)\(\big(V^{-1}(\theta)\,t,\ \Log(R)\big)\)
\(\Ad_M\)\(\begin{bmatrix} R & \sk t R \\ 0 & R \end{bmatrix}\)
\(\Jl(\rho,\theta)\)block matrix built on \(\Jl(\theta)\) and \(Q(\rho,\theta)\) — paper eqs. (179–180); \(\Jr(\rho,\theta) = \Jl(-\rho,-\theta)\)
\(J\) of \(M\cdot p\)\(\frac{{}^{M}\D(Mp)}{\D M} = \left[\,R \;\; -R\sk p\,\right]\), \(\quad \frac{\D(Mp)}{\D p} = R\)
\(J\) of \(M^{-1}\), \(M_1M_2\)\(-\Ad_M\), \(\quad \Ad_{M_2^{-1}}\)

The paper on one page

States live on Lie groups: curved (manifold: constraints, local flatness) and composable (group: \(\circ\), inverse, \(E\)). Calculus happens in tangent spaces — all copies of \(\mf \cong \mathbb R^m\). \(\Exp\) wraps tangent increments exactly onto the manifold along geodesics; \(\Log\) unwraps. From these: \(\oplus\) / \(\ominus\) replace \(+\)/\(−\) (local by default, global via the adjoint \(\Ad_X\)). Jacobians are the ordinary derivatives with tangent-space variations (41), built from blocks \(-\Ad_X\), \(\Ad_{Y^{-1}}\), \(\Jr\), \(-R\sk p\) and chained as usual. Uncertainty is a tangent-space Gaussian around a manifold mean, propagated by \(J\Sigma J^\top\) and re-framed by \(\Ad \,\Sigma\, \Ad^\top\). Integration is a chain of \(\oplus\). ESKF and graph optimizers keep their textbook form with \(+ \to \oplus\) — worked out in \(\SE(2)\) and identical in \(\SE(3)\).