Advertisement

【SLAM】运行ORB-SLAM2并使用evo工具评估TUM/KITTI/EuRoC单目数据集

阅读量:

评估ORB-SLAM2在TUM、KITTI和EuRoC数据集上的性能,主要包含以下步骤:
安装依赖
使用Python安装必要的库,包括numpy、scipy和matplotlib,并安装evo工具。
运行ORB-SLAM2

  • 下载并解压数据集(如TUM、KITTI、EuRoC)。
  • 使用build.sh脚本编译代码,然后运行./build.sh。
  • 根据数据集类型,调整代码路径,运行./ORB-SLAM2/ORBvoc.txt生成估计轨迹。
    评估数据集
  • 使用evo工具对生成的轨迹与地面真实值进行对比,计算绝对位姿误差(APE)和相对位姿误差(RPE)。
  • APE通过计算绝对位姿的均方根误差(RMSE)评估,RPE通过计算相对位姿的均方根误差(RMSE)评估。
  • 生成结果文件并进行可视化分析,如误差图、直方图和箱线图。
    注意事项
  • 处理时间戳对齐问题,使用-s参数进行尺度调整,-a参数进行对齐。
  • 根据配置需求调整evo工具参数,如使用--correct_scale处理单目相机尺度不确定性。
  • 遇到错误时,优先使用pip安装evo的依赖库,或通过pip install --user重新安装。

单目下运行ORB-SLAM2并使用evo工具评估TUM/KITTI/EuRoC数据集

1 算法性能评估标准

  • (1)系统运行性能的评估指标-绝对位置误差(ATE)

  • (2)系统稳定性的评估指标-相对位置误差(RPE)

  • (3)精度统计量-误差均方根(RMSE)

  • 2 安装依赖项

    • (1)Numpy安装
    • (2)SciPy安装
    • (3)matplotlib安装
  • 3 evo安装

    • (1)pip安装
    • (2)源码安装
    • (3)测试
    • (4)报错处理
  • 4 evo使用

    • (1)轨迹可视化

    • (2)轨迹评估

      • 1)计算绝对位姿误差
      • 2)计算相对位姿误差
    • (3)结果比较

    • (4)格式转换

    • (5)配置更改

    • (6)时间戳对齐

  • 5 通过运行ORB-SLAM2对数据集进行评估

    • (1)对TUM数据集进行评估
      • (2)对KITTI数据集进行评估
      • (3)对EuRoC数据集进行评估

1 算法评价指标

当评估一个SLAM/算法的表现时,可以从时耗、复杂度、精度等多个方面进行分析。其中,精度的评价主要基于两个指标ATE和RPE。这两个evaluation metrics最早是在TUM数据集benchmark中定义的,且应用极为广泛。

定义一下公式标注:

该算法估计的位姿:P_1,...,P_n \in SE(3)
真实位姿:Q_1,...,Q_n \in SE(3)
下标代表时间t或帧,假设估计位姿和真实位姿各帧时间已对齐,总帧数相同。
各相隔时间的时间间隔:\Delta

系统性能评估机制采用绝对轨迹误差指标

绝对轨迹误差(absolute trajectory error)是通过计算相机位姿的真实值与SLAM系统估计值之间的偏差来衡量的。程序首先根据位姿的时间戳对真实值和估计值进行对准,然后计算每对位姿之间的偏差,并最终以图表的形式呈现,该指标特别适合用于评估视觉SLAM系统的性能。

绝对位姿误差是估计位姿与真实位姿直接计算的差值,可以直接反映算法的精度以及轨迹的整体一致性。估计位姿与groundtruth通常不在同一个坐标系中,因此我们需要先将两者对齐至同一尺度。

  • 对于双目SLAM和RGB-D SLAM:

利用最小二乘法推导估计位姿至真实位姿的转换关系,其中转换矩阵\text{S}属于特殊欧氏群SE(3)

  • 对于单目SLAM:

由于存在尺度不确定性,我们需要计算相应的相似转换矩阵 \text{S}\in Sim(3),以实现从估计位姿向真实位姿转换。

因此第i帧的ATE定义如下:

F_i:=Q_i^{-1}SP_i

与RPE相似,建议使用RMSE统计ATE

\text{RMSE}(F_{1:n},\Delta):=(\frac1m \sum_{i=1}^m \rVert trans(F_i) \Vert ^2)^{\frac12}

也可以使用平均值、中位数等来反应ATE亦可。

(2)系统漂移评估-相对轨迹误差(RPE)

相对位姿误差(relative pose error)用于衡量相同时间点位姿变化的差异。同样,在时间戳对齐后,真实位姿和估计位姿每隔相同时间间隔计算位姿变化的量度,通过计算两者的差值,可以得到相对位姿误差。该标准适用于评估估计系统的漂移程度。

相对位姿误差主要用来衡量相隔固定时间差\Delta的两帧位姿差的精度(相对于真实位姿),类似于直接测量里程计的误差。
接下来,我们定义第i帧的RPE(Relative Position Error)如下:

E_i:=(Q_i^{-1}Q_{i+\Delta})^{-1}(P_i^{-1}P_{i+\Delta})

在已知总数n与间隔\Delta的前提下,可得m=n-\Delta个RPE值,接着通过RMSE方法统计该误差,得到一个总体评估值。

\text{RMSE}(E_{1:n},\Delta):=(\frac1m \sum_{i=1}^m \rVert trans(E_i) \Vert ^2)^{\frac12}

其中trans(E_i)代表取相对位姿误差中的平移部分translation。

除了RMSE,还可以直接使用平均值、甚至中位数来描述相对误差情况。

需要注意的是,RPE由两部分误差构成,具体包括旋转误差和平移误差。通常情况下,仅通过平移误差即可进行评估,但若需要更全面的分析,可以采用相同的方法对旋转角误差进行统计。

在实际情况中,我们发现\Delta的取值方式多种多样,为了全面评估算法性能,建议计算遍历所有\Delta的RMSE均值。

\text{RMSE}(E_{1:n})=\frac1n\sum_{\Delta=1}^n \text{RMSE}(E_{1:n},\Delta).

然而,TUM在自身提供的工具框架内,基于固定数量的RPE样本进行估算,以计算出一个代表性的估计值作为最终输出结果。

综上所述,我们需要注意的是,RPE误差主要包含两部分:平移误差和旋转误差,而ATE仅涉及平移误差。两者间具有较强的相关性,但存在显著差异。在实际应用中,建议根据具体情况选择合适的评价指标来评估算法性能。

(3)精度统计量-均方根误差(RMSE)

均方根误差为回归评价指标。衡量观测值与真实值之间的偏差。

该指标主要作为机器学习模型预测结果的评估依据。

在这里插入图片描述

h(x_i)为观测值,y_i为预测值

2 安装依赖项

(1)Numpy安装

复制代码
    $ sudo apt-get update
    $ sudo apt-get install python-numpy

(2)SciPy安装

复制代码
    $ sudo apt-get install python-scipy

(3)matplotlib安装

复制代码
    $ sudo apt-get install python-matplotlib

3 evo安装

官网地址https://github.com/MichaelGrupp/evo

(1)pip安装

复制代码
    $ pip install evo --upgrade --no-binary evo

或者

(2)源码安装

复制代码
    $ git clone https://github.com/MichaelGrupp/evo
    $ cd evo
    $ pip install --editable . --upgrade --no-binary evo

(3)测试

复制代码
    $ evo_ape -h
在这里插入图片描述
  • 运行example
复制代码
    $ cd evo/test/data
    $ evo_traj kitti KITTI_00_ORB.txt KITTI_00_SPTAM.txt --ref=KITTI_00_gt.txt -p --plot_mode=xz
在这里插入图片描述
在这里插入图片描述

(4)报错处理

复制代码
    [ERROR] Unhandled error in evo.main_traj
  • 末尾说明是matplotlib版本冲突报错
复制代码
    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
  • 末尾说明是numpy版本需要更新
复制代码
    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

4 evo使用

评估标准
evo_ape - absolute pose error为绝对位姿偏差
evo_rpe - relative pose error为相对位姿偏差

工具
evo_traj-该工具可进行分析、绘制或导出轨迹,支持处理一个或多个轨迹
evo_res-该工具可比较evo_apeevo_rpe中的一个或多个结果文件,便于进行对比分析
evo_fig-该工具可重新打开已保存的序列化图,支持实验性功能
evo_config-该工具可管理全局设置和配置文件,用于文件操作管理

其他功能参考:https://github.com/MichaelGrupp/evo/wiki

(1)轨迹可视化

evo_traj
位置参数指定为{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),涉及旋转、平移和尺度缩放。

(2)轨迹评估

evo_ape:用于计算绝对位姿误差(absolute pose error),用于整体评估整条轨迹的全局一致性。

该算法用于评估轨迹的局部精度,其基于相对位姿误差的度量,用于衡量轨迹的准确性。

两个指令也支持evo_traj的可选参数,轨迹对齐-a与尺度缩放-s

1)计算绝对位姿误差

大多数中论文的指标为测量绝对误差

复制代码
    evo_ape kitti KITTI_00_ORB.txt KITTI_00_gt.txt -p --plot_mode=xz -a -s

显示轨迹误差结果

在这里插入图片描述

增加可选参数-p,可以绘制误差相关曲线

在这里插入图片描述
在这里插入图片描述

评估时,若缩放发生,应将真实轨迹(参考轨迹)放置在估计轨迹(计算轨迹)之前,以避免缩放时参考轨迹出现错误,从而导致误差被错误缩放。

2)计算相对位姿误差

复制代码
    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
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)结果比较

复制代码
    cd ~/Results
    evo_res rpe.zip -p --save_table table.csv
在这里插入图片描述
在这里插入图片描述

(4)格式转换

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
在这里插入图片描述

(5)配置更改

复制代码
    "查看配置"
    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
在这里插入图片描述

(6)时间戳对齐

为了实现对测量数据的准确获取,系统必须确保时间戳对齐问题得到妥善处理。

5 运行ORB-SLAM2并评估数据集

安装和编译ORB-SLAM2参考:<>

复制代码
    $ cd ORB_SLAM2
    $ chmod +x build.sh
    $ ./build.sh

(1)评估TUM数据集

下载官网: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和freiburg3序列。变量PATH_TO_SEQUENCE_FOLDER表示下载并解压数据集的目录位置。

例:rgbd_dataset_freiburg1_desk

  • 运行
在这里插入图片描述
  • 复制轨迹和groundtruth文件
复制代码
    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.pngfreiburg1_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

在这里插入图片描述
在这里插入图片描述
  • 输出ape结果,以便进行比较
复制代码
    cd ~/ORB_SLAM2/results/TUM/freiburg1_desk
    evo_res freiburg1_desk_ape.zip  -p --save_table freiburg1_desk_apetable.csv

按照以下文件名保存:freiburg1_desk_statistics.pngfreiburg1_desk_histogram.pngfreiburg1_desk_boxplot.pngfreiburg1_desk_violin_histogram.png

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其中RMSE=0.0148187

(2)评估KITTI数据集

下载官网: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,分别对应压缩包范围00-02、03、04-12。设PATH_TO_DATASET_FOLDER为解压数据集的目录路径。设SEQUENCE_NUMBER为00、01、02,…、11。

例:00

  • 复制轨迹和poses、times文件
复制代码
    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位姿文件转换为tum格式

在KITTI数据集中添加ground truth数据并附加时间戳后,将其转换为TUM格式。在evo文件夹中有一个contrib文件夹,其中包含一个名为kitti_poses_and_timestamps_to_trajectory.py的Python脚本文件。将KITTI数据集中的00.txttimes.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

  • 输出ape结果,以便进行比较
复制代码
    cd ~/ORB_SLAM2/results/kitti00
    evo_res kitti_00_ape.zip -p --save_table kitti_00_apetable.csv

将文件保存为kitti_00_statistics.pngkitti_00_histogram.pngkitti_00_boxplot.pngkitti_00_violin_histogram.png

(3)评估EuRoC数据集

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_FOLDERSEQUENCE

  • 复制轨迹
复制代码
    cp KeyFrameTrajectory.txt ./results/EuRoC/MH_01_easy/MH01_ORB2.txt
  • 复制并转换groundtruth文件
复制代码
    cd MH_01_easy/mav0/state_groundtruth_estimate0
    cp data.csv  ~/ORB_SLAM2/results/EuRoC/MH_01_easy/MH01_gt.csv

EuRoc数据集要求将.csv格式的ground truth数据转译为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

  • 输出ape结果,以便进行比较
复制代码
    cd ~/ORB_SLAM2/results/MH_01_easy
    evo_res MH01_ape.zip -p --save_table MH01_apetable.csv

将文件保存为带有statistics标签的MH01_文件格式的图像文件,文件名为MH01_statistics.png;同时保存带有histogram视觉表示的MH01_图像文件,文件名为MH01_histogram.png;另外,保存带有boxplot分布展示的MH01_图像文件,文件名为MH01_boxplot.png;最后,保存带有violin_histogram混合数据可视化效果的MH01_图像文件,文件名为MH01_violin_histogram.png


参考:
<>

<>

<>

<>

<>

<>

<>

<>

https://www.zhihu.com/question/56510863/answer/888846591

全部评论 (0)

还没有任何评论哟~