Research Intern · Spin Drift Technologies · Nov 2025 – May 2026 · code under NDA
A from-scratch visual-inertial odometry pipeline in modern C++: stereo cameras and an IMU in, live pose out to a PX4 flight controller.
Overview
A during-school-year internship in which I owned the navigation software for a drone that has to localize itself without GPS. I first ran a broad sensor-tradeoff study — per-sensor writeups across stereo, mono, event, depth and thermal cameras, IMU, LiDAR, radar, UWB, ultrasonic, barometer, magnetometer, and rangefinders — so hardware selection was evidence-based before code was written. Then I built the VIO pipeline end to end, running against mock, recorded, and simulated sensors, with a visual-SLAM layer designed to slot in on top.
Bound by NDA — the code is not mine to publish, so this stays at the architecture level.
Design decisions 05
From-scratch was a decision, not a default: off-the-shelf systems (cuVSLAM, OpenVINS, OKVIS, ROVIO, ORB-SLAM3) were evaluated and rejected on licensing, NVIDIA/ROS2 lock-in, or research-grade instability — the project needed a permissively-owned stack tailored to its exact sensor set.
The visual estimator uses nonlinear optimization over a factor graph rather than an EKF, because camera reprojection is strongly nonlinear in rotation and an EKF’s single linearization per update accumulates rotation error fast; the downstream PX4 EKF2 still fuses the vision pose for flight control.
Every sensor sits behind a pure-virtual C++ interface from day one, so the whole estimation stack develops and tests against synthetic mocks, recorded sequences, or Gazebo — adding real hardware means writing one driver class and changing nothing else.
The work was sequenced VIO-first, SLAM-second, tolerating drift in phase one: loop closure and a persistent map on top of an unproven estimator yields a broken SLAM system, so interfaces were designed for phase-two factors to slot in unchanged.
MAVLink frames are built by hand — CRC, ENU→NED conversion, no external MAVLink library — keeping the pose-output path dependency-free; Shi-Tomasi corners were picked over FAST because FAST misfires on saddle points where no contiguous bright/dark arc exists.