evo在视觉SLAM中是一个极为有用的工具,对于论文党、科研党、工程党都非常有帮助,它可以用于评估SLAM输出的轨迹的精度,可以自动生成均值、方差、轨迹等等信息的图或者表,总之评估SLAM精度用它足以。
它目前支持的公开数据集格式有:“TUM”、“KITTI”、“EuRoC MAV"以及"ROS bagfile”。如果你使用的数据集格式为这些中的某一种,那么你无须额外的数据格式处理,就可以直接使用evo进行精度相关内容评估。
该工具目前被托管在github上了,其项目地址为https://github.com/MichaelGrupp/evo。
作者提供了两种安装方法,这里我推荐使用pip工具进行安装,非常方便,只需要一行代码即可,将如下代码复制到你的终端中运行
pip install evo --upgrade --no-binary evo
注意:如果一直提示下载失败,或者出现下载速度过慢等问题,那是因为pip工具默认的下载地址为国外的服务器,你需要将源地址改为国内,具体操作方法可以参考我的这篇博客《解决Linux,Ubuntu下使用python包管理工具pip命令安装和下载包速度很慢、失败或者connection timeout等问题》,修改源之后基本上就可以毫无问题的安装好了。
没有报错,则evo就算安装成功了,此时你打开终端输入evo
,然后按Tab键就可以出现如下命令,如果没有出现重启电脑就行了:
evo工具主要有如下六个常用命令:
evo_ape
- 用于评估绝对位姿误差;evo_rpe
- 用于评估相对位姿误差;evo_traj
- 这个主要是用来画轨迹、输出轨迹文件、转换数据格式等功能;evo_res
- 比较来自evo_ape或evo_rpe生成的一个或多个结果文件的工具;evo_fig
- (实验)工具,用于重新打开序列化图(使用–serialize_plot保存);evo_config
- 这个主要用于evo工具全局设置和配置文件操作。下面让我们来看第一个命令evo_ape
如何使用,该命令用于评估两条轨迹的绝对位姿误差,最简单的使用方法为:
evo_ape kitti a.txt b.txt
解释:如上命令的意思是,比较kitti数据集格式的a.txt和b.txt文件的绝对误差精度。如果你要比较的数据集格式为euroc,那么此时可以使用如下命令:
evo_ape euroc a.csv b.csv
evo共支持kitti
、tum
、euroc
这三个公开数据集格式。
需要注意两个待比较的数据文件必须格式一致,都为kitti、tum或者euroc!
当你使用上面的命令之后,会在你的终端中产生如下类型的结果:
其中:
max
:表示最大误差;mean
:平均误差;median
:误差中位数;min
:最小误差;rmse
:均方根误差;sse
:和方差、误差平方和;std
:标准差。以上即为一个evo_ape
的最简单用法,命令还可以添加一些参数,从而完成不同的功能:
evo_ape
命令后面可以添加的参数有很多,你可以使用如下命令进行查看:
evo_ape kitti -h
解释:该命令就是表示evo_ape
命令在kitti数据集下,可以选择的参数介绍,介绍的还是很详细的,我感觉你直接就能看懂。
同样的是你还可以使用:
evo_ape tum -h
下面示范一个常用的用法,当我们获得单目SLAM生成的轨迹文件时,此时我们需要和真实轨迹进行对比,但是我们知道单目SLAM是没有尺度的,所以两个轨迹一定不会一样大,所以我们需要对轨迹进行sim(3)相似变换,那么evo就会自动的对轨迹的位移、旋转、尺度进行对齐,完成这个任务的代码如下:
evo_ape tum data.tum CameraTrajectory.txt -a -p -s
解释:参数-a
、-s
、-p
即为选择的参数,分别表示进行轨迹的匹配和尺度修正,以及-p
表示画图误差的图和两个轨迹的图。
该命令用于比较两个轨迹之间的相对轨迹误差,也就是两个时间戳相同时刻的轨迹轨迹误差,更具体来说,两组轨迹持续时间相同,但是采样频率不同,那么之间就会有一些少量的相同时间戳,那么这些相同的时间戳就可以进行一对一比较误差。同样的这些误差也会有平均误差、最大、最小误差等等结果。命令使用方法如下:
evo_rpe xxx a.txt b.txt
evo_rpe
命令依然可以添加一些可选参数项,你同样可以使用如下命令查看可选参数的具体介绍和用法:
evo_rpe xxx -h
解释:其中xxx
为tum、kitti、euroc、rosbag中的一种
该命令evo_traj
命令十分有用,它主要用于画轨迹图、表格,转换数据格式等等操作。
下面我们来看一个简单的用法:
evo_traj tum a.txt
输出为:
该命令如果不添加任何参数项,那么就输出轨迹的相关信息。
我们只要简单的添加一个参数-p
或者--plot
即可看到轨迹的图形,命令如下:
evo_traj tum a.txt -p
evo_traj tum a.txt b.txt c.txt -p
如果我们想要两个轨迹匹配到同一个原点那么可以使用参数如下:
evo_traj tum a.txt b.txt c.txt -p --align_origin
又比如下面的命令:
evo_traj kitti 0.txt 1.txt --ref=0.txt -p --plot_mode=xz
解释:上面命令中参数--ref
表示设置轨迹为参考,--plot_mode=xz
表示轨迹投影到xz轴显示。
还有一些额外的可选项,它们很有用,你可以通过-h
选项查看参数的介绍和用法。
evo_config
命令并不怎么常用,多数情况下,我们正常使用是不需要额外设置evo的一些配置项的。
你可以使用如下命令,查看evo默认的一些系统参数设置:
evo_config show --brief
运行上面的命令之后,你的终端上就可以输出如下信息:
{
"console_logging_format": "%(message)s",
"euler_angle_sequence": "sxyz",
"global_logfile_enabled": false,
"plot_axis_marker_scale": 0.0,
"plot_backend": "Qt5Agg",
"plot_export_format": "pdf",
"plot_figsize": [
6,
6
],
"plot_fontfamily": "sans-serif",
"plot_fontscale": 1.0,
"plot_invert_xaxis": false,
"plot_invert_yaxis": false,
"plot_linewidth": 1.5,
"plot_multi_cmap": "none",
"plot_reference_alpha": 0.5,
"plot_reference_color": "black",
"plot_reference_linestyle": "--",
"plot_seaborn_palette": "deep6",
"plot_seaborn_style": "darkgrid",
"plot_split": false,
"plot_statistics": [
"rmse",
"median",
"mean",
"std",
"min",
"max"
],
"plot_texsystem": "pdflatex",
"plot_trajectory_alpha": 0.75,
"plot_trajectory_cmap": "jet",
"plot_trajectory_linestyle": "-",
"plot_usetex": false,
"plot_xyz_realistic": true,
"ros_map_alpha_value": 1.0,
"ros_map_unknown_cell_value": 205,
"save_traj_in_zip": false,
"table_export_data": "stats",
"table_export_format": "csv",
"table_export_transpose": true
}
如果你想要对某一项参数进行修改,比如你想修改输出的图像格式,你可以使用如下命令:
evo_config set plot_export_format png
又比如你想做如下的操作:
1.将画图背景更改成白色网格
evo_config set plot_seaborn_style whitegrid
2.将字体改为衬线型并调为1.2倍大小
evo_config set plot_fontfamily serif plot_fontscale 1.2
3.将画图所使用的线型改为 -
evo_config set plot_reference_linestyle -
4.将所画图的图像大小调整为10 9(宽 高)
evo_config set plot_figsize 10 9
5.当你想要将配置还原为默认时,只需要使用命令:
evo_config reset
当你对evo的使用有一个大致的理解之后,我觉得你再摸索和使用就会方便很多,当你看完本篇博客之后,如果你还想进一步了解它更细致的使用,你可以浏览的evo在github上的wiki,网址为:https://github.com/MichaelGrupp/evo/wiki
下面演示一个真实使用场景。
其实用法很简单,ORB-SLAM2产生的轨迹文件为CameraTrajectory.txt
,我们要想对它进行轨迹精度评估,第一步首先需要确定轨迹的数据格式,可以很容易发现它保存的数据格式与tum一致,如果想要评估精度ORB-SLAM2精度,就需要先将真实轨迹转换成tum格式,实际操作过程为:
例如,如果我们使用EuRoc数据做SLAM:
1.首先,将EuRoc数据集的真实轨迹转换成tum格式,使用如下命令:
evo_traj euroc data.csv --save_as_tum
2.然后,将ORB-SLAM2生成的轨迹和转换格式之后的EuRoc轨迹进行误差对比:
evo_traj tum data.tum CameraTrajectory.txt -p --ref=data.tum -a
当你需要评估视觉SLAM与激光SLAM的轨迹精度时。
(1)你的激光雷达与相机是捆绑在一起。此时相机和激光雷达理论上一定具有形状一样的轨迹,不管你是把哪个轨迹作为参考轨迹,你都需要做如下操作:
evo_traj tum a.txt b.txt --ref=a.txt --correct_scale -a -p
-a
:轨迹对齐;
--correct_scale
:修正尺度。
(2)相机和激光雷达分别不同次测量。首先要保证两种轨迹是走的同样的路线,形状上不要有太大的差异。然后按照(1)中的方法进行轨迹和时间戳的对齐,然后进行evo评估操作。