Odometry
If one off odometry is needed, such as for testing a loop closure algorithm, evalio can generate it for you. For example, to generate odometry for the first 2000 scans of the Newer College 2020 dataset using KissICP,
The odometry will be in the IMU frame and saved in the TUM format, $$ [t\ \text{(sec)}, p_x, p_y, p_z, q_x, q_y, q_z, q_w] $$ along with metadata about how the trajectory was generated behind the '#' character. The above for the first 10 scans would look like:
# name: kiss
# pipeline: kiss
# version: 1.2.2
# convergence_criterion: 0.0001
# deskew: False
# initial_threshold: 2.0
# max_num_iterations: 500
# max_num_threads: 0
# max_points_per_voxel: 20
# min_motion_th: 0.1
# voxel_size: 1.0
#
# dataset: newer_college_2020
# sequence: short_experiment
# length: 100
#
# timestamp, x, y, z, qx, qy, qz, qw
1583836591.082580992,0.006252999883145094,-0.011775000020861626,-0.007644999772310257,0.0,0.0,-1.0,0.0
1583836591.182590976,0.002104584749512301,-0.014210604585971584,-0.007355713813266136,-2.675152057596367e-05,-8.363399211902303e-06,-0.9999999975888385,-6.353528931178803e-05
1583836591.282592512,0.0027150532454897226,-0.004297982387396928,-0.015746353734418864,-4.334993947940944e-05,-6.124874074873121e-05,-0.999999996655854,3.2521785965193945e-05
1583836591.382579456,0.00597131720748457,-0.011520632994006833,-0.006492858132001103,6.470950992969571e-05,-4.590305780285223e-05,-0.9999999968522549,1.0386708003358978e-06
1583836591.482568704,0.007478720199430491,-0.009223450849391,-0.003496780595402071,1.4720267758293692e-06,3.463391730777789e-05,-0.9999999993679838,7.896668660298116e-06
1583836591.582553088,0.0012911112076719805,-0.012163729075573013,-0.001935118832270371,1.711692196181323e-05,5.2587891622865136e-05,-0.9999999978422404,3.545481795975868e-05
1583836591.682529024,0.0026154127249510307,-0.0111173632560525,-0.005718297889001694,-2.7387527703120896e-05,2.907679171021379e-05,-0.9999999988611495,-2.6118280969886083e-05
1583836591.782496512,0.0042376370480087765,-0.01660435415391814,-0.004709413029178095,-5.202183158898017e-05,6.121947284618483e-05,-0.9999999961629367,-3.492895473336578e-05
1583836591.882515968,0.003165756615792398,-0.012502098488453172,-0.0014189397620055577,-1.48525422597923e-05,6.736687040505698e-05,-0.9999999976119399,4.150543609892368e-06
1583836591.982548736,-0.000298752072032382,-0.009307858981044354,-0.01089797673030992,-1.0989202198288011e-05,-4.521269654356091e-05,-0.999999998085071,4.0803279324257364e-05
This file can then by loaded and aligned to the ground truth as needed using the python API.
from evalio.types import Trajectory
from evalio.datasets import NewerCollege2020
from evalio import stats
traj = Trajectory.from_experiment("odometry.csv")
gt = NewerCollege2020.short_experiment.ground_truth()
# Align the odometry to the ground truth
traj_aligned, gt_aligned = stats.align(traj, gt)
# Compute metrics as desired (will align if not already aligned)
error = stats.rte(traj, gt).mean()