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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support