Hi everyone,
We are a team at LuminousBees working on indoor drone choreography. Our entire fleet relies on ArduPilot, ranging from 5" outdoor RTK quads down to our sub-100-gram Mini Bee designed for safe, close-proximity indoor flights.
We are currently working on bringing SteamVR Lighthouse v2 tracking to ArduPilot to achieve millimeter indoor precision for large swarms. Our goal with this thread is not just to present a project, but to involve the ArduPilot dev community. We want to discuss the best approaches, hypotheses, and architectural decisions to ensure this is implemented into the ArduPilot core the right way.
The Challenge
Finding a low-cost, reliable solution for indoor positioning is notoriously difficult. Approaches like VIO and LIO require expensive embedded sensors and heavy compute on each drone, making swarms financially unfeasible. Motion Capture (MoCap) solves the per-drone cost issue, but the initial facility cost keeps it confined to well-funded labs.
We need a system where the infrastructure is a low, one-time cost, and the per-drone cost remains negligible.
The Hardware Approach: SteamVR Lighthouse V2
Coming from the VR world, the Lighthouse V2 tracking system inverts the perception problem: base stations sweep the room with infrared laser planes, and each drone only needs a cheap array of photodiode sensors to detect them. The intelligence lives in the geometry, not in the onboard hardware.
Each base station uses a single fast-spinning rotor that produces two angled “V”-shaped sweeps per rotation. Our receiver board uses the TS4231 light-to-digital converter paired with compatible photodiodes. Because Lighthouse v2 modulates its laser with a unique identifying code (no optical sync flash required), the receiver can recognize which base station it is seeing and recover timing from the sweeps alone.
By measuring the interval between the two sweep crossings, the system computes the azimuth and elevation of the sensor relative to the base station. With four sensors rigidly mounted on the drone and known base station poses, the full 6-DoF pose (position and orientation) becomes observable.
Prior Art
This approach is well-validated. Bitcraze uses this actively with their Crazyflie “Lighthouse positioning deck,” computing full pose entirely onboard with 2–4 cm Euclidean errors compared to MoCap. Independent robotics literature has also validated this down to RMS errors of ~7-11 mm using a self-calibration algorithm.
Adding a drone to this system means adding only a small sensor PCB and a microcontroller (tens of dollars), while the base stations are a one-time cost in the low hundreds.
How to best implement this in ArduPilot?
This is where we are looking for community guidance. To make this a robust, native integration, we have a few key architectural questions:
1. Visual Odometry Inspired Solution: The first idea that comes to mind when implementing this new position estimator is sending the calculated position to ArduPilot using VISION_POSITION_ESTIMATE. This MAVLink message is chosen instead of the preferred ODOMETRY because the Lighthouse localization doesn’t give us speed information. However, for the first implementation we expected to send blank rotation information and relying on the compass for Yaw estimate. Is this a problem? Should we use another MAVLink message?
2. Kalman Measurement Model VS Crossing Beams: On the Bitcrazy publication they evaluate a Kalman measurement model (lighthouse + IMU) based method for processing lighthouse information versus a purely algebraic method. Both work great in the experiments. Their final implementation is the EKF one. Since we hope to make the lighthouse positioning open and useful for as many people as we can, we want to hear what is the best implementation for the ArduPilot firmware. Should we send algebraic position information to the EK3 via ExternalNav or process the lighthouse information close to the AP firmware, merging it with IMU data at the core? Who in the community can help us understand the best development path to take?
Please provide us with your insights. Our aim is making this as community friendly as it can be!!
Also, we’lll come here with more questions and updates on the development!!

