projects fūjin uav slam

Fūjin UAV SLAM: Monocular Visual SLAM from Scratch

Fūjin (風神) is the Japanese god of wind, and the name of my monocular visual SLAM system for UAVs, written from scratch in Python. Given nothing but a single camera stream from the EuRoC MAV dataset, no GPS, no IMU, just pixels, it estimates the drone's trajectory and builds a sparse 3D map of the environment in real time.

The pipeline is the classic visual odometry front end, implemented piece by piece rather than imported: ORB/SIFT feature extraction, brute-force or FLANN matching between consecutive frames, fundamental matrix estimation with RANSAC, essential matrix decomposition for relative pose recovery, SVD triangulation of the matched points, and pose accumulation into a global trajectory. Bag-file streaming and the OpenGL 3D renderer each run in their own process, connected by queues, so the viewer stays live while frames are processed.

The 3D viewer draws the estimated trajectory, camera frustums and the triangulated point cloud, with orbit and top-down controls; a debug mode overlays the feature matches on the raw frames. The implementation follows Prof. Davide Scaramuzza's Vision Algorithms for Mobile Robotics course (UZH / ETH Zürich); bundle adjustment, loop closure and long-term tracking are the planned next steps: the parts that turn visual odometry into full SLAM.

Stack
Python 3.11, OpenCV, NumPy, OpenGL, uv, EuRoC MAV dataset
Feature matching debug view: ORB keypoints matched between two consecutive drone camera frames, match lines drawn across the stereo pairLive 3D viewer in orbit view: estimated trajectory in blue, camera frustums in gray and green, triangulated sparse point cloud in whiteLive 3D viewer in top-down view showing the accumulated drone trajectory and sparse mapDevelopment session: the visual odometry code in the editor with the live feature-matching viewer running at 19 FPS on a EuRoC bag file