当评估一个SLAM/算法的表现时,可从时耗、复杂度、精度多个角度切入。其中对精度的评价是可以使用两个精度指标ATE和RPE。
这两个evaluation metrics最早是在TUM数据集benchmark中定义的,应用非常广泛。
定义一下公式标注:
**绝对轨迹误差(absolute trajectory error)**直接计算相机位姿的真实值与SLAM系统的估计值之间的差。
程序首先根据位姿的时间戳将真实值和估计值进行对齐, 然后计算每对位姿之间的差值, 并最终以图表的形式输出, 该标准非常适合于评估视觉 SLAM 系统的性能。
绝对轨迹误差是估计位姿和真实位姿的直接差值,可以非常直观地反应算法精度和轨迹全局一致性。
估计位姿和groundtruth通常不在同一坐标系中,因此我们需要先将两者对其尺度统一。
通过最小二乘法计算一个从估计位姿到真实位姿的转换矩阵 S ∈ S E ( 3 ) \text{S}\in SE(3) S∈SE(3);
具有尺度不确定性,我们需要计算一个从估计位姿到真实位姿的相似转换矩阵 S ∈ S i m ( 3 ) \text{S}\in Sim(3) S∈Sim(3)。
因此第 i i i帧的ATE定义如下:
F i : = Q i − 1 S P i F_i:=Q_i^{-1}SP_i Fi:=Qi−1SPi
与RPE相似,建议使用RMSE统计ATE
RMSE ( F 1 : n , Δ ) : = ( 1 m ∑ i = 1 m ∥ t r a n s ( F i ) ∥ 2 ) 1 2 \text{RMSE}(F_{1:n},\Delta):=(\frac1m \sum_{i=1}^m \rVert trans(F_i) \Vert ^2)^{\frac12} RMSE(F1:n,Δ):=(m1∑i=1m∥trans(Fi)∥2)21
也可以使用平均值、中位数等来反应ATE亦可。
**相对位姿误差(relative pose error)**用于计算相同两个时间戳上的位姿变化量的差, 同样, 在用时间戳对齐之后, 真实位姿和估计位姿均每隔一段相同时间计算位姿的变化量, 然后对该变化量做差, 以获得相对位姿误差, 该标准适合于估计系统的漂移。
相对位姿误差主要描述的是相隔固定时间差 Δ \Delta Δ两帧位姿差的精度(相比真实位姿),相当于直接测量里程计的误差。
因此第 i i i帧的RPE定义如下:
E i : = ( Q i − 1 Q i + Δ ) − 1 ( P i − 1 P i + Δ ) E_i:=(Q_i^{-1}Q_{i+\Delta})^{-1}(P_i^{-1}P_{i+\Delta}) Ei:=(Qi−1Qi+Δ)−1(Pi−1Pi+Δ)
已知总数 n n n与间隔 Δ \Delta Δ的情况下,可以得到 m = n − Δ m=n-\Delta m=n−Δ 个RPE,然后我们可以用均方根误差RMSE统计这个误差,得到一个总体值:
RMSE ( E 1 : n , Δ ) : = ( 1 m ∑ i = 1 m ∥ t r a n s ( E i ) ∥ 2 ) 1 2 \text{RMSE}(E_{1:n},\Delta):=(\frac1m \sum_{i=1}^m \rVert trans(E_i) \Vert ^2)^{\frac12} RMSE(E1:n,Δ):=(m1∑i=1m∥trans(Ei)∥2)21
其中 t r a n s ( E i ) trans(E_i) trans(Ei)代表取相对位姿误差中的平移部分translation。
除了RMSE,还可以直接使用平均值、甚至中位数来描述相对误差情况。
需要注意的是,RPE包含了两部分的误差,分别是旋转误差和平移误差,通常使用平移误差进行评价已经足够,但是如果需要,旋转角的误差也可以使用相同的方法进行统计。
实际情况中,我们发现对 Δ \Delta Δ的选取有多种选择,为了能综合衡量算法表现,我们可以计算遍历所有 Δ \Delta Δ的RMSE的平均值:
RMSE ( E 1 : n ) = 1 n ∑ Δ = 1 n RMSE ( E 1 : n , Δ ) . \text{RMSE}(E_{1:n})=\frac1n\sum_{\Delta=1}^n \text{RMSE}(E_{1:n},\Delta). RMSE(E1:n)=n1∑Δ=1nRMSE(E1:n,Δ).
这样的计算复杂度非常高,很耗时间,因此TUM在自己给定的工具中,通过计算固定数量的RPE样本计算一个估计值作为最终结果。
综上,我们需要注意的是,RPE误差包含了translation和rotation两部分的误差,而ATE只包含translation的误差,二者具有强烈的相关性,却也不尽相同。我们仍需结合实际,选择合适的指标进行算法评价。
均方根误差为回归评价指标。衡量观测值与真实值之间的偏差。
常用来作为机器学习模型预测结果衡量的标准。
h ( x i ) h(x_i) h(xi)为观测值, y i y_i yi为预测值
$ sudo apt-get update
$ sudo apt-get install python-numpy
$ sudo apt-get install python-scipy
$ sudo apt-get install python-matplotlib
官网地址https://github.com/MichaelGrupp/evo
$ pip install evo --upgrade --no-binary evo
或者
$ git clone https://github.com/MichaelGrupp/evo
$ cd evo
$ pip install --editable . --upgrade --no-binary evo
$ evo_ape -h
$ cd evo/test/data
$ evo_traj kitti KITTI_00_ORB.txt KITTI_00_SPTAM.txt --ref=KITTI_00_gt.txt -p --plot_mode=xz
[ERROR] Unhandled error in evo.main_traj
ContextualVersionConflict: (matplotlib 1.5.1 (/usr/lib/python2.7/dist-packages), Requirement.parse('matplotlib>=1.5.3'), set(['seaborn']))
解决办法
$ pip install matplotlib --upgrade --user
若下载超时
$pip --default-timeout=100 install matplotlib --upgrade --user
Please upgrade numpy to >= 1.12.0 to use this pandas version
解决办法
$ pip install numpy --upgrade --user
若下载超时
pip --default-timeout=100 install numpy --upgrade --user
评估指标
evo_ape
- absolute pose error 绝对位姿误差
evo_rpe
- relative pose error 相对位姿误差
工具
evo_traj
-用于分析,绘制或导出一个或多个轨迹的工具
evo_res
-用于比较evo_ape
或evo_rpe
中的一个或多个结果文件的工具
evo_fig
-用于重新打开序列化图的(实验性)工具(使用--serialize_plot
保存)
evo_config
-用于全局设置和配置文件操作的工具
其他功能参考:https://github.com/MichaelGrupp/evo/wiki
evo_traj
positional arguments:
{kitti,tum,euroc,bag}
绘制轨迹,则增加可选参数 -p 或 --plot
如:
evo_traj kitti KITTI_00_ORB.txt -p
如EuRoc数据集,需要将.csv文件形式的groundtruth转换为TUM形式的轨迹文件。
evo_traj euroc V102_groundtruth.csv --save_as_tum
evo_traj tum V102_groundtruth.tum -p
evo_traj kitti KITTI_00_ORB.txt KITTI_00_SPTAM.txt --ref=KITTI_00_gt.txt -p --plot_mode=xz
通过--ref
参数指定参考轨迹,并增加参数-a
(或--align
)进行对齐(旋转与平移)
此外,单目相机会存在尺度的不确定性,使用-s
(或 --correct_scale
)参数进行Sim(3)上的对齐(旋转、平移与尺度缩放)
evo_ape
:计算绝对位姿误差(absolute pose error),用于整体评估整条轨迹的全局一致性
evo_rpe
:计算相对位姿误差(relative pose error),用于评价轨迹局部的准确性。
两个指令也支持evo_traj
的可选参数,轨迹对齐-a
与尺度缩放-s
大多数中论文的指标为测量绝对误差
evo_ape kitti KITTI_00_ORB.txt KITTI_00_gt.txt -p --plot_mode=xz -a -s
显示轨迹误差结果
增加可选参数-p,可以绘制误差相关曲线
在进行评估时,若经过了缩放,在命令行中应将真实轨迹(参考轨迹)放在估计轨迹(计算轨迹)前方,避免在缩放时参考轨迹错误而造成误差被错误缩放。
evo_rpe kitti KITTI_00_ORB.txt KITTI_00_gt.txt -p --plot_mode=xyz -a -s -v --save_results /home/chan/Results/rpe.zip
cd ~/Results
evo_res rpe.zip -p --save_table table.csv
Evo支持多种数据集的轨迹格式(TUM、KITTI、EuRoC MAV、ROS的bag)和数据格式之间进行相互转换。
"把EuRoc的数据格式转化成TUM数据格式"
evo_traj euroc data.csv --save_as_tum
"TUM数据转换成kitti格式"
evo_traj tum traj_1.txt --save_as_kitti
" 把TUM数据格式转化成rosbag"
evo_traj tum traj_1.txt --save_as_bag
"查看配置"
evo_config show
"修改配置"
env_config set ***
plot_seaborn_style whitegrid //修改背景栅格 默认 darkgrid
plot_seaborn_palette bright //修改线条颜色 bright、deep6、colorblind、pastel、dark、muted 默认deep6
plot_linewidth 1.5 //修改线宽
plot_reference_color // 默认black
如果系统采用了IMU进行测量,还要注意时间戳对齐的问题
参考:使用 evo 工具评测 VI ORB SLAM2 在 EuRoC 上的结果
安装和编译ORB-SLAM2参考:https://blog.csdn.net/weixin_47074246/article/details/108690625
$ cd ORB_SLAM2
$ chmod +x build.sh
$ ./build.sh
下载官网:http://vision.in.tum.de/data/datasets/rgbd-dataset/download
TUM为RGB-D数据集,下载后进行解压。
命令
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
更改TUMX.yaml为TUM1.yaml,TUM2.yaml,TUM3.yaml,分别对应数据集freiburg1, freiburg2 and freiburg3 序列. PATH_TO_SEQUENCE_FOLDER
为下载数据集的解压目录。
例:rgbd_dataset_freiburg1_desk
cd ORB_SLAM2
mkdir results
cp KeyFrameTrajectory.txt ./results/TUM/freiburg1_desk/1/freiburg1_desk_Trajectory.txt
cd rgbd_dataset_freiburg1_desk
cp groundtruth.txt ~/ORB_SLAM2/results/TUM//freiburg1_desk/1/freiburg1_desk_groundtruth.txt
cd ~/ORB_SLAM2/results/freiburg1_desk
evo_traj tum freiburg1_desk_Trajectory.txt --ref=freiburg1_desk_groundtruth.txt -p --plot -s --correct_scale -a --align
保存为freiburg1_desk_trajectories.png
freiburg1_desk_xyzview.png
freiburg1_desk_rpyview.png
cd ~/ORB_SLAM2/results/freiburg1_desk
evo_ape tum freiburg1_desk_groundtruth.txt freiburg1_desk_Trajectory.txt -p --plot -s --correct_scale -a --align -v --save_results ~/ORB_SLAM2/results/freiburg1_desk/freiburg1_desk_ape.zip
保存为freiburg1_desk_ape.png
freiburg1_desk_apemap.png
cd ~/ORB_SLAM2/results/TUM/freiburg1_desk
evo_rpe tum freiburg1_desk_groundtruth.txt freiburg1_desk_Trajectory.txt -p -a -s -v --save_results ~/ORB_SLAM2/results/freiburg1_desk/freiburg1_desk_rpe.zip
保存为freiburg1_desk_rpe.png
freiburg1_desk_rpemap.png
cd ~/ORB_SLAM2/results/TUM/freiburg1_desk
evo_res freiburg1_desk_ape.zip -p --save_table freiburg1_desk_apetable.csv
保存为freiburg1_desk_statistics.png
freiburg1_desk_histogram.png
freiburg1_desk_boxplot.png
freiburg1_desk_violin_histogram.png
其中RMSE=0.0148187
下载官网:http://www.cvlibs.net/datasets/kitti/eval_odometry.php
下载的KITTI数据集为灰度图,下载后进行解压。
命令:
./Examples/Monocular/mono_kitti Vocabulary/ORBvoc.txt Examples/Monocular/KITTIX.yaml PATH_TO_DATASET_FOLDER/dataset/sequences/SEQUENCE_NUMBER
更改KITTIX.yaml为 KITTI00-02.yaml, KITTI03.yaml, KITTI04-12.yaml,分别对应压缩包 0 -2, 3, 4-12。PATH_TO_DATASET_FOLDER
为下载数据集的解压目录. 更改SEQUENCE_NUMBER
为00, 01, 02,…, 11.
例:00
cd ORB_SLAM2/results
mkdir kitti00
cp KeyFrameTrajectory.txt ./results/kitti00/kitti_00_ORB2.txt
cd poses
cp 00.txt ~/ORB_SLAM2/results/kitti00
将KITTI的ground truth
加上时间戳,转换成TUM格式的。在evo文件夹下有一个contrib
文件夹,里面有一个kitti_poses_and_timestamps_to_trajectory.py
文件。把KITTI数据集下的00.txt
和times.txt
文件拷贝到该目录,运行如下命令:
python3 kitti_poses_and_timestamps_to_trajectory.py 00.txt times.txt kitti_00_gt.txt
cd ORB_SLAM2/results/kitti00
evo_traj kitti 00.txt --save_as_tum
cd ~/ORB_SLAM2/results/kitti00
evo_traj tum kitti_00_ORB2.txt --ref=kitti_00_gt.txt -p --plot -s --correct_scale -a --align
保存为kitti_00_trajectories.png
kitti_00_xyzview.png
kitti_00_rpyview.png
cd ~/ORB_SLAM2/results/kitti00
evo_ape tum kitti_00_ORB2.txt kitti_00_gt.txt -p --plot -s --correct_scale -a --align -v --save_results kitti_00_ape.zip
保存为kitti_00_ape.png
kitti_00_apemap.png
cd ~/ORB_SLAM2/results/kitti00
evo_res kitti_00_ape.zip -p --save_table kitti_00_apetable.csv
保存为kitti_00_statistics.png
kitti_00_histogram.png
kitti_00_boxplot.png
kitti_00_violin_histogram.png
下载官网:http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
下载的EuRoC数据集为ASL格式,下载后进行解压。
对于MH序列,命令:
./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml PATH_TO_SEQUENCE_FOLDER/mav0/cam0/data Examples/Monocular/EuRoC_TimeStamps/SEQUENCE.txt
对于V1和V2序列,命令:
./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml PATH_TO_SEQUENCE/cam0/data Examples/Monocular/EuRoC_TimeStamps/SEQUENCE.txt
更改PATH_TO_SEQUENCE_FOLDER
和 SEQUENCE
cp KeyFrameTrajectory.txt ./results/EuRoC/MH_01_easy/MH01_ORB2.txt
cd MH_01_easy/mav0/state_groundtruth_estimate0
cp data.csv ~/ORB_SLAM2/results/EuRoC/MH_01_easy/MH01_gt.csv
EuRoc数据集需要将.csv
文件形式的groundtruth转换为TUM形式的轨迹文件。
evo_traj euroc MH01_gt.csv --save_as_tum
cd ~/ORB_SLAM2/results/MH_01_easy
evo_traj tum MH01_ORB2.txt --ref=MH01_gt.tum -p --plot -s --correct_scale -a --align
保存为MH01_trajectories.png
MH01_xyzview.png
MH01_rpyview.png
cd ~/ORB_SLAM2/results/MH_01_easy
evo_ape tum MH01_ORB2.txt MH01_gt.tum -p --plot -s --correct_scale -a --align -v --save_results MH01_ape.zip
保存为MH01_ape.png
MH01_apemap.png
cd ~/ORB_SLAM2/results/MH_01_easy
evo_res MH01_ape.zip -p --save_table MH01_apetable.csv
保存为MH01_statistics.png
MH01_histogram.png
MH01_boxplot.png
MH01_violin_histogram.png
参考:
https://blog.csdn.net/qq_40307605/article/details/104203474
https://blog.csdn.net/liu502617169/article/details/99406862
https://blog.csdn.net/HERO_CJN/article/details/105296614
https://blog.csdn.net/qq_41080854/article/details/104430828
https://blog.csdn.net/gyhjlauy/article/details/100598260
https://blog.csdn.net/hhaowang/article/details/105225595
https://blog.csdn.net/CSDNhuaong/article/details/101909888
https://blog.csdn.net/dcq1609931832/article/details/102465071
https://www.zhihu.com/question/56510863/answer/888846591