CHRONYX

Camera, IMU, GNSS and microphone from an Android phone, time-aligned on one clock in MCAP

Status
Research
Version
No tagged release
Platform
Android app
License
Apache-2.0
01 · Problem

Each phone sensor stamps time on a different clock, thread and rate, so a naively 'synchronized' dataset can be wrong by tens of milliseconds, which is the difference between a usable VIO trajectory and garbage. CHRONYX fixes this at the source by normalising every sample to one master clock.

02 · Architecture

How it is put together.

CHRONYX is an Android capture kernel that pulls camera, IMU, GNSS and microphone data off a phone and normalises every sample to one monotonic clock (BOOTTIME). It writes the aligned streams into an MCAP file that opens in Foxglove with no manual offset, and hands time-aligned bundles to a perception head through a small Kotlin API. The project is a multi-module Gradle build: a core library, an MCAP writer, a foreground/bound service, and a diagnostics and recorder harness app.

chronyx-corechronyx-core/chronyx-mcapchronyx-mcap/chronyx-servicechronyx-service/harness-appharness-app/BOOTTIME-normalised samples to MCAP sinkBOOTTIME-normalised sam…synced bundles and diagnosticssynced bundles and diag…chronyx-corechronyx-core/chronyx-mcapchronyx-mcap/chronyx-servicechronyx-service/harness-appharness-app/BOOTTIME-normalised samples to MCAP sinkBOOTTIME-normalised sam…synced bundles and diagnosticssynced bundles and diag…
FIG. 01Modules and data flows, from the repository layout and documentation.
  1. 1

    chronyx-core

    Capture, sync engine, clock layer, public API; no service, no UI

    chronyx-core/
  2. 2

    chronyx-mcap

    MCAP writer and schemas; implements the core sink

    chronyx-mcap/
  3. 3

    chronyx-service

    Foreground service and AIDL bound-service path passing frames as buffer handles

    chronyx-service/
  4. 4

    harness-app

    Diagnostics and recorder app

    harness-app/
03 · Capabilities

Specification.

Sensors
Camera (Camera2 direct, mid-exposure timestamps, rolling-shutter skew), IMU (raw + calibrated), GNSS (fixes + raw measurements), microphone (UNPROCESSED)
Clock
All samples on SystemClock.elapsedRealtimeNanos() (BOOTTIME), with IMU clock-base detection and correction
Output
MCAP with 11 channels (Foxglove CompressedVideo, CameraCalibration, LocationFix, IMU, audio, markers, diagnostics) + JSON manifest
On-device check (Galaxy A17, Android 16)
4.59 s cross-channel span for a 4.6 s capture; IMU 247 Hz; 0 out-of-order messages; indexed, seekable MCAP
Field operation
Foreground service, crash-safe file recovery, adaptive thermal policy, pre-flight gating, per-channel drop telemetry
API
Kotlin builder config; session.bundles flow of frame + IMU window + interpolated GNSS; timestamped markers
Platform
minSdk 26, JDK 17, Android SDK platform 34, arm64 device
Runs on
Android library plus a harness APK installed via Gradle on an arm64 device
Stack
  • Kotlin
  • Android Camera2
  • Jetpack Compose
  • Protobuf (lite)
  • Foxglove MCAP Java writer
  • Foxglove schemas
  • AIDL
  • Play Services Location