SaDVIO
Using SaDVIO Library with your own Dataset

This tutorial explains how to use the SaDVIO library with your own dataset. It covers the necessary steps to prepare your data, create a proper calibration file, and run the library. Introduction

To use SaDVIO with your own dataset, you need to satsify the following:

  • A dataset containing synchronized image measurements (+ IMU)
  • A calibration file describing the intrinsic and extrinsic parameters of your sensor suite.

Dataset Format

The configuration of your dataset should be stored in .yaml file, itself stored in a folder containing a dataset folder and a config.yaml file. The config.yaml file contains all the SLAM related parameters, and the dataset folder should contain a bunch of .yaml file that describes each dataset. For instance, the eth.yaml file (e.g. for the EUROC dataset) looks like:

# General sensor definitions.
dataset: EUROC
ncam: 2
camera_0:
topic: /cam0/image_raw
# Sensor extrinsics wrt. the body-frame.
T_BS:
cols: 4
rows: 4
data: [0.0148655429818, -0.999880929698, 0.00414029679422, -0.0216401454975,
0.999557249008, 0.0149672133247, 0.025715529948, -0.064676986768,
-0.0257744366974, 0.00375618835797, 0.999660727178, 0.00981073058949,
0.0, 0.0, 0.0, 1.0]
# Camera specific definitions.
rate_hz: 20
resolution: [752, 480]
projection_model: pinhole
intrinsics: [458.654, 457.296, 367.215, 248.375] #fu, fv, cu, cv
distortion_model: radial-tangential
distortion_coefficients: [-0.28340811, 0.07395907, 0.00019359, 1.76187114e-05]
camera_1:
topic: /cam1/image_raw
# Sensor extrinsics wrt. the body-frame.
T_BS:
cols: 4
rows: 4
data: [0.0125552670891, -0.999755099723, 0.0182237714554, -0.0198435579556,
0.999598781151, 0.0130119051815, 0.0251588363115, 0.0453689425024,
-0.0253898008918, 0.0179005838253, 0.999517347078, 0.00786212447038,
0.0, 0.0, 0.0, 1.0]
# Camera specific definitions.
rate_hz: 20
resolution: [752, 480]
projection_model: pinhole
intrinsics: [457.587, 456.134, 379.999, 255.238] #fu, fv, cu, cv
distortion_model: radial-tangential
distortion_coefficients: [-0.28368365, 0.07451284, -0.00010473, -3.55590700e-05]
imu:
topic: /imu0
T_BS:
cols: 4
rows: 4
data: [1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0]
rate_hz: 200
# inertial sensor noise model parameters (static)
gyroscope_noise_density: 1.6968e-04 # [ rad / s / sqrt(Hz) ] ( gyro "white noise" )
gyroscope_random_walk: 1.9393e-05 # [ rad / s^2 / sqrt(Hz) ] ( gyro bias diffusion )
accelerometer_noise_density: 2.0000e-2 # [ m / s^2 / sqrt(Hz) ] ( accel "white noise" )
accelerometer_random_walk: 3.0000e-1 # [ m / s^3 / sqrt(Hz) ] ( accel bias diffusion )
dt_imu_cam: 0.0

So here you need to know precisely the transform between every sensor, as well as their intrinsic properties. A wonderfull toolbox that you can use for such a task is kalibr

Run Without ROS2

If you don't use the middleware ROS2, you can use the EUROC dataset ASL data format for which a data grabber is already implemented in ADataprovider.h. Then you can compile and run the executable main.cpp in the /cpp as such

mkdir build
cd build
cmake ..
make

And to run the executable

./isaeslam "/your/path/SaDVIO/ros/config" "/your/path/to/your/dataset/in/ASL/format"

Run with ROS2

With ROS2