Original Raw Inertial-Nav Logger · 双通道运动数据采集器
ORION 是一款面向机器学习数据集的 Android 运动数据采集应用。它以 IMU(惯性测量单元)+ GNSS(卫星定位)双通道独立采集的方式记录原始运动数据,并以双 CSV 文件格式输出,直接对接下游 PyTorch 训练流水线(motion-ml V6 会话数据集格式)。
应用内名称:ORION(versionName
1.5.2/ versionCode2)
- 双通道独立采集
- IMU:加速度计 + 陀螺仪 + 旋转矢量(欧拉角),采样率约 50 Hz(
SENSOR_DELAY_GAME) - GNSS:原生
LocationManager定位 + GNSS 卫星状态监听,采样率约 1 Hz(不依赖 Google Play Services)
- IMU:加速度计 + 陀螺仪 + 旋转矢量(欧拉角),采样率约 50 Hz(
- 5 种运动模式标注:静止 / 行走 / 电动自行车 / 汽车 / 火车(或更高速)
- 实时遥测仪表盘
- GPS 速度、累计里程、最高/平均速度
- 瞬时 G 力、纵向/横向 G 力、峰值 G 力
- 卫星锁定数、定位精度、HDOP、定位供应商
- 电池电量、IMU/GNSS 实测采样率、采集质量评估(GOOD/FAIR/POOR)
- 前台服务录制(
foregroundServiceType="location"):息屏/切后台持续采集,通知栏实时状态 - 双 CSV 独立落盘:Android 10+ 走 MediaStore,低版本走公共存储
Documents/MotionRecorder/ - 设置页:跟随系统 / 浅色 / 深色主题切换(DataStore 持久化)
| 组件 | 选型 |
|---|---|
| UI | Jetpack Compose + Material 3(BOM 2026.06.01) |
| 语言 | Kotlin 2.2.10 |
| 构建 | AGP 9.3.1 · Gradle 9.5.0(Kotlin DSL) |
| 架构 | MVVM:MainActivity + MainViewModel + RecordingService(LifecycleService) |
| 异步 | Kotlin Coroutines / Flow(StateFlow 状态同步) |
| 导航 | Navigation Compose 2.9.8 |
| 存储 | DataStore Preferences 1.2.1 |
| CSV | opencsv 5.12.0(本应用为自研轻量写入) |
| 最低系统 | Android 8.0(API 26),targetSdk 34,compileSdk 37 |
- JDK 17(
sourceCompatibility/targetCompatibility= 17) - Android SDK Platform 37
- Gradle Wrapper 9.5.0(首次构建自动下载;国内网络建议将
gradle-wrapper.properties中的发行地址替换为腾讯镜像)
# 调试 APK
./gradlew assembleDebug
# 产物: app/build/outputs/apk/debug/app-debug.apk
# Release(当前未开启混淆)
./gradlew assembleRelease使用 Android Studio 打开项目根目录直接同步运行即可。
- 首次启动:授权「精确位置」「通知」权限(通知权限仅 Android 13+ 需要)
- 选择运动模式:在主页面上选择本次采集对应的运动类型
- 开始录制:点击录制按钮,应用进入前台服务录制模式,可息屏/切后台
- 停止录制:点击停止,数据自动写入
Documents/MotionRecorder/,并弹出保存成功对话框(含路径与样本数)
| 系统版本 | 保存路径 |
|---|---|
| Android 10+ | Documents/MotionRecorder/(MediaStore,MIME: text/csv) |
| Android 8–9 | /storage/emulated/0/Documents/MotionRecorder/ |
每个会话输出两个文件(以所选模式和时间戳命名,如 CAR_20260811_143000_imu.csv):
| 列 | 字段 | 单位 | 说明 |
|---|---|---|---|
| 1 | timestamp |
ms | 采集时刻(System.currentTimeMillis()) |
| 2–4 | acc_x acc_y acc_z |
m/s² | 三轴线性加速度 |
| 5–7 | gyro_x gyro_y gyro_z |
rad/s | 三轴角速度 |
| 8–10 | roll pitch yaw |
deg | 旋转矢量换算的欧拉角 |
| 11 | label |
— | 运动模式标签(STATIONARY/WALKING/CYCLING/CAR/TRAIN) |
| 列 | 字段 | 单位 | 说明 |
|---|---|---|---|
| 1 | timestamp |
ms | GNSS 定位时刻(Location.time) |
| 2 | latitude |
deg | 纬度 |
| 3 | longitude |
deg | 经度 |
| 4 | altitude |
m | 海拔 |
| 5 | speed |
m/s | 地速(统一 m/s,非 km/h) |
| 6 | bearing |
deg | 航向角 |
| 7 | accuracy |
m | 水平定位精度 |
| 8 | satelliteCount |
— | 参与解算的卫星数(usedInFix) |
| 9 | fixStatus |
— | 定位状态:LOCKED(accuracy < 20m)/ ACTIVE |
数据有效性过滤:纬度/经度为 0 或
accuracy <= 0的定位点会被丢弃。
app/src/main/java/com/motionrecorder/
├── MainActivity.kt # 主 Activity:权限请求 + 服务绑定 + 页面导航
├── data/
│ ├── ImuCollector.kt # IMU 传感器采集器(50Hz,含欧拉角换算)
│ ├── GNSSCollector.kt # GNSS 采集器(原生 LocationManager,1Hz)
│ ├── SensorDataRepository.kt # 数据仓库:双缓冲 + 双 CSV 落盘
│ ├── MotionMode.kt # 运动模式枚举
│ ├── RecordingUiState.kt # 录制 UI 状态 + 质量/连接状态枚举
│ ├── SettingsRepository.kt # 主题设置(DataStore)
│ ├── GNSSFeatureProvider.kt # GNSS 特征接口(为未来 IMU+GNSS 融合预留)
│ └── model/
│ ├── IMURecord.kt # IMU 数据模型 + CSV 序列化
│ ├── GNSSRecord.kt # GNSS 数据模型 + CSV 序列化
│ └── MotionSession.kt # 会话模型(独立 IMU/GNSS 流)
├── service/
│ └── RecordingService.kt # 前台录制服务:采集编排 + 遥测统计 + 通知
├── ui/ # Compose 页面(模式选择/录制/设置/保存成功)
├── viewmodel/
│ └── MainViewModel.kt # 状态同步 + 录制控制 + 主题
└── ui/theme/ # 主题(支持深色模式)
本应用是 DG-LAB 运动识别流水线的数据采集端:
MotionRecorder (本应用, Android) ──双CSV ──> motion-ml (PyTorch 训练, V6 会话数据集)
- motion-ml:PyTorch 时间序列分类流水线(LSTM / CNN-LSTM),直接消费本应用产出的双 CSV 会话数据
- 本应用面向数据集采集设计,数据只写不读、不上传,请妥善保管个人轨迹数据
- GNSS 精度受环境(楼宇遮挡、隧道)影响,建议开阔场地采集;
accuracy >= 20m时里程累计自动暂停 - 若需修改 Gradle 发行源,编辑
gradle/wrapper/gradle-wrapper.properties的distributionUrl