SLAM中常用到的评价指标

主要是想整理一下关于tum rgbd数据集和kitti数据集的评价指标,之后比较结果不能只看数值大小,还要非常清楚背后的含义。

一. 从TUM数据集出发

前提假设:
给出的位姿估计值为 P 1 . . . P n ∈ S E ( 3 ) P_1 ... P_n \in SE(3) P1...PnSE(3), 真值为 Q 1 . . . Q n ∈ S E ( 3 ) Q_1 ... Qn \in SE(3) Q1...QnSE(3), 下标代表时间t(或帧),这里假设估计位姿和真实位姿各帧时间已对齐,总帧数相同。

1. 相对位姿误差RPE(relative pose error)

用来评价轨迹中相隔固定时间的局部准确度, Δ \Delta Δ表示时间间隔,也可以转变成frame的间隔。 P i P_i Pi是估计的位姿,是一个4*4的矩阵,因此这个相对位姿误差是包括了旋转和平移的。
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=(Qi1Qi+Δ)1(Pi1Pi+Δ)

为什么要有一个指标来计算相隔固定时间差的两帧间位姿“差”的精度呢?
理解:里程计本身就是为了估计相邻帧之间的定位精度,举例子就是为了估计人走一步的距离(类似于位姿“差”),RPE就是为了估计这人走一步的精度是怎么样的。

RMSE
实验比较中写的RMSE(root mean squared error),是平方后求均值再开根号,其中 m = n − Δ m=n - \Delta m=nΔ
R M S E ( E 1 : n , Δ ) : = ( 1 m ∑ i = 1 m ∥ t r a n s ( E i ) ∥ 2 ) 1 2 RMSE(E_{1:n}, \Delta) := (\frac{1}{m} \sum_{i=1}^m \Vert trans(E_i) \Vert ^2 )^{\frac{1}{2}} RMSE(E1:n,Δ):=(m1i=1mtrans(Ei)2)21

也有人不用RMSE,直接使用平均值、甚至中位数来描述相对误差情况。 需要注意的是,RPE包含了两部分的误差,分别是旋转误差和平移误差,通常使用平移误差进行评价已足够,但如果需要,旋转角的误差也可以使用相同的方法进行统计。

举例

  • 对于匹配相邻帧的视觉里程计系统, Δ = 1 \Delta=1 Δ=1是直觉的选择,算出来的 R M S E ( E 1 : n ) RMSE(E_{1:n}) RMSE(E1:n)就能给出每帧的偏移;如果对于一个序列记录频率是30Hz的系统, Δ = 30 \Delta=30 Δ=30时就相当于是在算每一秒的偏移。
  • 如果直接取最大值 Δ = n \Delta=n Δ=n, 就代表着直接去比较起点和终点,这样度量就会产生误导性,因为他对起始时的旋转误差的惩罚比终点时更大(这里个人的理解就是,相同的旋转误差,如果发生在起点附近,对最后的偏移影响会更大,因为后续所有的位姿都会被影响。TUM一个数据集随便就是几千帧,差别肯定会很明显)。所以说,为了避免这种不一致的影响,就会来平均所有可能的 Δ \Delta Δ值的结果

实际情况中,我们发现对 Δ \Delta Δ的选取有多种选择,为了能综合衡量算法表现,我们可以计算遍历所有 Δ \Delta Δ的RMSE的平均值:
R M S E ( E 1 : n , Δ ) : = 1 n ∑ Δ = 1 n R M S E ( E 1 : n , Δ ) RMSE(E_{1:n}, \Delta) := \frac{1}{n} \sum_{\Delta=1}^n RMSE(E_{1:n}, \Delta) RMSE(E1:n,Δ):=n1Δ=1nRMSE(E1:n,Δ)
但这样计算复杂度非常高,很耗时间,所以最终在TUM的工具中,通过计算固定数量的RPE样本计算一个估计值作为结果。

*这里的trans是指的平移部分,也可以计算旋转的。 怎么对3*1的平移求模长??对两种“位姿差”求

2. 绝对轨迹误差ATE(absolute trajectory error)

把跑出来的轨迹直接和gt轨迹计算误差,可以非常直观地反应算法精度和轨迹全局一致性。但是,因为估计位姿和groundtruth通常不在同一坐标系中,所以要先将两者对齐:
1)对于双目SLAM和RGB-D SLAM,尺度统一,因此我们需要通过最小二乘法计算一个从估计位姿到真实位姿的转换矩阵 S ∈ S E ( 3 ) S \in SE(3) SSE(3)
2)对于单目相机,具有尺度不确定性,我们需要计算一个从估计位姿到真实位姿的相似转换矩阵 S ∈ S i m ( 3 ) S \in Sim(3) SSim(3)。 因此第i帧的ATE定义如下:
F i : = Q i − 1 S P i F_i := Q_i^{-1} S P_i Fi:=Qi1SPi

与RPE相似,建议使用RMSE统计ATE:
R M S E ( F 1 : n , Δ ) : = ( 1 m ∑ i = 1 m ∥ t r a n s ( F i ) ∥ 2 ) 1 2 RMSE(F_{1:n}, \Delta) := (\frac{1}{m} \sum_{i=1}^m \Vert trans(F_i) \Vert ^2 )^{\frac{1}{2}} RMSE(F1:n,Δ):=(m1i=1mtrans(Fi)2)21
当然,使用平均值、中位数等来反应ATE都可以。 综上,我们需要注意的是,RPE误差包含了translation和rotation两部分的误差,而ATE只包含translation的误差(论文里又说ATE会间接捕捉到旋转误差,因为旋转误差也可能体现在错误的平移上),二者具有强烈的相关性,却也不尽相同。我们仍需结合实际,选择合适的指标进行算法评价。
论文中说道:
用所有可能的 Δ \Delta Δ求平均值得到的RPE也可以用来评估轨迹的全局误差。这时的RPE总会比ATE稍微大一点(如果等于的化,就说明没有旋转误差),下面还给出了图示:
SLAM中常用到的评价指标_第1张图片

在检索时看到答主大佬评论区的几个问答(供参考):
Q1:在TUM格式的位姿结果,当相机不动即每帧真值的平移和旋转都不变(统一设为0,0,0,0,0,0,1),此时evo还可以评估ape吗?跑的时候会出现[ERROR]“Degenerate covariance ranke,Umeyama alignment is not possible”
A: 这个错误是进行轨迹对齐的时候发生的,因为没有足够的约束无法求解。可以试试去掉-a选项。默认not align即可。

Q2:现实slam 时间与Ground truth 都是不同的,而且帧数也不同。请问有什么方法来对齐时间戳?
A:EVO本身提供了时间戳对齐的选项,前提是要有时间戳。像ORB SLAM跑出的单目结果,轨迹里只包含关键帧位姿,并且尺度也不一致,可以加-as选项,将估计的轨迹做一个7DoF变换与groundtruth对齐。

Q3:用evo评估轨迹精度(使用旋转对齐和尺度缩放),会导致轨迹起点与真值起点不一样,请问这样算出的APE科学吗(其他几种评估算法大都将起点设置为与真值一致)?还是说evo的评价角度不一样:侧重于评价整体轨迹趋势?
A:其实学届对这个问题也有争议,有一个观点认为只拿前几帧的数据与真值对齐(相当于你说的把起点对齐)更符合判断轨迹误差的直觉,但这样通常会使得后面的轨迹偏移的过大,反而不好比较整体轨迹的走向或模式。我认为只要保证使用的评价标准一致,那么这个指标还是可以提现出算法的表现优劣。

Q4:orbslam2的stereo对应的三个指标RPE(%) RRE(度/100m) ATE(m)前面两个怎么通过evo的结果得到呢? (这个问题和kitti的评价标准有关)
A:https://blog.csdn.net/xiaoxiaoyikesu/article/details/108963108#t3

二. 关于evo的实际使用

这里记录几条实际使用过程中经常用到的点。

1. 常用数据格式

有tum,kitti,euroc, 具体的说明参考https://github.com/MichaelGrupp/evo/wiki/Formats

2. 常用指令

1) 轨迹可视化

evo_traj kitti KITTI_00_ORB.txt KITTI_00_SPTAM.txt --ref=KITTI_00_gt.txt -p --plot_mode=xz

2)APE

在evo中,有关于APE的指令,注意evo_ape默认情况下计算的是ATE(相当于默认加了参数-r tran_part),如果想计算APE,可以加上参数-r full

evo_ape kitti KITTI_00_gt.txt KITTI_00_ORB.txt -va --plot --plot_mode xz
evo_ape kitti KITTI_00_gt.txt KITTI_00_ORB.txt -va --plot --plot_mode xz --save_results results/ORB.zip

3) RPE

evo_rpe tum fr2_desk_groundtrutr2_desk_ORB.txt -va --plot --plot_mode xyz

4) evo_res

先用evo_ape得到zip,再使用evo_res得到可视化的结果

3. 如何与论文中结果对应

下面是dynaSLAM论文中的结果:
SLAM中常用到的评价指标_第2张图片ATE[m]: 这个使用evo_ape 默认参数,得到的rmse就是结果了
对于另外两个指标,可以用KITTI-odometry-tool来计算,定义可以参考论文VSO: Visual Semantic Odometry, 其他两个指标表示:
在这里插入图片描述
RPE[%]: 每100m的平均相对translation error(m) (理解:所以单位就变成了百分之一,成了一个百分号)
RRE[deg/100m]: 每100m的平均相对rotation error(degree)。
可以先利用EVO算出轨迹整体RPE,分别为translation和rotation,然后除以ground truth的里程(单位:百米),得到最终结果。

可以使用KITTI_odometry_evaluation_tool得到结果:
SLAM中常用到的评价指标_第3张图片这里是RRE[deg/m],所以最后一个值要乘以100才能变为RRE[deg/100m]。
* kitti提供的evaluation工具源码与EVO或者TUM数据集工具的不同之处在于:它是将距离[100 200 …800](m) 作为计算RPE所需两帧之间的interval,而不是时间或帧数,并且将单个计算结果都除以了长度,而EVO则没有。另外EVO的interval采样更丰富,所以理论上讲,EVO的RPE结果除以100m,应该与KITTI evaluation tool得到的结果接近。


参考:
1.论文 A Benchmark for the Evaluation of RGB-D SLAM Systems
2.https://zhuanlan.zhihu.com/p/105428199
3.https://blog.csdn.net/xiaoxiaoyikesu/article/details/108963108#t3

相关推荐:

1.单目ORB-SLAM2 跑KITTI数据集的时候怎么做到和ground truth对齐呢?https://www.zhihu.com/question/56510863
2.除了evo还有一个评估工具rpg_trajectory_evaluation:https://github.com/uzh-rpg/rpg_trajectory_evaluation
3.增加对误差评价的理解:A Tutorial on Quantitative Trajectory Evaluation for Visual(-Inertial) Odometry

你可能感兴趣的:(SLAM,自动驾驶,slam,evo)