Visual-inertial odometry (VIO) is the step up from optical flow: instead of velocity only, you get a full 3D pose — position and orientation relative to where you started — which is enough for position hold, local-frame missions, and obstacle-aware flight, with no external infrastructure. The price is a companion computer, real calibration, and an order of magnitude more hardware cost.
This is part of the GPS-denied navigation series: six solutions compared. See also the GPS-denied overview and Vision-Based UAV Navigation.
How it works
One or two cameras track visual features (corners, blobs) frame to frame — visual odometry. An IMU (accelerometer + gyro at hundreds of Hz) is fused with the vision: it bridges fast motion that blurs images, bridges brief feature loss, and recovers metric scale for monocular setups. The fusion runs either as a filter (MSCKF — OpenVINS) or as sliding-window nonlinear optimization (VINS-Fusion). Output is a full 3D pose and velocity relative to the starting point.
PX4: a companion computer runs ROS; a ROS node reads the camera and publishes nav_msgs/Odometry to /mavros/odometry/out, and EKF2 fuses it via EKF2_EV_CTRL (horizontal/vertical position, velocity, yaw fusion), EKF2_HGT_REF = Vision, and EKF2_EV_DELAY (timestamp alignment — needs empirical tuning). Verify in QGroundControl’s MAVLink Inspector for ODOMETRY / VISION_POSITION_ESTIMATE messages, component ID 197 (MAV_COMP_ID_VISUAL_INERTIAL_ODOMETRY).
ArduPilot: external navigation via VISO_TYPE = 3 (VOXL) with EK3_SRC1_POSXY/VELXY/POSZ/VELZ/YAW = 6 (ExternalNav). Source switching (GPS outdoors / ExternalNav indoors) uses RC6_OPTION = 90.
Two caveats from the official PX4 guide: cameras are vibration-sensitive — soft mounting (isolation foam) is recommended. And running vision position and GPS together is “really difficult, because when they disagree it will confuse the EKF” — pick one.
DIY space: hardware and software
| Hardware / software | What it is | Price (verified) |
|---|---|---|
| Intel RealSense T265 | Dual fisheye + IMU, on-board 6DoF VIO on a Movidius Myriad 2 VPU; PX4’s reference VIO camera. Discontinued Feb 2022, still widely used secondhand | ~$200 at discontinuation; current street price unverified |
| Luxonis OAK-D Pro W | Stereo pair + 12 MP RGB + IMU, 4 TOPS on-device AI/depth. A stereo-depth/AI camera, not a turnkey VIO sensor — the estimator still runs on the host | €717.70 |
| Raspberry Pi 5 + Pi Camera + IMU | Cheapest from-scratch VIO rig; documented example uses OpenVINS with AprilGrid calibration | Bundle price unverified; parts bought separately |
| OpenVINS | GPL-3.0, MSCKF filter-based VIO, mono/stereo, online camera-IMU calibration | Free / open source |
| VINS-Fusion | GPL-3.0, HKUST, optimization-based sliding-window estimator, mono/stereo + IMU | Free / open source |
| ModalAI VOXL 2 | QRB5165 8-core, 15 TOPS, 16 g; flight controller + companion computer on one board; runs VIO, SLAM, obstacle avoidance | $1,399.99 board only; $1,499.99 dev kit |
| ModalAI VOXL 2 Mini | Same QRB5165 in 11 g, 42×42 mm | $1,349.99 board only |
The cost cliff, from ModalAI’s James Strawson on the PX4 forum: “If you care about costs → optical flow. VOXL 2 computer + tracking ~$1,600.”
The mount matters as much as the camera: VIO needs a soft-mounted, precisely located camera with known extrinsics. See Mounting the Sensors for GPS-Denied Flight.

Commercial and industrial use
Skydio X10: six navigation cameras in trinocular layout (32 MP, 200° FOV each), NVIDIA Jetson Orin, 360° obstacle avoidance, NightSense (visible/IR illumination for zero-light autonomy), flies in GPS- and comms-denied settings. Public safety, utilities, inspection, defense. Price by quote, not published; NDAA-compliant, on the Blue UAS Cleared List.
ModalAI Starling (275 g) / Sparrow (175 g): VOXL 2-based micro-drones built for GPS-denied autonomy and mapping, used in DoD programs.
Warehouse / indoor logistics: a 2026 Sensors paper benchmarking six lidar/LIO systems in an operational warehouse found the best lidar-inertial system cut trajectory error to about a third of the onboard VIO — VIO works in warehouses, but LIO currently beats it there.
Strengths and limits
Strengths: full 3D pose + velocity (not just velocity like flow); works anywhere with visual features — indoors, under bridges, urban canyons, warehouses; no external infrastructure; enables local-frame missions and waypoint flight; stereo or IMU fusion gives true metric scale.
Limits: drift accumulates without loop closure — VIO alone is odometry, not SLAM; needs light and texture (dark, blank walls, open water defeat it; Skydio’s NightSense exists precisely because of this); vibration-sensitive (soft-mount required); compute-hungry — Pi-class hardware is marginal for heavier estimators; calibration burden is real (camera-IMU extrinsics, time sync); monocular setups have scale ambiguity until the IMU observes enough motion; EKF2_EV_DELAY mistuning shows up as drift or flyaways.
Failure modes: feature loss during aggressive maneuvers (motion blur), low-texture/low-light scenes, vibration-induced tracking loss, GPS/vision disagreement confusing the EKF if both are fused, and latency/timesync errors between companion computer and flight controller.
How it compares
- Optical flow gives velocity only, for tens of dollars and zero companion computer. VIO gives full 3D pose, for $1,400+ of compute plus calibration. Both die on textureless/dark scenes.
- Lidar SLAM works in the dark and gives a map; VIO is lighter, cheaper, and passive (emits nothing an adversary can detect). In warehouses, current benchmarks put LIO ahead of VIO on accuracy.
- UWB positioning is absolute and drift-free but needs installed anchors. VIO needs nothing installed — and drifts.
- Terrain matching bounds the error VIO accumulates: VIO tracks smooth short-term motion, map matching periodically corrects the drift. Fielded systems pair them.
- Dead reckoning is what VIO replaces: the IMU alone drifts in seconds; VIO’s camera corrections stretch that to minutes and missions.
