本文分为两部分,第一部分介绍KITTI、TUM、EUROC数据集;第二部分介绍EVO评估工具
文章目录
1. 数据集介绍
1.1 KITTI数据集
1.1.1 背景
KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。该数据集用于评测立体图像(stereo),光流(optical flow),视觉测距(visual odometry),3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。
1.1.2 特点
KITTI包含市区、乡村和高速公路等场景采集的真实图像数据,每张图像中最多达15辆车和30个行人,还有各种程度的遮挡与截断。整个数据集由389对立体图像和光流图,39.2 km视觉测距序列以及超过200k 3D标注物体的图像组成,以10Hz的频率采样及同步。总体上看,原始数据集被分类为’Road’, ’City’, ’Residential’, ’Campus’ 和 ’Person’。对于3D物体检测,label细分为car, van, truck, pedestrian, pedestrian(sitting), cyclist, tram以及misc组成。
1.1.3 数据采集平台
如图1.1.1所示,KITTI数据集的数据采集平台装配有2个灰度摄像机,2个彩色摄像机,一个Velodyne 64线3D激光雷达,4个光学镜头,以及1个GPS导航系统。
如图1.1.2所示为传感器的配置平面图。为了生成双目立体图像,相同类型的摄像头相距54cm安装。由于彩色摄像机的分辨率和对比度不够好,所以还使用了两个立体灰度摄像机,它和彩色摄像机相距6cm安装。为了方便传感器数据标定,规定坐标系方向如下
• Camera: x = right, y = down, z = forward
• Velodyne: x = forward, y = left, z = up
• GPS/IMU: x = forward, y = left, z = up
1.1.4 数据组织形式
- 灰度图像
/sequences/image_0(image_1)
/sequences/calib.txt
/sequences/times.txt
共22个图像序列,其中00-02图像格式为1241x376,03图像格式为1242x375,04-12图像格式为1226x370,13-21图像格式为1241x376
-
groundtruth.txt:
图1.1.4 groundtruth.txt
r11 r12 r13 tx r21 r22 r23 ty r31 r32 r33 tz
没有时间戳
存储变换矩阵的前三行 (每行12元素,空格隔开) -
calib.txt:
图1.1.5 calib.txt
参数说明:0,1,2,3 代表相机的编号
0表示左边灰度相机,1右边灰度相机,2左边彩色相机,3右边彩色相机。
b(i) 代表其他相机相对于cam 0的偏移。
1.1.5 简要描述
- 00: 车辆在小巷中行驶,地图信息很丰富:楼房、标牌、车辆等。绝大多数为静止的车,少数为行驶中的车辆,行人很少。楼房和树木的遮挡提供了光线明暗变化的特征。回环较多。是一个较大的数据集。
- 01: 车辆在高速公路上形式,速度很快,绝大多数为高速运动的车,建筑较少。主要路标为车、车道线和高速路旁的隔离带和森林。
- 02: 车辆在小路上行驶。行人很少,路标多为车辆、树木、楼房和路灯。树木遮挡导致明暗变化剧烈。无遮挡的地方光照很充足。是一个较大的数据集
- 03: 车辆在小路上行驶,路标为树木、房屋和车辆。光照变化不大。是一个较小的数据集。
- 04: 车辆在道路上笔直向前行驶,路标为车道线、运动的车辆和道路两边的路牌、树木等。是一个较小的数据集。
- 05: 车辆在路上行驶,行人很少,路标多为数目、楼房和静止的车辆。有明暗变化,有两处回环。是一个较大的数据集。
- 06: 车辆在较开阔的路上行驶。笔直行驶-U turn-笔直行驶-U turn-笔直行驶 在回到起始点时有一个回环。
- 07: 情况与1类似,但运动的车更多,只有一个回环。
- 08: 树木、楼房、静止的车,光照充足,有两处回环,但ORBSLAM2均未检测到。是一个较大的数据集
- 09: 开始是两侧树木的地形,明暗特征较多,而后有一段开阔地区,最后就是树木、楼房、静止车辆的常规组合。ORBSLAM2有一段跟丢了,未知原因。
- 10: 常规组合,中间有几段地砖路,遇到了两辆大车。
- 11: 常规组合,地砖路,明暗变化,末尾有一段开阔地带,很多直行路线,没有回环。
- 12: 高速路到市区,特征主要为道路两旁的树木,车道线,对向车辆。ORBSLAM2初始化用了很长时间。
1.2 TUM数据集
1.2.1 背景
RGB-D数据集,由TUM的Computer Vision Lab公布。之前大家看到一些博客上使用这个数据集,但是主要是针对纹理丰富的办公室场景,除此之外,这个数据集还有包含很多其他的场景。
1.2.2 特点
帧数大小不同,运动有快有慢,有手持的相机。同时,数据集还有不同结构和纹理的数据,运动物体,3D物体重建。
1.2.3 数据集结构
- depth:深度图
- rgb:彩色图
- accelerometer.txt:加速度计
- depth.txt:时间戳+深度图名称
- groundtruth.txt:时间戳+真实位姿 tx ty tz qx qy qz qw
- rgb.txt:时间戳+彩色图名称
- associate.py:用于RGB-D模式
1.2.4 数据集格式特点
- rgb为640x480分辨率,8-bit PNG格式
- depth为640x480分辨率,16-bit PNG格式
depth有5000的放大倍数 - groundtruth为固定坐标系下相机的位姿,并不是以第一帧为参考帧
- associate.py将彩色图和深度图做关联
关联rgb和depth:
python associate.py rgb.txt depth.txt > associate.txt
关联associate和groundtruth:
python associate.py associate.txt groundtruth.txt > associate_with_groundtruth
associate.txt和associate_with_groundtruth不一定一致
如下所示,二者行数不同
实际要以associate_with_groundtruth为准
此外,associate.py只能在python2下运行,若要在python3下运行,需要将86、87行的
first_keys = first_list.keys()
second_keys = second_list.keys()
修改为
first_keys = list(first_list.keys())
second_keys = list(second_list.keys())
1.2.5 官方建议
建议在首次实验中使用"xyz"系列。该数据集相机动作相对较小,仅覆盖了办公桌上的一小部分。 若运行正常,可以尝试"desk"数据集,该数据集包含四个桌子以及多个回环。
1.2.6 简要描述
共分为8个大类
(1) 用于测试与调试
- fr1_xyz: Kinect摄像头拍摄办公桌。该序列仅包含沿Kinect主轴的平移运动,而方向(大部分)保持固定。该数据集非常简单,适合做调试。
- fr1_rpy: 与fr1_xyz同一环境,但相反的是,几乎没有平移运动,主要是绕轴旋转。
- fr2_xyz: Kinect沿主轴在x,y和z方向上的移动非常缓慢。 缓慢的相机运动几乎消除了运动模糊和卷帘快门效果。数据很“干净”。
- fr2_rpy: 与fr2_xyz相对应,是缓慢的旋转。
(2) 手持
- fr1_360: 办公环境,360度旋转。
- fr1_floor: 办公室木地板。地板上有几个打结孔,便于使用特征点(如SIFT或SURF)跟踪。除了办公椅以外,大多数场景(地板)都是平面的。
- fr1_desk: 四个办公桌。
- fr1_desk2: 与desk类似,又录了一遍。
- fr1_room: 拍摄整个办公室,从桌子开始,然后绕墙一周,适合测试回环是否正常运行。
- fr2_360_hemisphere: 站在大厅中间,将Kinect水平旋转360度,然后指向天花板,整个过程中几乎没没有平移。
- fr2_360_kidnap: 与360_hemisphere相似,但多次遮挡摄像头并指向其他位置,以测试跟踪丢失后恢复跟踪的能力。
- fr2_desk: 办公室场景,其中包含两张桌子,一台电脑显示器,键盘,电话,椅子等。围绕两张桌子移动,以构成回环。 另外,录像期间移动了一些物体。
- fr2_large_no_loop: 贯穿大厅的轨迹,可以用来测试SLAM系统的累计漂移误差。
- fr2_large_with_loop: 贯穿大厅的轨迹,有回环,可以用来测试SLAM系统回环修正的能力。
- fr3_long_office_household: 沿着较大的圆形轨迹移动,穿越具有丰富纹理的办公场景,有一个很大的回环。
(3) 机器人
- fr2_pioneer_360: 由Pioneer机器人顶部的Kinect记录。机器人被操控进行了大幅度旋转(超过360度)。包内文件还包含激光扫描和机器人的里程表数据。
- fr2_pioneer_slam: 机器人被操控通过桌子,容器和其他墙壁。因而构成了几个建图闭环。包内文件还包含激光扫描和机器人的里程表数据。
- fr2_pioneer_slam2: 机器人被操控穿越大厅。包内文件还包含激光扫描和机器人的里程表数据。
- fr2_pioneer_slam3: 同slam2
1.3 EUROC数据集
1.3.1 背景
用于室内MAV的双目+IMU数据集,包含两个场景
- 苏黎世联邦理工学院ETH的一个machine hall
- 普通房间
图1.3.2 V1数据集环境
1.3.2 移动平台与传感器
传感器相对位置
如上图,总共框中四个传感器,对应数据集结构中cam0,cam1,imu0,leica0四个文件夹,其中prism和marker公用一个坐标系,
飞行器的Body Frame是以IMU的中心作为Body Frame的,四个文件夹所有的传感器数据都是相对于各自的传感器坐标系(Sensor Frame)的,当然IMU的Sensor Frame就是飞行器的Body Frame
在每个传感器文件夹里配套一个senor.yaml文件,描述了该传感器相对于Body坐标系的坐标变换情况,以及传感器内参。
传感器坐标约定
1.3.3 数据集结构
- mav0
- cam0
- data dir 图像
- data.csv 时间戳+图像地址
- sensor.yaml
- cam1
- 上同
- imu0
- data.csv 时间戳+数据
- sensor.yaml
- leica0 激光追踪器配套的传感器棱镜
- data.csv
- sensor.yaml
- state_groundtruth_estimate0
- data.csv
- sensor.yaml
- body.yaml
groundtruth:
#timestamp p_RS_R_x [m] p_RS_R_y [m] p_RS_R_z [m] q_RS_w [] q_RS_x [] q_RS_y [] q_RS_z [] v_RS_R_x [m s^-1] v_RS_R_y [m s^-1] v_RS_R_z [m s^-1] b_w_RS_S_x [rad s^-1] b_w_RS_S_y [rad s^-1] b_w_RS_S_z [rad s^-1] b_a_RS_S_x [m s^-2] b_a_RS_S_y [m s^-2] b_a_RS_S_z [m s^-2]
1.40364E+18 4.688319 -1.786938 -0.783338 0.534108 -0.153029 -0.827383 -0.082152 -0.027876 0.033207 0.800006 -0.003172 0.021267 0.078502 -0.025266 0.136696 0.075593
- timestamp
18位时间戳 - p_RS_R
p代表position,指的是MAV的空间3D坐标,RS代表这个坐标是在R坐标系的值,也就是LEICA位姿跟踪系统坐标系下测到的值,S指的是原来的值是从Sensor坐标系下得到的,后来又变换到了R坐标系。 - q_RS
q代表quaternion四元数,表达了MAV的姿态信息,RS代表是在R坐标系下测到的朝向信息,但是实际上最开始是在Sensor坐标系下的朝向,后来只不过被变换到了R坐标系下。 - v_RS_R
v代表这是MAV的速度信息,而且是在R坐标系下的速度信息 - b_w_RS_S
w代表这是MAV在R坐标系下的角速度信息 - b_a_RS_S
a代表这是MAV在R坐标系下的线加速度信息
1.3.4 官方提示
- 视觉惯性传感器采用自动曝光控制,两个相机的曝光彼此独立,这导致了不同的快门时间,进而导致了不同的图片亮度。这为立体匹配和特征点跟踪带来了挑战。由于两个快门的曝光时间通过中间曝光时间对齐,因此同步性不会受到不同快门时间的影响。
- 一些数据集中有很大的运动,这会导致激光测量精度降低。这会使高精度视觉定位算法的评估难度变大(因为groundtruth本身有一些误差)。运动不大的地方(比如开始和结束位置)的影响可以忽略不计。
- 传感器数据和groundtruth之间的同步受制于不同的来源,且Vicon不支持设备时间戳。可以将时间偏移视作一个状态量,用状态估计的方法解决该问题。
2. evo评估工具
2.1 简介
用于评估SLAM输出的轨迹的精度,可以自动生成均值、方差、轨迹等等信息的图或者表。
目前支持的公开数据集格式有:TUM、KITTI、EuRoC以及ROS bagfile。如果使用的数据集格式为这些中的某一种,那么无须额外的数据格式处理,就可以直接使用evo进行精度相关内容评估。
2.2 算法精度评价指标
2.2.1 基本定义
假设估计位姿和实际位姿时间戳对齐,总帧数都为n.
算法估计位姿
P
1
,
P
2
,
…
,
P
n
∈
S
E
(
3
)
P_1,P_2,\dots,P_n\in SE(3)
P1,P2,…,Pn∈SE(3)
真实位姿
Q
1
,
Q
2
,
…
,
Q
n
∈
S
E
(
3
)
Q_1,Q_2,\dots,Q_n\in SE(3)
Q1,Q2,…,Qn∈SE(3)
2.2.2 ATE: 绝对轨迹误差
绝对轨迹误差是估计位姿和真实位姿的直接差值,可以非常直观地反应算法精度和轨迹全局一致性。
- 十四讲中的定义:
(1) 位姿均方根误差
A T E a l l = 1 n ∑ i = 1 N ∥ l o g ( Q i − 1 P i ) ∨ ∥ 2 \mathrm{ATE}_{all}=\sqrt{\frac 1 n\sum_{i=1}^N \|\mathrm{log}(Q_i^{-1}P_i)^\vee \|^2} ATEall=n1i=1∑N∥log(Qi−1Pi)∨∥2
(2) 平移均方根误差
A T E t r a n s = 1 n ∑ i = 1 N ∥ t r a n s ( Q i − 1 P i ) ∥ 2 \mathrm{ATE}_{trans}=\sqrt{\frac 1 n\sum_{i=1}^N \|\mathrm{trans}(Q_i^{-1}P_i) \|^2} ATEtrans=n1i=1∑N∥trans(Qi−1Pi)∥2 - 实际情况
估计位姿和groundtruth通常不在同一坐标系中,因此我们需要先将两者对齐。- 对于双目SLAM和RGB-D SLAM,尺度统一,因此我们需要通过最小二乘法计算一个从估计位姿到真实位姿的转换矩阵 S ∈ S E ( 3 ) S\in SE(3) S∈SE(3)
- 对于单目相机,具有尺度不确定性,我们需要计算一个从估计位姿到真实位姿的相似转换矩阵 S ∈ S i m ( 3 ) S\in Sim(3) S∈Sim(3)
- 进而,实际上每一帧对应的位姿误差为:
对应的位姿误差和平移误差变为:
A T E a l l = 1 n ∑ i = 1 N ∥ l o g ( Q i − 1 S P i ) ∨ ∥ 2 \mathrm{ATE}_{all}=\sqrt{\frac 1 n\sum_{i=1}^N \|\mathrm{log}(Q_i^{-1}SP_i)^\vee \|^2} ATEall=n1i=1∑N∥log(Qi−1SPi)∨∥2
A T E t r a n s = 1 n ∑ i = 1 N ∥ t r a n s ( Q i − 1 S P i ) ∥ 2 \mathrm{ATE}_{trans}=\sqrt{\frac 1 n\sum_{i=1}^N \|\mathrm{trans}(Q_i^{-1}SP_i) \|^2} ATEtrans=n1i=1∑N∥trans(Qi−1SPi)∥2
2.2.3 RPE: 相对位姿误差
- 十四讲中的定义:
- 相对位姿误差
R P E a l l = 1 n − Δ ∑ i = 1 n − Δ ∥ l o g ( ( Q i − 1 Q i + Δ ) − 1 ( P i − 1 P i + Δ ) ) ∨ ∥ 2 \mathrm{RPE}_{all}=\sqrt{\frac{1}{n-\Delta}\sum_{i=1}^{n-\Delta}\|\mathrm{log} ((Q_i^{-1}Q_{i+\Delta})^{-1}(P_i^{-1}P_{i+\Delta}))^{\vee}\|^2} RPEall=n−Δ1i=1∑n−Δ∥log((Qi−1Qi+Δ)−1(Pi−1Pi+Δ))∨∥2 - 只取平移部分
R P E t r a n s = 1 n − Δ ∑ i = 1 n − Δ ∥ t r a n s ( ( Q i − 1 Q i + Δ ) − 1 ( P i − 1 P i + Δ ) ) \mathrm{RPE}_{trans}=\sqrt{\frac{1}{n-\Delta}\sum_{i=1}^{n-\Delta}\|\mathrm{trans} ((Q_i^{-1}Q_{i+\Delta})^{-1}(P_i^{-1}P_{i+\Delta}))} RPEtrans=n−Δ1i=1∑n−Δ∥trans((Qi−1Qi+Δ)−1(Pi−1Pi+Δ))
Δ \Delta Δ: 固定时间差
- 实际情况
每帧的相对位姿误差
相当于直接测量里程计的误差
Δ
\Delta
Δ的选取直接影响RMSE的结果,为了能综合衡量算法表现,可以遍历
Δ
\Delta
Δ的所有取值如下
2.3 安装方法
pip install evo --upgrade --no-binary evo
2.4 常用指令
- evo_ape 用于评估绝对位姿误差;
- evo_rpe 用于评估相对位姿误差;
- evo_traj 这个主要是用来画轨迹、输出轨迹文件、转换数据格式等功能;
- evo_res 比较来自evo_ape或evo_rpe生成的一个或多个结果文件的工具;
- evo_fig (实验)工具,用于重新打开序列化图(使用–serialize_plot保存);
- evo_config 这个主要用于evo工具全局设置和配置文件操作。
2.4.1 evo_ape
该命令用于评估两条轨迹的绝对位姿误差
- TUM数据集
以单目为例
evo_ape tum groundtruth.txt KeyFrameTrajectory.txt
结果:
这是由于单目相机没有尺度,对轨迹进行sim(3)变换,指令如下
evo_ape tum groundtruth.txt KeyFrameTrajectory.txt -a -p -s
-a: 轨迹匹配
-s:尺度修正
-p:绘图
结果:
- KITTI数据集
KITTI数据集的groundtruth没有时间戳,因此需要利用evo自带的python程序进行添加。
在evo文件夹下的contrib中文件kitti_poses_and_timestamps_to_trajectory.py能实现讲gt转TUM格式,首先将kitti的xx.txt和times.txt文件拷贝到该目录,运行
python kitti_poses_and_timestamps_to_trajectory.py xx.txt times.txt kitti_xx_tum.txt
生成TUM格式的groundtruth文件
运行
evo_ape tum kitti_xx_tum.txt KeyFrameTrajectory.txt -a -s -p
2.4.2 evo_rpe
评估相对位姿误差
- TUM数据集
evo_rpe tum groundtruth.txt KeyFrameTrajectory.txt -a -p -s
- KITTI数据集
evo_rpe tum kitti_00_tum.txt KeyFrameTrajectory.txt -a -p -s
2.4.3 evo_traj
用于画轨迹图、表格,转换数据格式等等操作。
- 最简单的操作
evo_traj tum KeyFrameTrajectory.txt
该命令如果不添加任何参数项,那么就输出轨迹的相关信息。
- 绘图
evo_traj tum KeyFrameTrajectory.txt -p --plot_mode=xz
-p 表示绘图
–plot_mode=xz 表示投影到xz轴显示
- 画两个或两个以上轨迹
evo_traj tum KeyFrameTrajectory.txt kitti_00_tum.txt KeyFrameTrajectory.txt -p --ref=kitti_00_tum.txt --plot_mode=xz -a -s
–ref: 设置参考轨迹
- 格式转换
evo_traj euroc data.csv --save_as_tum
2.4.4 evo_res
用于同时比较多个数据
evo_rpe tum groundtruth.txt KeyFrameTrajectory.txt -a -s --save_result xxx.zip
将结果保存为zip格式
evo_res 1.zip 2.zip -p --save_table table.csv
将比较结果保存为csv格式
2.4.5 evo_config
evo_config命令并不怎么常用,多数情况下,我们正常使用是不需要额外设置evo的一些配置项的。
查看系统默认配置
evo_config show --brief
修改输出图像格式
evo_config set plot_export_format png
修改线型
evo_config set plot_reference_linestyle -
还原为默认设置
evo_config reset