Downloads · 30 days
0
Eyas/kiss-imu-hilti-encoder
kiss-imu-hilti-encoder is a other model from Eyas. Use it for the other task on the model card, and read the license before you ship it in a product. It is set up for pytorch. The card lists the license as bsd-3-clause.
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 p…
Downloads · 30 days
0
Access
Public
Updated May 31, 2026
Repo size
1.6 MB
Likes
0
Public
Click a slice to open those files.
.ckpt1.6 MB · 99%
From the Hugging Face model README
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:
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.
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).
site1_handheld_1,2,3,4, site2_handheld_4 (~9.3k windows)site1_handheld_5Baseline = 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.
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
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}.
BSD-3-Clause (academic). Based on KISS-IMU (Choi et al., ICRA 2026).
<!-- ml-intern-provenance -->This model repository was generated by ML Intern, an agent for machine learning research and development on the Hugging Face Hub.