Robotics
PyTorch
imu
inertial-odometry
self-supervised-learning
legged-robots
humanoid
quadruped
drone
File size: 8,024 Bytes
209b3db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48b27e8
 
 
 
 
 
209b3db
 
 
 
 
 
 
48b27e8
 
 
 
209b3db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
---
license: other
library_name: pytorch
pipeline_tag: robotics
tags:
- robotics
- imu
- inertial-odometry
- self-supervised-learning
- legged-robots
- humanoid
- quadruped
- drone
datasets:
- Open-IO/humanoid-g1-odometry
- Open-IO/mipo-go1-odometry
---

# SSIO: Self-Supervised Inertial Odometry — Checkpoints

[Paper](https://arxiv.org/abs/2610.25988) | [Project Page](https://ssio-imu.github.io) | [Code](https://github.com/amazon-far/SSIO) | [Collection](https://huggingface.co/collections/Open-IO/ssio-self-supervised-inertial-odometry-6ad670b4bf71f392cd23d1c8)

<div align="center">
<video autoplay loop muted playsinline controls width="80%">
  <source src="https://huggingface.co/Open-IO/SSIO/resolve/main/assets/teaser.mp4" type="video/mp4">
</video>
</div>

Every model in the tables of **[SSIO](https://ssio-imu.github.io)**, 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](assets/teaser_fig.png)

![SSIO pipeline: integration self-supervision from a frozen IMU integration teacher, then optional pose graph distillation](assets/pipeline.png)

## Checkpoints

One directory per table cell, `<dataset>/<recipe>/`, named after the recipe in
[`Config/experiment/<dataset>/<recipe>.yaml`](https://github.com/amazon-far/SSIO/tree/main/Config/experiment)
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`](https://huggingface.co/Open-IO/SSIO/tree/main/tlio/airio_full) 0.081 / 1.89 | [`tlio/airio`](https://huggingface.co/Open-IO/SSIO/tree/main/tlio/airio) 0.084 / 2.08 | [`tlio/ssio`](https://huggingface.co/Open-IO/SSIO/tree/main/tlio/ssio) 0.104 / 3.04 | [`tlio/ssio_pgd`](https://huggingface.co/Open-IO/SSIO/tree/main/tlio/ssio_pgd) 0.101 / 2.99 | – | – |
| EuRoC | `EuRoC_Test` | [`euroc/airio_full`](https://huggingface.co/Open-IO/SSIO/tree/main/euroc/airio_full) 0.335 / 3.72 | [`euroc/airio`](https://huggingface.co/Open-IO/SSIO/tree/main/euroc/airio) 0.344 / 3.72 | [`euroc/ssio`](https://huggingface.co/Open-IO/SSIO/tree/main/euroc/ssio) 0.423 / 9.03 | [`euroc/ssio_pgd`](https://huggingface.co/Open-IO/SSIO/tree/main/euroc/ssio_pgd) 0.403 / 9.93 | – | – |
| Blackbird | `BlackBird_Test` | [`blackbird/airio_full`](https://huggingface.co/Open-IO/SSIO/tree/main/blackbird/airio_full) 0.318 / 6.10 | [`blackbird/airio`](https://huggingface.co/Open-IO/SSIO/tree/main/blackbird/airio) 0.362 / 6.39 | [`blackbird/ssio`](https://huggingface.co/Open-IO/SSIO/tree/main/blackbird/ssio) 0.475 / 18.39 | [`blackbird/ssio_pgd`](https://huggingface.co/Open-IO/SSIO/tree/main/blackbird/ssio_pgd) 0.429 / 17.73 | – | – |
| MIPO (Go1) | `MIPO_Test` | [`mipo/airio_full`](https://huggingface.co/Open-IO/SSIO/tree/main/mipo/airio_full) 0.120 / 0.31 | [`mipo/airio`](https://huggingface.co/Open-IO/SSIO/tree/main/mipo/airio) 0.121 / 0.31 | [`mipo/ssio`](https://huggingface.co/Open-IO/SSIO/tree/main/mipo/ssio) 0.182 / 1.63 | [`mipo/ssio_pgd`](https://huggingface.co/Open-IO/SSIO/tree/main/mipo/ssio_pgd) 0.169 / 1.58 | [`mipo/airio_proprio`](https://huggingface.co/Open-IO/SSIO/tree/main/mipo/airio_proprio) 0.116 / 0.19 | [`mipo/ssio_proprio`](https://huggingface.co/Open-IO/SSIO/tree/main/mipo/ssio_proprio) 0.146 / 0.82 |
| GrandTour (ANYmal) | `ANYmal_Test` | [`grandtour/airio_full`](https://huggingface.co/Open-IO/SSIO/tree/main/grandtour/airio_full) 0.068 / 3.19 | [`grandtour/airio`](https://huggingface.co/Open-IO/SSIO/tree/main/grandtour/airio) 0.070 / 3.38 | [`grandtour/ssio`](https://huggingface.co/Open-IO/SSIO/tree/main/grandtour/ssio) 0.096 / 4.37 | [`grandtour/ssio_pgd`](https://huggingface.co/Open-IO/SSIO/tree/main/grandtour/ssio_pgd) 0.096 / 4.37 | [`grandtour/airio_proprio`](https://huggingface.co/Open-IO/SSIO/tree/main/grandtour/airio_proprio) 0.073 / 3.62 | [`grandtour/ssio_proprio`](https://huggingface.co/Open-IO/SSIO/tree/main/grandtour/ssio_proprio) 0.091 / 3.66 |
| Humanoid (G1) | `HumanoidOdom_Test` (*Proprio*: `HumanoidOdom_Joints_Test`) | [`humanoid/airio_full`](https://huggingface.co/Open-IO/SSIO/tree/main/humanoid/airio_full) 0.087 / 1.26 | [`humanoid/airio`](https://huggingface.co/Open-IO/SSIO/tree/main/humanoid/airio) 0.096 / 1.40 | [`humanoid/ssio`](https://huggingface.co/Open-IO/SSIO/tree/main/humanoid/ssio) 0.167 / 4.36 | [`humanoid/ssio_pgd`](https://huggingface.co/Open-IO/SSIO/tree/main/humanoid/ssio_pgd) 0.155 / 4.38 | [`humanoid/airio_proprio`](https://huggingface.co/Open-IO/SSIO/tree/main/humanoid/airio_proprio) 0.095 / 2.35 | [`humanoid/ssio_proprio`](https://huggingface.co/Open-IO/SSIO/tree/main/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`](https://github.com/amazon-far/SSIO/blob/main/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](https://github.com/amazon-far/SSIO) installed and the datasets under
`$DATA_ROOT`:

```bash
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:

```bash
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

```bibtex
@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},
}
```