PTAM

Klein & Murray 2007 · Paper

One-line summary — Introduced the paradigm of splitting SLAM into parallel tracking and mapping threads, making real-time keyframe-based bundle adjustment possible for the first time.

Problem

MonoSLAM’s EKF approach could not scale beyond small maps: every frame updates a dense covariance over all landmarks, so cost grows quickly with map size and accuracy suffers from repeated linearisation. Bundle adjustment (BA) produces far more accurate results than filtering, but in 2007 it was considered too slow for real-time operation. Klein & Murray (ISMAR 2007, Oxford) argued that tracking a hand-held camera and building a map are separable problems: decouple them into two threads and BA can run in the background while tracking runs at frame rate.

Method & architecture

Tracking thread (every frame). A four-level image pyramid is built and FAST corners detected at each level. Camera pose lives in SE(3)\mathrm{SE}(3) as a 4×44\times 4 matrix ECWE_{CW}, updated by left-multiplication via the exponential map with a six-vector μ\mu:

ECW=MECW=exp(μ)ECW.E_{CW}' = M\,E_{CW} = \exp(\mu)\,E_{CW}.

Map points are projected through a calibrated FOV-distortion camera model; each visible point’s 8×88\times 8 source patch is affinely warped by a matrix AA (from back-projecting unit pixel displacements of the source keyframe onto the patch plane), and det(A)/4l\det(A)/4^l closest to unity picks the pyramid level ll to search. Matching is zero-mean SSD at FAST corner locations inside a circular gate — no descriptors at all. Given the set SS of found patches (u^j v^j)(\hat{u}_j\ \hat{v}_j)^\top with noise σj2=22l\sigma_j^2 = 2^{2l}, the pose update minimises a robust reprojection objective by ten iterations of reweighted least squares:

μ=argminμjSObj(ejσj, σT),ej=(u^jv^j)CamProj(exp(μ)ECWpj),\mu' = \underset{\mu}{\operatorname{argmin}} \sum_{j \in S} \mathrm{Obj}\left( \frac{|\mathbf{e}_j|}{\sigma_j},\ \sigma_T \right), \qquad \mathbf{e}_j = \begin{pmatrix} \hat{u}_j \\ \hat{v}_j \end{pmatrix} - \mathrm{CamProj}\big(\exp(\mu)\,E_{CW}\,\mathbf{p}_j\big),

where Obj(,σT)\mathrm{Obj}(\cdot, \sigma_T) is the Tukey biweight with a median-based scale estimate σT\sigma_T. Tracking is two-stage coarse-to-fine: first 50 coarse-level points over a large radius, then up to 1000 points over a tight radius; a decaying-velocity motion model predicts the prior pose, and tracking quality is monitored so poor frames never reach the map (with a relocalizer for full failure).

Mapping thread (asynchronous). The map is bootstrapped by user-assisted two-view stereo: 1000 patches tracked between two key-pressed views, essential matrix from the five-point algorithm + RANSAC, triangulation, scale fixed by assuming a 10 cm baseline, and the dominant plane (found by RANSAC) aligned to z=0z=0. Keyframes are added only when tracking is good, at least 20 frames have passed, and the camera exceeds a minimum (depth-scaled) distance from existing keyframes; new points come from epipolar search against the nearest keyframe. The thread then runs BA over keyframe poses and points:

{μ2..μN},{p1..pM}=argmin{μ},{p}i=1NjSiObj(ejiσji, σT)\{\mu_2 .. \mu_N\}, \{\mathbf{p}'_1 .. \mathbf{p}'_M\} = \underset{\{\mu\},\{\mathbf{p}\}}{\operatorname{argmin}} \sum_{i=1}^{N} \sum_{j \in S_i} \mathrm{Obj}\left( \frac{|\mathbf{e}_{ji}|}{\sigma_{ji}},\ \sigma_T \right)

— Levenberg–Marquardt with the standard sparse structure-from-motion tricks, scaling as O(N3)O(N^3) in keyframes. Because full BA stalls during exploration, a local BA adjusts only XX = the newest keyframe plus its 4 nearest neighbours, over ZZ = all points they see, constrained by every keyframe YY that measures those points (roughly O(NM)O(NM)). When idle, the thread improves data association: measuring new features in old keyframes and giving Tukey-flagged outlier measurements a “second chance” before deletion.

Results

All on a desktop Intel Core 2 Duo 2.66 GHz (live hand-held operation):

Why it matters for SLAM

PTAM established the frontend/backend separation that virtually every modern SLAM system still follows, and demonstrated empirically that keyframe bundle adjustment beats filtering — a claim later formalised by Strasdat et al.’s “Visual SLAM: Why Filter?”. Keyframes, local BA over a neighbourhood, background global refinement, tracking-quality gating: ORB-SLAM is essentially this architecture completed with automatic initialisation, loop closure, and large-scale map management.