KISS-IMU Encoder — Hilti SLAM Challenge 2023 (Alphasense IMU)
A learned IMU correction/uncertainty encoder (KISS-IMU IMUNet: 6-ch CNN + 2×GRU
with accel/gyro correction heads and per-axis uncertainty heads), trained
self-supervised against Hilti LiDAR odometry via the --use-gt path.
From raw 400 Hz 6-axis IMU it produces, per ~0.1 s window:
- a 128-d motion feature (encoder embedding),
- bias/noise-corrected accel & gyro (residual corrections added to raw),
- per-axis covariance (calibrated aleatoric uncertainty),
- (via pypose) a short-horizon relative pose preintegration.
Intended use: an uncertainty-aware IMU front-end for a fusion/SLAM backend
(IMU preintegration factors weighted by the learned covariance), or motion-
feature extraction. See imu_encoder.py.
Training data & supervision
Hilti SLAM Challenge 2023 handheld sequences (Alphasense IMU 400 Hz + Hesai
PandarXT-32 10 Hz). Supervision = the provided frame-to-frame LiDAR odometry
(relative_poses.npz) expressed in a gravity-aligned, z-up IMU body world
frame (LiDAR→IMU extrinsic estimated from data by gyro/LiDAR hand-eye;
consistent euler ≈ (-178°,-1°,-89.5°) across all sequences).
- Train:
site1_handheld_1,2,3,4,site2_handheld_4(~9.3k windows) - Validation (held out):
site1_handheld_5
Metrics & honest assessment
Baseline = raw IMU strapdown integration (the Alphasense IMU is high quality).
| metric (val: site1_handheld_5) | RAW IMU | encoder (run3, ep2) |
|---|---|---|
| per-window relative-motion RRE (pypose, 8-win) | 1.82° | 1.72° (better) |
| per-axis covariance (usable as factor weight) | none | calibrated (~0.6 acc, ~0.1–0.2 gyr) |
| RPE@1s endpoint RTE / RRE | 1.45 m / 5.95° | 1.57 m / 6.00° (≈ raw) |
| RPE@5s endpoint RTE / RRE | 33 m / 13.3° | 36 m / 15.2° (slightly worse) |
The encoder improves per-window relative motion and adds calibrated
uncertainty — the signal a fusion backend actually consumes. It does not
beat raw IMU on long-horizon pure dead-reckoning, because the --use-gt label
(raw LiDAR odometry) carries a slow vertical (z) drift that a point-correction
network partially fits. The principled fix is the full self-supervised
pipeline (ICP + pose-graph optimization fuses IMU+LiDAR to produce
gravity-consistent, drift-reduced labels) — supported in this repo
(--use-gt off) once a live LiDAR-odometry backend is wired in.
Usage
from imu_encoder import IMUEncoder # uses modeling_imunet.py
import numpy as np
enc = IMUEncoder("best_model.ckpt", device="cuda:0")
acc = np.zeros((40,3), np.float32); acc[:,2] = 9.81 # (T,3) m/s^2, IMU body frame (gravity incl.)
gyr = np.zeros((40,3), np.float32) # (T,3) rad/s
feat = enc.encode(acc, gyr) # (D,128) motion features
out = enc.correct(acc, gyr) # corrected acc/gyr + per-axis covariance
mot = enc.preintegrate(acc, gyr, dt=np.full(40,1/400.,np.float32)) # rel pose
Architecture
Conv1d(6→32, k=10, s=5) → GELU → Dropout → GRU(32→64) → GRU(64→128) → 4 MLP heads {accel-correction, gyro-correction, accel-logvar, gyro-logvar}.
License
BSD-3-Clause (academic). Based on KISS-IMU (Choi et al., ICRA 2026).
Generated by ML Intern
This model repository was generated by ML Intern, an agent for machine learning research and development on the Hugging Face Hub.
- Try ML Intern: https://smolagents-ml-intern.hf.space
- Source code: https://github.com/huggingface/ml-intern