Figure: Predicted trajectories and covariance ellipsoids from TLIO (left) and subequivariant EqNIO (ours) (right) for 5 identical trajectories with different IMU frames. The de-rotated trajectories and covariance ellipsoids of TLIO demonstrate significant inconsistency, while the ones by EqNIO(ours) are perfectly aligned.
This repository contains code that implements the subequivariant framework described in Jayanth et al. ICLR'25, and the used dataset. Paper: ICLR 2025, arXiv, ICLR 2025 Project Page
Please cite the following paper if you use the code or paper:
Royina Karegoudra Jayanth*, Yinshuang Xu*, Ziyun Wang, Evangelos Chatzipantazis, Kostas Daniilidis †, Daniel Gehrig †, "EqNIO: Subequivariant Neural Inertial Odometry", The Thirteenth International Conference on Learning Representations (ICLR), 2025. * denotes equal contribution. † denotes equal advising.
@InProceedings{Jayanth25iclr,
title = {Eq{NIO}: Subequivariant Neural Inertial Odometry},
author = {Royina Karegoudra Jayanth* and Yinshuang Xu* and Ziyun Wang and Evangelos Chatzipantazis and Kostas Daniilidis and Daniel Gehrig},
booktitle = {The Thirteenth International Conference on Learning Representations},
year = {2025},
url = {https://openreview.net/forum?id=C8jXEugWkq}
}
Clone the repo
git clone https://github.com/RoyinaJayanth/EqNIO.git
or
git clone git@github.com:RoyinaJayanth/EqNIO.git --recursive
All dependencies can be installed using conda via
conda env create -f environment.yaml
Then the virtual environment is accessible with:
conda activate eqnio
Next commands should be run from this environment.
original work: website
We apply our framework to this filter-based inertial odometry architecture.
- TLIO Dataset: Download Here or with the following command (with the conda env activated) at the root of the repo:
gdown 14YKW7PsozjHo_EdxivKvumsQB7JMw1eg
mkdir -p local_data/ # or ln -s /path/to/data_drive/ local_data/
unzip golden-new-format-cc-by-nc-with-imus-v1.5.zip -d local_data/
rm golden-new-format-cc-by-nc-with-imus-v1.5.zip
https://drive.google.com/file/d/14YKW7PsozjHo_EdxivKvumsQB7JMw1eg/view?usp=share_link
The dataset tree structure looks like this.
Assume for the examples we have extracted the data under root directory local_data/tlio_golden
:
local_data/tlio_golden
├── 1008221029329889
│ ├── calibration.json
│ ├── imu0_resampled_description.json
│ ├── imu0_resampled.npy
│ └── imu_samples_0.csv
├── 1014753008676428
│ ├── calibration.json
│ ├── imu0_resampled_description.json
│ ├── imu0_resampled.npy
│ └── imu_samples_0.csv
...
├── test_list.txt
├── train_list.txt
└── val_list.txt
imu0_resampled.npy
contains calibrated IMU data and processed VIO ground truth data.
imu0_resampled_description.json
describes what the different columns in the data are.
The test sequences contain imu_samples_0.csv
which is the raw IMU data for running the filter.
calibration.json
contains the offline calibration.
Attitude filter data is not included with the release.
- Aria Dataset: Download Here
- TLIO + SO(2) Eq. Frame: Download Here
- TLIO + O(2) Eq. Frame: Download Here
(Optional) Download the dataset and the pre-trained models.
To train and test NN run TLIO-master/src/main_net.py
with mode argument. Please refer to the source code for the full list of command line arguments.
python3 TLIO-master/src/main_net.py --mode train \
--root_dir local_data/tlio_golden \
--out_dir models/tlio_o2 \
--batch_size 1024 \
--epochs 50 \
--arch eq_o2_frame_fullCov_2vec_2deep
For testing run the following
python3 TLIO-master/src/main_net.py --mode test \
--root_dir local_data/tlio_golden \
--out_dir models/tlio_o2/test \
--model_path models/tlio_o2/checkpoint_best.pt\
--arch eq_o2_frame_fullCov_2vec_2deep
To run the EKF run TLIO-master/src/main_filter.py
. Please refer to the source code for the full list of command line arguments.
python3 TLIO-master/src/main_filter.py --root_dir local_data/tlio_golden \
--out_dir models/tlio_o2/ekf_test \
--model_path models/tlio_o2/checkpoint_best.pt \
--model_param_path models/tlio_o2/parameters.json
To generate the NN metrics run src/analysis/NN_output_metrics.py
python3 TLIO-master/src/analysis/NN_output_metrics.py --files models/tlio_o2/test\
--output_file_name tlio_nn_results
and for EKF metrics run src/analysis/EKF_output_metrics.py
python3 TLIO-master/src/analysis/EKF_output_metrics.py --files models/tlio_o2/ekf_test\
--ground_truth_path local_data/tlio_golden\
--output_file_name tlio_ekf_results
Original work: website
We show the benefits of our framework applied to this end-to-end Neural Network architecture.
-
RoNIN Dataset: Download Here or here * Note: Only 50% of the Dataset has been made publicly available. In this work we train on only 50% of the data.
-
RIDI Dataset: Download Here
-
OXOID Dataset: Download Here
- RONIN + 50% data + SO(2) Eq. Frame: Download Here
- RONIN + 50% data + O(2) Eq. Frame: Download Here
Download the dataset and the pre-trained models.
To train/test RoNIN ResNet model run source/ronin_resnet.py
with mode argument. Please refer to the source code for the full list of command line arguments.
python3 ronin_resnet.py --mode train \
--train_list lists/list_train.txt \
--val_list lists/list_val.txt \
--step_size 10 \
--root_dir ronin_data/all_data \
--out_dir output/ronin_o2 \
--arch resnet18_eq_frame_o2
and for testing run
python3 ronin_resnet.py --mode test \
--test_list lists/list_test_unseen.txt \
--root_dir ronin_data/all_data \
--out_dir output/ronin_o2/test_unseen \
--arch resnet18_eq_frame_o2
--model_path output/ronin_o2/checkpoints/checkpoint_38.pt