Skip to main content

MicoVIO Visual-Inertial Odometry Sensor — User Manual

The MicoVIO is MicoAir's visual-inertial odometry (VIO) module: a global-shutter camera, an IMU and a ToF rangefinder in a 29.5 × 29.5 × 15 mm aluminium case, with all the fusion done on board. It outputs the aircraft's relative position, 3-axis velocity and attitude as standard MAVLink 2 ODOMETRY messages, so an ArduPilot or PX4 drone can hover and hold position without GPS — indoors, under bridges, in tunnels and warehouses, or anywhere satellites fail — and, on firmware that supports external-navigation missions, fly waypoints and return to launch. Typical trajectory error is 1 % of distance flown. It weighs 16 g and needs nothing but a spare UART.

MicoAir MicoVIO visual-inertial odometry sensor, top view showing camera, ToF rangefinder and forward arrow

Coming soon — first batch late October to mid-November 2026

MicoVIO launched in China on 15 October 2026 and the first North American stock is on its way to Robofusion. The store page is live for reference, and the cart stays closed until units arrive. To reserve one, email info@robofusion.net with the quantity. Reserving costs nothing; ordering, payment and shipping details are confirmed by email when stock arrives. The first batch ships from our Hong Kong facility (later batches from our Canada and US warehouses), so delivery time and any import charges differ from the store-wide US-warehouse notice — they are confirmed in your order email.

Where to buy​

Buy from the Robofusion store

What VIO is — and why it is not "better optical flow"​

How MicoVIO works: camera, IMU and ToF fused on the module into MAVLink ODOMETRY for the flight controller EKF

An optical flow sensor watches the ground slide across a tiny camera and tells the flight controller how fast the aircraft is moving sideways. The EKF integrates that velocity to get a position, and because every small error is integrated too, the position drifts. Flow quality also collapses when the aircraft yaws quickly or climbs too high.

Visual-inertial odometry solves a different problem. It tracks hundreds of visual features from frame to frame, predicts the motion between frames with the IMU, and fuses the two into a full 6-degree-of-freedom pose — where the aircraft is, how fast it moves, and which way it points. The ToF rangefinder pins down the metric scale. The result is a position the autopilot can trust, not just a velocity. MicoVIO adds local loop closure: it re-matches the current view against recent frames and uses that as a position constraint, so a hover stays put instead of slowly wandering.

Why this used to need a companion computer

Open-source VIO pipelines normally run on a Linux board (Jetson, Raspberry Pi, VOXL) with a stereo camera and ROS, and they are notorious for diverging when the light changes or the aircraft is bumped. MicoVIO runs the whole pipeline on the module and holds through strong light changes, impacts and fast attitude changes — which is what makes a 16-gram, plug-into-a-UART VIO sensor possible at all.

Standalone: the whole VIO pipeline in 16 grams — no companion computer​

MicoAir MicoVIO module, angled view

This is the point that matters most. Until now, giving an open-source drone visual-inertial odometry meant building a small computer onto it, in one of two ways. Either a stereo camera such as the Intel RealSense D435 / D455 feeding a Raspberry Pi, Jetson or similar single-board computer that runs the VIO software (OpenVINS, VINS-Fusion) under ROS; or the Intel RealSense T265, which did the tracking on the camera itself but still needed a companion computer to bridge its pose into MAVLink for the flight controller. Either way the stack costs several hundred dollars, weighs well over a hundred grams with its cabling, needs a frame big enough to carry it, and takes days to integrate — and the open-source VIO in the first case is known for diverging when the light changes or the aircraft is bumped.

MicoVIO puts the camera, the IMU, the rangefinder and the fusion processor inside one 29.5 × 29.5 × 15 mm, 16 g module and talks to the flight controller the way a GPS does: one 4-pin UART cable, standard MAVLink 2. There is no operating system to install, no ROS, no SDK, no calibration routine and nothing else to power. A 3-inch quad can carry it. For the flight controller it is simply an external navigation source — the same VISO_TYPE / EKF2_EV_CTRL settings used for a motion-capture system or a VOXL — so an ArduPilot or PX4 aircraft that has never had GPS-free positioning gets it in an afternoon.

Traditional VIO stackMicoVIO
HardwareStereo camera (D435 / D455) + Raspberry Pi / Jetson + power + cabling; or a T265 + companion computer as MAVLink bridgeOne module
WeightWell over 100 g all-in16 g
CostSeveral hundred dollarsA fraction of that
SoftwareROS, VIO package (or the T265 SDK), MAVLink bridge, calibrationNone — MAVLink 2 out of the box
Interface to FCMAVLink over serial or Ethernet from the companion computer4-pin UART, 921600 baud
RobustnessOpen-source VIO often diverges under light changes or impactsMicoAir reports stable tracking through strong light changes, impacts and fast attitude changes (manufacturer claim; see Operating limits)
Minimum airframeTypically 5-inch and up3-inch and up

Specifications​

MicoVIO performance at a glance: 1 % trajectory error, 40 Hz, 10 m/s, 30 m, 60°, 300°/s, >1 lux, 120°, 12 s boot

Positioning & tracking​

ItemSpecification
MethodVisual-inertial fusion of camera + IMU, with ToF rangefinder for height and scale
OutputRelative position, 3-axis velocity, attitude, height above ground, positioning quality
Trajectory error1 % typical¹
VIO update rate40 Hz typical (38–60 Hz, varies with scene texture)
Tracking speed10 m/s typical at 2 m above ground; varies with height, light, texture and motion
Max VIO working height30 m; effective height depends on ground texture, lighting and reflectivity
Min. initialisation height1 cm²
Max working tilt60°
Max tracking angular rate300°/s
Local loop closureOn by default; improves hover accuracy, does not affect dynamic flight
Boot time≈ 12 s from power-on to first data

Vision & ranging​

ItemSpecification
Image sensorLarge-format, high-dynamic-range global-shutter sensor with a fast wide-angle lens
Lens FOV120° diagonal
Illumination> 1 lux
ToF range0.02–12 m — 12 m indoors or under overcast sky, about 8 m in bright sunlight³
ToF update rate43 Hz

Interface & protocol​

ItemSpecification
ProtocolMAVLink 2
Odometry messageODOMETRY (ID 331)
Range messageDISTANCE_SENSOR (ID 132)
Serial3.3 V LVTTL UART, 921600 baud, 8N1
ConnectorsGH1.25-4P (GND · VCC · RX · TX) to the flight controller · USB Type-C for setup
FirmwareArduPilot ≥ 4.5.2 · PX4

Electrical & mechanical​

ItemSpecification
Supply5 V
Current / power≈ 200 mA average · ≈ 1 W
Size29.5 × 29.5 × 15 mm
Weight16 g
MountingFacing down, white arrow toward the nose
Not yet published by MicoAir (October 2026)

Operating temperature range, ingress protection, input-voltage tolerance and peak current, output latency and time-stamping, behaviour and recovery after losing track, and the mounting-hole pattern are not in the current datasheet. We have asked MicoAir and will add them here rather than guess; until then treat the module as an indoor / fair-weather device mounted with its own bracket.

¹ Typical 3D absolute trajectory error (ATE RMSE) divided by reference path length; varies with environment and motion. ² The height from which initialisation is allowed — not a guarantee of ToF or positioning accuracy at that height. ³ Ranging is affected by ambient light, target reflectivity, incidence angle and mounting.

Measured: outdoor trajectory vs RTK​

MicoAir flew the module outdoors next to an RTK receiver and compared the two tracks. ATE is the RMS 3D distance between the MicoVIO trajectory and the RTK trajectory after rigid-body alignment, with no scale correction.

FlightHorizontal distance travelledATEATE as share of distance
1≈ 136 m0.73 m≈ 0.5 %
2≈ 141 m0.70 m≈ 0.5 %

MicoVIO outdoor trajectory test: MicoVIO track versus RTK ground truth for two flights, ATE 0.73 m and 0.70 m

MicoVIO outdoor test summary: 0.73 m and 0.70 m ATE over 136 m and 141 m flights

Read these as trajectory-level statistics. ATE RMSE describes how far the whole MicoVIO track deviated from the RTK track on average, after the two were aligned — it is not the end-point error, the maximum error, or a guaranteed return-to-launch landing accuracy. The honest summary is "about half a percent of distance flown, typical, in these two flights"; your own result depends on ground texture, lighting and flight profile. Return-to-launch without GPS is possible on firmware that supports external-navigation RTL, but we have not yet measured landing accuracy ourselves.

What's in the box​

MicoVIO box contents: module and three 20 cm cables for MicoAir 743-series, Pixhawk 1/2 and Pixhawk 4/5/6

ItemQtyFits
MicoVIO module1—
GH1.25-4P → SH1.0-4P cable, 20 cm1MicoAir 743-series flight controllers (H743 V2, H743 AIO)GH1.25-4P to SH1.0-4P cable
GH1.25-4P → MX1.25-6P cable, 20 cm1Pixhawk 1 / Pixhawk 2 (Cube) telemetry portsGH1.25-4P to MX1.25-6P cable
GH1.25-4P → GH1.25-6P cable, 20 cm1Pixhawk 4 / 5 / 6 telemetry portsGH1.25-4P to GH1.25-6P cable

Dimensions & mounting​

MicoVIO dimensions: 29.5 × 29.5 × 15 mm, 16 g

Mount the module camera facing straight down with the white arrow pointing to the nose of the aircraft, as rigidly as the flight controller itself — VIO fuses its own IMU, so a soft or wobbly mount hurts it exactly as vibration hurts the autopilot. Keep the lens and the two ToF windows clear of props, landing gear and cable ties, and do not let the ToF look at a nearby strut. The module boots in about 12 s; let it finish before arming.

Ports & pinout​

MicoVIO connector face: USB Type-C and GH1.25-4P marked G V R T

Pin (case marking)SignalConnect to flight controller
GGNDGND
VVCC, 5 V5 V
RRX (3.3 V)UART TX
TTX (3.3 V)UART RX

The USB Type-C port is for MicoAssistant — live data, parameters and firmware updates in a web browser; it is not needed in flight.

Wiring​

MicoVIO wired to a MicoAir H743 V2 on UART4: GND–GND, VCC–5V, RX–TX4, TX–RX4

Any free UART works; the diagram shows UART4 on the MicoAir H743 V2. Cross RX and TX, power from a 5 V pad, and note which SERIALn (ArduPilot) or TELEM n (PX4) that port maps to in your flight controller manual or in MicoConfigurator's port page.

Check that your board supports external vision

The flight controller firmware must include the visual-odometry / external-vision library. H7 boards do — H743 V2, H743 AIO and the NxtPX4 V2 are all fine. Most F405 boards do not (F405 V2, F405 Mini): ArduPilot builds for boards with less than 2 MB of flash normally leave VISO_TYPE out to save space.

Configuration — ArduPilot​

Requires ArduPilot 4.5.2 or newer. MicoAir recommends doing this in MicoConfigurator, which exposes every parameter below on its Ports, Sensors → External Vision, Sensors → Rangefinder and EKF pages; Mission Planner's full parameter list works just as well.

Reference versions

The parameters and screenshots below come from MicoAir's manual, whose screenshots show ArduCopter 4.7.0 on a MicoAir743 (v3) and PX4 v1.17.0 on a MicoAir743 V2. Robofusion has not yet flown its own unit — the first batch is still in transit — so treat this page as the manufacturer's procedure, re-checked against the ArduPilot and PX4 documentation, not as our own flight test. We will add a tested-combinations table when units arrive.

1 — Serial port (x = the serial port MicoVIO is wired to, e.g. SERIAL4 for UART4 on the H743 V2)

SERIALx_PROTOCOL = 2 # MAVLink 2
SERIALx_BAUD = 921 # 921600
SERIALx_OPTIONS = 1024 # ArduPilot 4.6 and earlier: don't forward MAVLink on this port
MAVy_OPTIONS = 2 # ArduPilot 4.7 and later: the same "don't forward" option, now per MAVLink channel
SERIALx and MAVy are two different numbers

ArduPilot numbers the MAVy_ parameter instances from MAV1, in the order of the serial ports configured for MAVLink — not by serial-port number. The first MAVLink port uses MAV1_ (normally SERIAL0, the USB port), the next uses MAV2_, and so on, so the y in MAVy_OPTIONS is usually not the x of your SERIALx port. In MicoAir's screenshot below, SERIAL1 is tagged MAV2, SERIAL4 is tagged MAV3 and SERIAL7 is MAV4 — so for MicoVIO on SERIAL4 the option lives in MAV3_OPTIONS on that board. Set SERIALx_PROTOCOL first, reboot, then read the MAV tag MicoConfigurator shows next to the port before touching MAVy_OPTIONS; don't copy MAV3 blindly. If the bitmask already has other bits set on your board, add bit 1 (value 2) rather than overwriting it.

MicoConfigurator port settings: SERIAL4 set to MAVLink2 at 921600 with MAV Options 2 for MicoVIO MicoConfigurator → Settings → Ports: SERIAL4 set to MAVLink 2, 921600, MAV Options 2 (ArduPilot 4.7). Note the MAV3 tag — this port is MAVLink channel 3. Screenshot from the Chinese UI; the English UI has the same layout.

2 — Visual odometry

VISO_TYPE = 3 # ODOMETRY-message source (listed as "VOXL" in the parameter docs — the same message format)
VISO_YAW_M_NSE = 0.1

Leave the other VISO_ parameters at their defaults and reboot the flight controller.

MicoConfigurator external vision page: VISO_TYPE 3 (VOXL), VISO_YAW_M_NSE 0.10 Sensors → External Vision: VISO_TYPE 3, VISO_YAW_M_NSE 0.10, everything else default.

3 — Rangefinder (the ToF arrives as a MAVLink DISTANCE_SENSOR)

RNGFND1_TYPE = 10 # MAVLink
RNGFND1_MAX_CM = 1200 # ArduPilot 4.6 and earlier (centimetres)
RNGFND1_MIN_CM = 1
RNGFND1_MAX = 12 # ArduPilot 4.7 and later (metres)
RNGFND1_MIN = 0.01
RNGFND1_ORIENT = 25 # down

Reboot or refresh parameters after setting RNGFND1_TYPE.

MicoConfigurator rangefinder page: RNGFND1_TYPE MAVLink, max 12 m, min 0.01 m, orientation Down, live distance 69 cm Sensors → Rangefinder: type MAVLink, 12 m / 0.01 m, orientation Down — the live waveform confirms the ToF is arriving.

4 — EKF sources

EK3_SRC1_POSXY = 6 # ExternalNav
EK3_SRC1_POSZ = 2 # RangeFinder
EK3_SRC1_VELXY = 6 # ExternalNav
EK3_SRC1_VELZ = 6 # ExternalNav
EK3_SRC1_YAW = 6 # ExternalNav (or 1 = Compass if you fly with a good compass — keep VISO_TYPE = 3 either way)

MicoConfigurator EKF page: EK3_SRC1 position and velocity sources ExternalNav, vertical position RangeFinder, yaw ExternalNav Settings → EKF → EK3_SRC1: horizontal position, horizontal velocity, vertical velocity and yaw from ExternalNav; vertical position from the rangefinder.

5 — Set the EKF origin (there is no GPS to do it for you)

Without GPS the EKF has no latitude/longitude reference and will not produce a position, however good the ODOMETRY stream is. After every boot, before arming, confirm an origin exists — and if nothing sets one automatically, set it yourself: connect Mission Planner, wait for the module to finish its ~12 s start-up, then right-click the map near your actual location and choose Set EKF Origin Here. This is not the same as Set Home Here: the EKF origin is the reference the estimator counts from, while Home — where RTL returns to — is a separate point normally set when you arm (ArduPilot explains the difference in Setting Home and/or EKF origin). If arming is refused, read the exact pre-arm message and fix the cause — usually a missing origin, a wrong EK3_SRC1_* source, or an estimator that is not yet healthy — rather than skipping checks; ArduPilot's pre-arm safety checks page lists each message and its remedy. Background: Non-GPS position estimation.

Check it — three layers, in order:

  1. Module alone. On USB, MicoAssistant shows tracking, a quality value and the position trace moving as you move the module (see Testing with MicoAssistant).
  2. Flight controller receiving. Because the MicoVIO port has MAVLink forwarding switched off, the sensor's ODOMETRY messages are not relayed to your ground station — Mission Planner's MAVLink Inspector will not show them, and that is normal. Look instead at MicoConfigurator's Sensors → External Vision page, Mission Planner's Messages tab for EKF3 IMU0 is using external nav data, or the VISP / VISV records in a dataflash log.
  3. EKF using it. The HUD shows a position, the EKF status is healthy, and Loiter can be armed. Only then hover in Loiter over a textured floor; the aircraft should sit still without stick input.

Waypoints and RTL without GPS are a further step — fly and verify Loiter first; we will add a separate section once we have tested them.

Configuration — PX4​

1 — Serial port (example: MicoVIO on TELEM 2)

MAV_1_CONFIG = TELEM 2 # the port MicoVIO is wired to — reboot after changing
MAV_1_MODE = Onboard
MAV_1_FORWARD = Disabled
SER_TEL2_BAUD = 921600 8N1

MicoConfigurator PX4 port settings: MAV1 on TELEM 2 (UART4), 921600 8N1, mode Normal, forwarding disabled PX4 ports page: the MAV1 instance assigned to the MicoVIO UART (TELEM 2 / UART4) at 921600 8N1 with forwarding disabled. MicoAir's text specifies MAV_1_MODE = Onboard while this screenshot still shows Normal — follow the text; Onboard is the mode intended for a sensor or companion stream.

2 — EKF2

EKF2_EV_CTRL = 9 # bit 0 horizontal position + bit 3 yaw
EKF2_HGT_REF = 2 # Range sensor

MicoConfigurator PX4 parameter search for EKF2_EV: EKF2_EV_CTRL set to 9, delay 0, noise mode EV-reported variance Parameters → search EKF2_EV: EKF2_EV_CTRL = 9; the other external-vision parameters stay at their defaults.

EKF2_EV_CTRL is a bitmask: 0 = horizontal position, 1 = vertical position, 2 = 3D velocity, 3 = yaw. MicoAir's recommended value 9 fuses horizontal position and yaw from the module and takes height from the ToF via EKF2_HGT_REF = 2; the module still sends velocity in ODOMETRY, but with this value the EKF does not fuse it. Check that EKF2_RNG_CTRL allows the rangefinder to be used, and verify in QGroundControl's MAVLink Inspector that ODOMETRY arrives at about 40 Hz (with MAV_1_FORWARD disabled it may not be relayed to QGC — check the EKF2 status and local position instead). PX4 flies Position mode on the local estimate without a global origin; missions and RTL need a global origin supplied over MAVLink, which we have not yet tested with this module.

Testing with MicoAssistant​

Connect the USB Type-C port to a computer and open MicoAssistant in a Chromium browser — no driver is normally needed; pick the module's serial port and any baud rate. The Data page shows tracking state, VIO quality (0–100), receive rate, position, body-frame velocity, attitude and ToF distance, live waveforms and an XY trace of where the module thinks it has moved. Wave it over a textured surface and watch the trace follow your hand before you ever put it on an aircraft. Firmware updates are done from the same tool.

MicoAssistant live data page for MicoVIO: tracking state, VIO quality 85/100, 56.8 Hz, position, body velocity, attitude, ToF distance, waveforms and XY trace MicoAssistant → Data while the module is tracking: quality 85/100 at 56.8 Hz, position and velocity, ToF distance and the XY trace of the module's movement. Chinese UI shown; the English UI is identical.

Operating limits — read before the first flight​

  • Light: needs more than ~1 lux. Dim rooms are fine; a dark hangar is not — add a downward light and it will track in tunnels and mines.
  • Texture: like any camera, it needs something to look at. A glossy uniform floor, still water or a perfectly plain carpet starve it of features. MicoAir specifies operation on low-texture and reflective floors and through hard lighting changes; that is a manufacturer claim we have not yet measured, so test your own floor before relying on it. A sensor that is standing still drifts very little — but standing still does not make loss of tracking impossible.
  • Height — three different numbers: the module can initialise from 1 cm above ground (not a ranging-accuracy figure); its visual tracking is rated to 30 m depending on texture and light; and the ToF ranges to 12 m in shade, about 8 m in full sun. With EK3_SRC1_POSZ = 2 the EKF takes height from the ToF, a configuration ArduPilot documents for low-altitude flight — what the estimator does once the ToF is out of range depends on firmware version and parameters, and we have not validated it. Keep GPS-free flights within the ToF's working range until MicoAir or we publish a tested procedure, and read ArduPilot's EKF source selection page before using the barometer as the height source alongside external navigation.
  • Speed and rotation: 10 m/s typical at 2 m height, 60° tilt, 300°/s. It is designed to survive spins and "dish-pan" orbit flight that would blind an optical flow sensor.
  • Boot: about 12 s to first data. Don't arm before the ODOMETRY stream appears.
  • Accuracy is relative and grows with distance flown: about 1 % typical, quoted as an RMS error over the whole track. Loop closure keeps a hover tight; it does not make the sensor absolute, and position is always relative to where the module initialised. For centimetre-level absolute position outdoors you still want RTK.

FAQ​

What is the MicoVIO and what does it do? A 16-g module with a global-shutter camera, IMU and ToF rangefinder that fuses them on board and sends relative position, velocity and attitude to the flight controller as MAVLink 2 ODOMETRY. ArduPilot and PX4 drones can hover, hold position, fly waypoints and return to launch with it where there is no GPS.

How is it different from an optical flow sensor like the MTF-01? Optical flow gives the autopilot a horizontal velocity; position is integrated from it and drifts. MicoVIO estimates full 6-DoF motion directly, stays locked through fast rotation thanks to the IMU, and adds local loop closure so a hover does not wander. Typical trajectory error is about 1 % of distance flown. Full comparison: VIO vs Optical Flow.

Which flight controllers work? ArduPilot ≥ 4.5.2 and PX4 on boards whose firmware includes external-vision support — H7 boards such as the H743 V2, H743 AIO and NxtPX4 V2. Most F405 boards do not.

Do I need a companion computer or ROS? No. Everything runs inside the 16-gram module. The traditional way to get VIO on an open-source drone is either a stereo camera (Intel RealSense D435) plus a Raspberry Pi or Jetson running a VIO package under ROS, or the discontinued T265 plus a companion computer bridging its pose into MAVLink — several hundred dollars, well over 100 g, and days of integration either way. MicoVIO replaces all of that with one UART cable and a handful of flight controller parameters.

Does it work outdoors and in low light? Yes, within limits: rated from ~1 lux and, per MicoAir, in bright sun and on low-texture or reflective floors (claims we have not yet measured); visual tracking rated to 30 m, ToF ~8 m in full sun and 12 m in shade — stay within the ToF's range until a tested procedure for higher flight exists. Total darkness needs an added light.

Is MicoVIO a replacement for the Intel RealSense T265? For most drone builders, yes. The T265 — discontinued by Intel — did the visual-inertial tracking itself but still needed a companion computer running a MAVLink bridge before ArduPilot or PX4 could use its pose. MicoVIO delivers the same kind of output, position, velocity and attitude from camera + IMU, straight to the flight controller as MAVLink 2 ODOMETRY, adds a ToF rangefinder for height and scale, and needs no computer in between. ArduPilot takes it through the external-navigation backend (VISO_TYPE 3) and PX4 through EKF2 external vision. See VIO vs Optical Flow for the full picture.

Is MicoVIO an obstacle-avoidance or mapping system? Treat it as an odometry sensor, not a perception system. The documented output is the aircraft's own position, velocity and attitude plus the height below it; local loop closure suppresses drift within one flight. MicoAir's current manual (October 2026) documents no obstacle detection, map export, image or depth stream, cross-session relocalisation, SDK or ROS interface — don't plan a purchase around those unless MicoAir confirms them. Obstacle avoidance needs separate sensors.

When can I buy it? First North American batch expected to reach our warehouse late October to mid-November 2026; orders ship after it arrives. Reserve by emailing info@robofusion.net — reserving costs nothing.

References​

What is manufacturer data, what is firmware documentation and what is Robofusion's own measurement is labelled as such throughout; until our first units arrive, nothing on this page is a Robofusion flight test.


Written and maintained by the Robofusion engineering team. Specifications from the MicoAir MicoVIO datasheet and user manual, 15 October 2026.