Robotics
PyTorch
imu
inertial-odometry
self-supervised-learning
legged-robots
humanoid
quadruped
drone

SSIO: Self-Supervised Inertial Odometry β€” Checkpoints

Paper | Project Page | Code | Collection

Every model in the tables of SSIO, which trains inertial odometry from a robot's own unlabeled IMU stream, with no velocity or position labels. SSIO trains in two steps: Integration Self-Supervision, where the network learns body-frame velocity from an IMU integration teacher on short windows ("Ours"), and optional Pose Graph Distillation, which fine-tunes it on sequence-consistent velocities from a pose graph ("Ours (w/ PGD)"). The supervised AirIO baselines are released alongside.

SSIO (orange) vs. supervised AirIO (blue): trajectories and average velocity error on six embodiments

SSIO pipeline: integration self-supervision from a frozen IMU integration teacher, then optional pose graph distillation

Checkpoints

One directory per table cell, <dataset>/<recipe>/, named after the recipe in Config/experiment/<dataset>/<recipe>.yaml that retrains it (airio_full is the airio recipe with network=airio). Scores are the released checkpoint's AVE (m/s) / ATE (m) on the test split. AirIO and AirIO† are supervised; the other columns are self-supervised. Proprio adds joint states (and, on MIPO, the four calf-mounted IMUs) to the network input.

Dataset Test split AirIO AirIO† Ours Ours (w/ PGD) AirIO† + Proprio Ours + Proprio
TLIO TLIO_Test tlio/airio_full 0.081 / 1.89 tlio/airio 0.084 / 2.08 tlio/ssio 0.104 / 3.04 tlio/ssio_pgd 0.101 / 2.99 – –
EuRoC EuRoC_Test euroc/airio_full 0.335 / 3.72 euroc/airio 0.344 / 3.72 euroc/ssio 0.423 / 9.03 euroc/ssio_pgd 0.403 / 9.93 – –
Blackbird BlackBird_Test blackbird/airio_full 0.318 / 6.10 blackbird/airio 0.362 / 6.39 blackbird/ssio 0.475 / 18.39 blackbird/ssio_pgd 0.429 / 17.73 – –
MIPO (Go1) MIPO_Test mipo/airio_full 0.120 / 0.31 mipo/airio 0.121 / 0.31 mipo/ssio 0.182 / 1.63 mipo/ssio_pgd 0.169 / 1.58 mipo/airio_proprio 0.116 / 0.19 mipo/ssio_proprio 0.146 / 0.82
GrandTour (ANYmal) ANYmal_Test grandtour/airio_full 0.068 / 3.19 grandtour/airio 0.070 / 3.38 grandtour/ssio 0.096 / 4.37 grandtour/ssio_pgd 0.096 / 4.37 grandtour/airio_proprio 0.073 / 3.62 grandtour/ssio_proprio 0.091 / 3.66
Humanoid (G1) HumanoidOdom_Test (Proprio: HumanoidOdom_Joints_Test) humanoid/airio_full 0.087 / 1.26 humanoid/airio 0.096 / 1.40 humanoid/ssio 0.167 / 4.36 humanoid/ssio_pgd 0.155 / 4.38 humanoid/airio_proprio 0.095 / 2.35 humanoid/ssio_proprio 0.161 / 3.20

The released "Ours (w/ PGD)" checkpoints do not match the paper's PGD row exactly; Doc/recipes.md lists the paper and checkpoint scores side by side, with the recipe that retrains each run.

Repository Layout

<dataset>/                 tlio, euroc, blackbird, mipo, grandtour, humanoid
β”œβ”€β”€ airio_full/            AirIO              (train_ssio.py, supervised)
β”œβ”€β”€ airio/                 AirIO†             (train_ssio.py, supervised)
β”œβ”€β”€ ssio/                  Ours               (train_ssio.py)
β”œβ”€β”€ ssio_pgd/              Ours (w/ PGD)      (train_pgd.py, warm-started from ssio/)
β”œβ”€β”€ airio_proprio/         AirIO† + Proprio   (mipo, grandtour, humanoid)
└── ssio_proprio/          Ours + Proprio     (mipo, grandtour, humanoid)
calibration/grand_tour/anymal_imu_gt_offsets_per_imu.json

Each directory holds best_model.pt, a bare PyTorch state_dict selected on the lowest validation loss (no labels), and the training run's Hydra config in .hydra/. The GrandTour calibration file holds the per-IMU IMU-to-ground-truth time offsets the GrandTour runs were trained with; it is not part of the GrandTour release.

Quick Usage

With the SSIO code installed and the datasets under $DATA_ROOT:

hf download Open-IO/SSIO --include "euroc/ssio/*" --local-dir ckpts
python evaluate.py ckpts/euroc/ssio --checkpoint best_model.pt --data Config/dataset/EuRoC_Test.yaml

Always pass --checkpoint best_model.pt and --data: the released runs ship no checkpoint_*.pt and store their splits under val_dataset / test_dataset. To fine-tune a released "Ours" run with Pose Graph Distillation:

python train_pgd.py +experiment=euroc/ssio_pgd train.resume_from=file:ckpts/euroc/ssio/best_model.pt

The evaluator reports AVE (average velocity error, m/s, the primary metric), ATE (RMSE of the position error, m), Ξ”v error, and RVTE / nRVTE.

Citation

@misc{qiu2026ssioselfsupervisedinertialodometry,
      title={SSIO: Self-Supervised Inertial Odometry},
      author={Yuheng Qiu and Yutian Chen and Carlton Cort and Weison Huang and Shibo Zhao and Pieter Abbeel and Rocky Duan and Koushil Sreenath and C. Karen Liu and Carmelo Sferrazza and Junyi Geng and Sebastian Scherer and Guanya Shi},
      year={2026},
      eprint={2610.25988},
      archivePrefix={arXiv},
      primaryClass={cs.RO},
      url={https://arxiv.org/abs/2610.25988},
}
Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading

Datasets used to train Open-IO/SSIO

Collection including Open-IO/SSIO

Paper for Open-IO/SSIO