University of Maryland - Spring 2026
Course: ENPM 673 Perception for Autonomous Robots (final project)
Recovering a camera's trajectory from a single video stream. Tuning keyframe selection and preprocessing cut closed-loop drift 4.8x, to 2.7% (5.4 cm end-point error on a 2.0 m loop). I recorded a four-wheel skid-steer robot driving a 0.5 m closed square with a forward-facing Raspberry Pi camera (1920x1080, 30 fps), then built and compared two pose-recovery pipelines in Python and OpenCV: pairwise visual odometry that chains essential-matrix poses between consecutive keyframes, and a local-map SLAM pipeline that solves absolute pose with PnP-RANSAC against an evolving 3D landmark cloud. The known 2.0 m loop perimeter anchors the metric scale that monocular geometry cannot observe.
Closed-loop drift on the 2.0 m loop: pairwise VO went from 12.9% (25.7 cm) with every-frame keyframes to 2.7% (5.4 cm end-point error) with long-baseline keyframe selection and retuned undistortion preprocessing. Local-map SLAM went from 12.4% to 3.6% on the same inputs. PnP fell back to essential-matrix integration on 76% of pairs because ORB matches against the local map did not survive the longer baselines, which points to the descriptor frontend as the next thing to improve.
