一.安装
打开终端,输入如下内容即可安装evo的最新版。
pip install evo --upgrade --no-binary evo
注意了,最新版本的evo只支持Python3.6+,因此如果你在用Python 2.7,最高能安装的evo版本是1.12.0,可以输入pip install evo==1.12.0安装。顺便解释一下–no-binary evo的意思,作者在Github中说,如果没有这个参数,绘图时标签可能会有点问题,因此建议按作者说的来。
安装好之后终端输入:evo,如下图所示。
二.使用EVO
关于上述功能的官方解释:
国际惯例,先附上一个参数详解的文章:https://www.freesion.com/article/1774434121/
————————————————
一些参数的含义
指令 | 功能 |
---|---|
evo_ape | 用于评估绝对位姿误差 |
evo_rpe | 用于评估相对位姿误差 |
evo_traj | 这个主要是用来画轨迹、输出轨迹文件、转换数据格式等功能 |
evo_res | 比较来自evo_ape或evo_rpe生成的一个或多个结果文件的工具 |
evo_fig | (实验)工具,用于重新打开序列化图(使用–serialize_plot保存) |
evo_config | 这个主要用于evo工具全局设置和配置文件操作 |
原文链接:https://blog.csdn.net/u013564470/article/details/126284625 |
定性的分析:可视化轨迹*********
- evo_traj:直接画出轨迹
参考的基准轨迹不一样,所以这俩个命令绘制出的轨迹不完全一样;
其中ref是参考轨迹,-va是对齐后的详细信息,-p是画出图像
(0)轨迹的长度,记录位置个数,持续时长信息:
evo_traj tum a.txt
(1)单独绘制轨迹:
evo_traj tum a.txt -p
(2)将多个轨迹画到一起 :
//进一步当我们想要画两个或者两个以上的轨迹时:
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选项查看参数的介绍和用法。
(3)也可以使用–plot_mode {xy,xz,yx,yz,zx,zy,xyz}来选择单独绘制某个平面的信息
如:evo_traj tum KeyFrameTrajectory.txt CameraTrajectory2.txt --ref KeyFrameTrajectory.txt -va -p --plot_mode=xy
定量的分析:计算轨迹误差****************
2. evo_ape:绝对位姿误差的计算()
使用ape的时候无需给出–ref 的文件,tum 后第一个文件即为标准文件,也就是:
evo_ape tum 真实.txt 测试.txt -va -p
//选择的参数介绍
evo_ape tum KeyFrameTrajectory.txt KeyFrameTrajectory.txt -va -p
//选择的参数介绍
evo_ape tum -h
//获得单目SLAM生成的轨迹文件时,此时我们需要和真实轨迹进行对比,
//但是我们知道单目SLAM是没有尺度的,所以两个轨迹一定不会一样大,
//所以我们需要对轨迹进行sim(3)相似变换,那么evo就会自动的对轨迹的位移、旋转、
//参数-a、-s、-p即为选择的参数,分别表示进行轨迹的匹配和尺度修正,以及-p表示画图误差的图和两个轨迹的图
//尺度进行对齐,完成这个任务的代码如下:
evo_ape tum data.tum CameraTrajectory.txt -a -p -s
- evo_rpe:相对位姿误差的计算,该命令用于比较两个轨迹之间的相对轨迹误差,也就是两个时间戳相同时刻的轨迹轨迹误差,更具体来说,两组轨迹持续时间相同,但是采样频率不同,那么之间就会有一些少量的相同时间戳,那么这些相同的时间戳就可以进行一对一比较误差。同样的这些误差也会有平均误差、最大、最小误差等等结果。
命令使用方法如下:
//使用rpe的时候无需给出–ref 的文件,tum 后第一个文件即为标准文件,也就是:`evo_rpe tum 真实.txt 测试.txt -va -p`
//evo_rpe xxx a.txt b.txt
如:evo_rpe tum KeyFrameTrajectory.txt KeyFrameTrajectory.txt -va -p
//evo_rpe命令依然可以添加一些可选参数项,你同样可以使用如下命令查看可选参数的具体介绍和用法:
evo_rpe xxx -h
//解释:其中xxx为tum、kitti等
4.1. 使用evo_res对精度进行ATE/RPE结果对比:
(官方地址:https://gitcode.net/mirrors/michaelgrupp/evo?utm_source=csdn_github_accelerator )
在上面,我们已经分别将ORB和SPTAM的轨迹与真值进行了对比,得到了各自的精度。但我们肯定还想知道各个方法间的精度对比,这就需要用evo_res命令了。
例如,在这里,我们使用evo_ape (groundtruth.txt是参考(ground truth))计算来自ORB-SLAM和S-PTAM的两条轨迹的绝对位姿误差,并将单个结果绘制并保存到evo_res的.zip文件中:
(1) 第一个轨迹(ORB Stereo):
mkdir results
evo_ape kitti KITTI_00_gt.txt KITTI_00_ORB.txt -va --plot --plot_mode xz --save_results results/ORB.zip
(2)第二个轨迹(S-PTAM):
evo_ape kitti KITTI_00_gt.txt KITTI_00_SPTAM.txt -va --plot --plot_mode xz --save_results results/SPTAM.zip
(3)将俩个结果在一个度量标准下进行比较
Evo_res可以用来比较来自指标的多个结果文件,即:
- 打印信息和统计信息(默认)
- 绘制结果图
- 将统计信息保存在一个表中
在这里,我们使用上面的结果来生成一个图表和表格,并且将结果保存在一个pdf文件中:
evo_res results/*.zip -p --save_plot results/results.pdf
按照大佬们的指示,然后就可以写论文了(狂笑。)
注意:我的电脑之前环境错乱过,所以有时候并不能生成zip结果文件,不知道为啥子,所以这里将results文件夹的路径改成 ./results ,另外(绝对路径不好使,只能是./)
我自己的命令应该为:
# 先新建一个 results 文件夹
*******************
ape生成zip压缩包使用命令1:
evo_ape tum groundtruth.txt PLRGBDCameraTrajectory.txt -va --plot --plot_mode xz --save_results ./results/PLRGBD.zip
ape生成zip压缩包使用命令2:
evo_ape tum groundtruth.txt ORB2CameraTrajectory.txt -va --plot --plot_mode xz --save_results ./results/ORB.zip
使用evo_res命令3:evo_res ./results/*.zip -p --save_plot results/results.pdf
生成的结果是
results.pdf内容是:
终端输出的是:
其中:
- max:表示最大误差;
- mean:平均误差;
- median:误差中位数;
- min:最小误差;
- rmse:均方根误差;
- sse:和方差、误差平方和;
- std:标准差。
且将该结果保存在一个csv文件中,可以将终端结果生成一个表格:
evo_res results/*.zip -p --save_table results/results.csv
(另外:同门在雷达仿真中直接使用测试轨迹和真是轨迹的rosbag数据格式也使用evo_res命令进行对比来者,猜测在视觉中也能用:evo_traj tum traj_1.txt traj_2.txt traj_3.txt --save_as_bag)
三.使用脚本批量处理轨迹文件并且使用evo评估
参考:https://blog.csdn.net/phy12321/article/details/109902015
#!/bin/bash
function echo_and_run { echo -e "\$ $@" ; read input; "$@" ; read input; }
echo "********** EVO Testing ************"
echo "evo on sequence $2"
cd /home/phy12321/code/Multi_view_Cylinder_Net/Logs/"${1}" || exit
ref_pose="/dataset/kitti/poses/${2}.txt"
pred_pose="${1}/pred_pose_${2}.txt"
save_results="${1}/evo_ape_${2}.zip"
save_plot="${1}/ape_${2}.pdf"
echo -e "\n\n" | echo_and_run evo_ape kitti "${ref_pose}" "${pred_pose}" --save_results "${save_results}" -v --plot_mode xz --save_plot "${save_plot}"
ref_pose="/dataset/kitti/poses/${2}.txt"
pred_pose="${1}/pred_pose_${2}.txt"
save_results="${1}/evo_rpe_${2}.zip"
save_plot="${1}/results/rpe_${2}.pdf"
echo -e "\n\n" | echo_and_run evo_rpe kitti "${ref_pose}" "${pred_pose}" -v --save_results "${save_results}" -va --plot_mode xz --save_plot "${save_plot}"
四 。evo_config用法
如果你想要对某一项参数进行修改,比如你想修改输出的图像格式,你可以使用如下命令:
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
————————————————
版权声明:本文为CSDN博主「一点儿也不萌的萌萌」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011341856/article/details/104594392
五. 评估激光雷达SLAM轨迹与单目视觉SLAM轨迹精度
原文链接:https://blog.csdn.net/u011341856/article/details/104594392
当你需要评估视觉SLAM与激光SLAM的轨迹精度时。
(1)你的激光雷达与相机是捆绑在一起。此时相机和激光雷达理论上一定具有形状一样的轨迹,不管你是把哪个轨迹作为参考轨迹,你都需要做如下操作:
- 将激光雷达的轨迹保存为tum数据格式(timestamp x y z q_x q_y q_z q_w),千万不要保存为kitti数据集的格式,因为没有时间戳,无法进行尺度修正和对齐变换。
- 激光雷达轨迹和相机轨迹要在时间戳和轨迹起终点上都对齐。做法是:删减激光雷达的轨迹使得起点和终点和相机轨迹是一样的,然后将相机轨迹的初始位置对应的时间设置为激光雷达的开始时间,终点时间也依次设置,并记录你激光雷达轨迹的每一个位置对应的时间。这么设置的目的就是为了后续两个轨迹的匹配。
- 使用evo进行轨迹显示或者计算误差等操作,可以参考如下命令。
evo_traj tum a.txt b.txt --ref=a.txt --correct_scale -a -p
-a:轨迹对齐;
--correct_scale:修正尺度。
(2)相机和激光雷达分别不同次测量。首先要保证两种轨迹是走的同样的路线,形状上不要有太大的差异。然后按照(1)中的方法进行轨迹和时间戳的对齐,然后进行evo评估操作。
另外,这位博主按照evo的思路自己实现了一个带尺度的轨迹对齐算法,如果你有兴趣了解轨迹对齐是什么原理,可以参考这位博主的这部分代码,这个代码也可以作为一个对齐之后的可视化工具,查看每一个对应点之间的位置。
地址:https://github.com/zm0612/align_trajectory
(3)如果相机和激光雷达不但不是同时测量,而且两次测量的轨迹也不一致,可以参考我的另外一篇博客,其中有介绍怎么应对这种情况下的轨迹对齐。
《激光slam坐标系和视觉slam坐标系对齐,两个slam系统之间坐标对齐,轨迹对齐,时间戳对齐》:https://blog.csdn.net/u011341856/article/details/109113247
原文链接:https://blog.csdn.net/u011341856/article/details/104594392
附1:上一个evo参数大全集:
https://blog.csdn.net/qq_34213260/article/details/112548249
官方的参考来源:https://github.com/MichaelGrupp/evo/wiki
附2 列出常用参数:
保存图片
--save_plot 保存的路径
如保存成pdf文件:--save_plot results/results.pdf
合并轨迹
--merge
给出数据的最大时间戳差异
--t_max_diff “具体差异”