Necessity Robotics

Open-source release (Apache-2.0) · coming soon

xclean

Real-time stereo visual-inertial SLAM, built in India. Python, with GPU code written in CuPy and CPU hot paths in Numba: no C++ build step, no ROS. It runs natively on Windows 11 and is built for a Luxonis OAK-D-Lite stereo camera.

Code: coming soon Results

The code is not public yet.

The open-source release (Apache-2.0) comes after its GPU checks; the repository will be github.com/necessityrobotics/xclean. Until then, github.com/necessityrobotics is our organisation page.

What it does

xclean estimates the pose of a stereo camera at every frame, while it moves. Every pose is published live from a solve that contains that frame, and loop corrections are applied live.

xclean is a stereo visual-inertial SLAM system: it uses the IMU while a built-in consistency check accepts it, and otherwise continues as stereo visual odometry with loop closure. In the final board the IMU stayed in use to the end on 50 of 216 runs (mostly EuRoC and 4Seasons). On MADMAX, Rosario and our own OAK-D-Lite recordings the check dropped or refused it. KITTI has no IMU. Per dataset.

  • Front end on the GPU: stereo feature tracking.
  • Inertial: IMU preintegration, with an online consistency check (it can drop or refuse the IMU) and an online camera-IMU clock-offset estimate.
  • Back end on the GPU: a sliding-window factor graph.
  • Full SLAM: loop closure, relocalisation and map reuse.
  • No learned networks in the SLAM pipeline.

"Written in CuPy" does not mean "pure Python": CuPy compiles our CUDA C source at first use (NVRTC), and the CPU hot paths are compiled by Numba.

In numbers

20.4ms
median frame-to-pose latency (p95 26.4 ms)
216runs
live paced runs on 72 routes
0lost
lost runs of record on the 38 held-out routes

Measured on one desktop (RTX 5090) with its normal background load, host-side from frame arrival to the loop-corrected pose, in our development environment. The 38 routes were held out from xclean's development; 10 of them were run in a set-aside first launch whose results were never read. Robustness caveat: on 2 of those 38 routes a replay attempt crashed or hung, and the unsupported-frames check passed on 9 routes, failed on 4 and is pending on 25 (all MADMAX, whose ground truth has known faults). The engine was frozen with one of its pre-registered tests (K14) failed on two routes and passed on a third (kitti_09) only through its no-harm clause; details. Source: the final board of 2026-10-30 (data/board.json on this site).

Accuracy against other systems, wins and losses, is on the results page.

Install and run

Install and run instructions will be published with the code. What you will need: an NVIDIA GPU and driver. The full requirements come with the release.

Known issue (being fixed before release)

In the current install environment the live engine (paced and lock-step, which use the GPU front end on an NVIDIA machine) stops at a start-up self-check: its GPU and CPU results for small 3×3 solves do not match. The final board ran in our development environment, which is a different one. We will publish the install route once it reproduces the engine.

Tested, and not yet

WhatStatus
The engine on the final board: 216 live paced runs on 72 routes, one frozen build, Windows 11, RTX 5090Done, in our development environment
Release package: unit tests45 pass on CPU. They do not check the install environment's GPU path.
Release package: lock-step identity with the frozen engine, on CPU (5 routes)Identical, except once: the last frame of rosario_01 differed in 1 of 4 runs, from an end-of-stream race in the frozen engine's lock-step feeder
Release package: offline runner on the GPUByte for byte the frozen engine's output under deterministic settings. Its default settings vary from run to run, for the frozen engine too.
Release package: paced and live engine, and lock-step on the GPUBlocked by the install-environment issue above
Live on-device run of the release on the OAK-D-LitePending. Before the engine was frozen, only a 90 s static on-device smoke test ran.
Our OAK-D-Lite routes on the boardRecorded on the camera and replayed in real time (paced); no ground truth
Smaller GPUs, Linux, a clean machineNot tested: all timings come from one desktop

Licence

xclean will be released under the Apache License 2.0 (release coming soon): free for personal, research and commercial use.

If you ship xclean in a product, you must credit it.

Keep the NOTICE file and show its text where your product lists third-party software (an About screen, the documentation or the credits). If you distribute modified files, mark them as changed.

Using it in a service or inside your company? We would love to know: add your name to USERS.md in the repository once it is public, or write to necessityrobotics@gmail.com (optional).

The datasets used in our evaluation keep their own licences and are not included. The place-recognition vocabulary shipped in the package is derived from TartanAir images (CC BY 4.0); its attribution and the licences of the dependencies are in THIRD_PARTY.md and on our data credits page.