ODYX

On-device Visual-Inertial SLAM with GNSS fusion. Your own localization core, no ARCore.

Status
Live
Version
0.1.0
Platform
Android app
License
MIT
01 · Problem

Most Android apps that need a camera pose call ARCore and stop there. ODYX computes pose itself from raw sensor streams, so the whole localization stack is owned, GNSS can be fused for a global frame, and it can run on devices ARCore does not support.

02 · Architecture

How it is put together.

ODYX turns a phone's camera, IMU and raw GNSS into a globally georeferenced, drift-corrected 6-DoF pose and a live 3D map, computed entirely on the device. It is a from-scratch visual-inertial SLAM core built around a GTSAM fixed-lag smoother, with GTSAM, Boost, OpenCV, DBoW3 and RTKLIB cross-compiled into one native library. It exposes a PoseProvider interface so other apps can use it instead of ARCore. The README describes it as a research prototype: capture, time sync and front end run live on hardware, while VIO tuning against real motion remains.

Android sensor I/OTime syncapp/src/main/cpp/sync/Front endapp/src/main/cpp/frontend/Estimatorapp/src/main/cpp/backend/GNSSapp/src/main/cpp/gnss/Loop closureapp/src/main/cpp/loop/camera, IMU, GNSS streamscamera, IMU, GNSS strea…time-unified samplestime-unified samplestracks, inittracks, initloop constraintsloop constraintsGNSS factorsGNSS factorsAndroid sensor I/OTime syncapp/src/main/cpp/sync/Front endapp/src/main/cpp/frontend/Estimatorapp/src/main/cpp/backend/GNSSapp/src/main/cpp/gnss/Loop closureapp/src/main/cpp/loop/camera, IMU, GNSS streamscamera, IMU, GNSS strea…time-unified samplestime-unified samplestracks, inittracks, initloop constraintsloop constraintsGNSS factorsGNSS factors
FIG. 01Modules and data flows, from the repository layout and documentation.
  1. 1

    Android sensor I/O

    Camera2, IMU and raw GNSS capture in Kotlin

  2. 2

    Time sync

    Time-base unification onto a single REALTIME clock

    app/src/main/cpp/sync/
  3. 3

    Front end

    KLT tracking + ORB features, VIO initialisation and online calibration

    app/src/main/cpp/frontend/
  4. 4

    Estimator

    GTSAM fixed-lag smoother with visual, IMU preintegration and GNSS factors

    app/src/main/cpp/backend/
  5. 5

    GNSS

    Loose and tight GNSS factors (RTKLIB)

    app/src/main/cpp/gnss/
  6. 6

    Loop closure

    DBoW3 bag-of-words loop closure and relocalisation

    app/src/main/cpp/loop/
03 · Capabilities

Specification.

Estimator
GTSAM fixed-lag smoother fusing visual features, IMU preintegration and GNSS factors
GNSS modes
LOOSE (per-fix position factors, default) or TIGHT (raw pseudorange + Doppler via RTKLIB)
Sensors
Camera2 frames, 200 Hz SensorManager IMU, raw GnssMeasurement on one monotonic clock
Front end
KLT feature tracking + ORB; DBoW3 loop closure, pose-graph optimisation and relocalisation
Calibration
Online camera-IMU time offset and extrinsics, rolling-shutter compensation, in-app Allan-variance IMU logger
Output
Drift-corrected 6-DoF trajectory in a global ENU frame; sparse 3D map; PoseProvider API
Status
Research prototype; static or rotation-only starts do not initialise yet
Runs on
Android APK with a native C++ core (libodyx.so) built via NDK and Gradle
Stack
  • Kotlin
  • Jetpack Compose
  • C++17
  • Android NDK
  • GTSAM
  • Eigen
  • Boost
  • OpenCV
  • DBoW3
  • RTKLIB
  • Room
  • Kotlin coroutines
04 · Changelog

Releases.

  1. v0.1.0