ECE 276A · Robotics · Project 3

Visual-Inertial SLAM

Fusing high-rate IMU motion predictions with stereo camera observations via Extended Kalman Filter for accurate 3D trajectory estimation and landmark mapping.

Overview

SLAM (Simultaneous Localization and Mapping) enables a robot to build a map of its environment while tracking its own pose within that map — without any external reference. This project implements a complete visual-inertial SLAM pipeline that tightly couples a 100 Hz IMU with 10 Hz stereo camera observations via the Extended Kalman Filter.

The IMU provides high-rate motion predictions via dead-reckoning on SE(3), while stereo images supply sparse visual features that are triangulated into 3D landmarks and used to correct accumulated drift. The system estimates a full 6-DOF trajectory and a sparse 3D landmark map jointly, tested on the dataset01.npy benchmark sequence.

Method

📐

EKF IMU Localization

Propagates the robot's SE(3) pose using angular velocity ωk and linear velocity vk from the IMU. The Rodrigues formula computes the SO(3) exponential map for rotation updates, while a 6×6 Jacobian propagates covariance through the prediction step.

Tk+1 = Tk · Exp([vk, ωk] · Δt)
📷

Stereo Landmark Triangulation

Initializes 3D landmark positions from stereo pixel pairs (uL, vL, uR, vR) using the normalized Direct Linear Transform (DLT). Outliers are rejected via Median Absolute Deviation, and multi-frame aggregation improves depth estimates. Only landmarks observed in ≥ 150 frames are retained.

M̂ = DLT(uL, uR, KL, KR, Tcam)
🔄

Visual-Inertial EKF Update

Jointly updates the 6-DOF pose and all selected landmark positions using visual reprojection errors. A sparse block-diagonal covariance (scipy.sparse) ensures efficiency. Chi-square gating (χ² < 9.488, 95% CI) and a 30 px pixel threshold form a two-stage outlier rejection pipeline before applying the Kalman update.

K = PHT(HPHT + R)−1
IMU
ω, v at 100 Hz
EKF Predict
SE(3) pose
Stereo Cameras
(uL,vL,uR,vR)
DLT Triangulate
3D landmarks
EKF Update
χ² < 9.488
Trajectory + Map
6-DOF + M×3

Results

Characteristic system properties from dataset01.npy.

Multi-Rate Sensor Fusion
IMU
100 Hz
Camera
10 Hz
10× higher prediction rate than correction rate
Chi-Square Outlier Gating
Accepted
~70%
Rejected
~30%
~30% of observations gated as outliers (χ² < 9.488)
EKF State Dimensions
Pose
6-DOF
Landmarks
M × 3D
Sparse block-diagonal covariance for scalability
Landmark Quality Filter
Min. frames
150 obs.
Pixel thr.
30 px
Two-stage filter: observation count + reprojection error

Tech Stack

NumPy
Numerical arrays
JAX
Autodiff / JIT
SciPy Sparse
Block covariance
Matplotlib
Trajectory plots
Python 3.10
Runtime

Configuration

ParameterValueDescription
min_obs150Min frames to select a landmark
chi2_threshold9.488χ² test threshold (95% CI, 4 DOF)
pixel_threshold30.0 pxMax reprojection residual
EKF state dim6Pose error state [δφ, δp]
Datasetdataset01.npyIMU + stereo features stream