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
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.
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.
- 1
chronyx-core
Capture, sync engine, clock layer, public API; no service, no UI
chronyx-core/ - 2
chronyx-mcap
MCAP writer and schemas; implements the core sink
chronyx-mcap/ - 3
chronyx-service
Foreground service and AIDL bound-service path passing frames as buffer handles
chronyx-service/ - 4
harness-app
Diagnostics and recorder app
harness-app/
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