视觉SLAM数据集(一):TUM DataSet

首先给出数据集下载地址:TUM Dataset Download。 如果你是第一次做实验,建议下载xyz的数据集,因为它的动作相对很小,只包含桌面上的一小部分。一旦成功测试,就可以试试desk数据集,它包含四张桌子和几个闭环。

数据集目录

  • 一、文件格式
    • 1、彩色图像和深度图
    • 2、真实轨迹
    • 3、Kinect相机的内参标定
  • 二、固有的相机参数
    • 1、彩色摄像机的标定
    • 2、深度图像的标定
    • 3、红外摄像头的标定
    • 4、视觉检验的视频
  • 三、RGB-D 基准测试的有用工具
    • 1、关联颜色和深度图像
    • 2、评估
      • 2.1、绝对轨迹误差 (ATE)
      • 2.2、相对姿势误差 (RPE)
    • 3、从图像生成点云
    • 4、将点云添加到 ROS 包文件
    • 5、在 RVIZ 中可视化数据集
  • 四、详细信息
    • 1、测试和调试
    • 2、手持式SLAM
    • 3、机器人SLAM
    • 4、结构与纹理
    • 5、动态对象
    • 6、3D 物体重建
    • 7、验证文件(无公开的真实值)
    • 8、校准文件

一、文件格式

从Kinect相机拍摄的RGB-D数据集格式如下:

1、彩色图像和深度图

我们提供带时间戳的彩色和深度图像作为一个压缩包文件(tar.gz)。

  • color图像都是640×480的8位RGB图像,格式是PNG。
  • depth图像是640×480的16位单色图像,格式是PNG。
  • color和depth图像已经使用PrimeSense的OpenNI驱动程序进行了预校准,即color图像和depth图像中的像素已经1:1对应。
  • depth图像按因子5000缩放,即深度图像中的像素值5000对应于距相机1米的距离、10000对应于2米的距离等。像素值0表示缺失值/无数据。

2、真实轨迹

我们提供了一个在固定坐标系中包含相机的平移和方向的txt文件作为真实的轨迹。请注意,我们的自动评估工具期望的是这样格式的真实轨迹和预测轨迹。

  • 在txt文件中每一行包含一个位姿
  • 每一行的形式都是“timestamp tx ty tz qx qy qz qw
  • 时间戳(float)表示从Unix时代以来的秒数
  • tx ty tz(3 floats)表示彩色相机的光学中心相对于运动捕捉系统定义的世界原点的位置
  • qx qy qz qw (4 floats)以世界原点的单位四元数的形式给出彩色相机的光学中心的方向。
  • 文件可能包含必须以#开头的注释

3、Kinect相机的内参标定

Kinect基于高级多项式扭曲函数,在相机上存储了出厂校准。OpenNI驱动程序使用此校准来消除图像失真,并将Depth图像(由红外相机拍摄)配准到RGB图像。因此,我们数据集中的深度图像被重新投影到彩色相机的框架中,这意味着深度图和彩色图像中的像素之间存在1:1的对应关系。

从2D图像到3D点云的转换工作如下。注意,每个相机的焦距(fx/fy)、光学中心(cx/cy)、失真参数(d0-d4)和深度校正因子是不同的。下面的Python代码说明了如何根据像素坐标和深度值计算3D点:

fx = 525.0  # focal length x
fy = 525.0  # focal length y
cx = 319.5  # optical center x
cy = 239.5  # optical center y

factor = 5000 # for the 16-bit PNG files
# OR: factor = 1 # for the 32-bit float images in the ROS bag files

for v in range(depth_image.height):
  for u in range(depth_image.width):
    Z = depth_image[v,u] / factor;
    X = (u - cx) * Z / fx;
    Y = (v - cy) * Z / fy;

二、固有的相机参数

注意,上面的脚本使用默认(未校准)的内在参数。fr1和fr2数据集中使用的Kinect的固有参数如下:

1、彩色摄像机的标定

我们从rgbd_dataset_freiburg1/2_RGB_acalibration.bag计算了RGB相机的固有参数。

注意,Freiburg 3序列的彩色图像和红外图像都已经无失真了,因此失真参数都为零。原始失真值可以在tgz文件中找到。
注意:我们建议使用ROS默认数据集(即,无失真),因为预配准的深度图像的失真并不重要。

2、深度图像的标定

我们通过将报告的深度值与RGB标定板估计的深度进行比较来验证深度值。在本实验中,我们发现Kinect报告的深度值偏离了恒定的缩放因子,如下表所示:

Camerads
Freiburg 1 Depth1.035
Freiburg 2 Depth1.031
Freiburg 3 Depth1.000

注意:我们已经对所有序列的深度图像进行了相应的预缩放,因此不需要在您一侧进行任何操作。

3、红外摄像头的标定

我们还提供了红外摄像头的内参。注意我们数据集提供的depth图像已经和rgb图像预配准了。因此,不需要根据内参再校准depth图像。

注意,Freiburg 3序列的彩色图像和红外图像都已经无失真了,因此失真参数都为零。原始失真值可以在tgz文件中找到。

4、视觉检验的视频

对于单个数据集的视觉检查,我们还提供Kinect(RGB和Depth)和外部摄像机的电影。电影格式是存储在AVI容器中的mpeg4。

三、RGB-D 基准测试的有用工具

我们提供了一组工具,可用于预处理数据集并评估 SLAM/跟踪结果。脚本可以点这里下载。

要使用 Subversion 签出存储库,请运行

svn checkout https://svncvpr.in.tum.de/cvpr-ros-pkg/trunk/rgbd_benchmark/rgbd_benchmark_tools

1、关联颜色和深度图像

Kinect 以不同步的方式提供颜色和深度图像。这意味着来自彩色图像的时间戳集不会与深度图像的时间戳集相交。因此,我们需要某种将彩色图像与深度图像相关联的方法。为此,您可以使用“associate.py”脚本。它从文件和文件中读取时间戳,并通过查找最佳匹配项来联接它们。

usage: associate.py [-h] [--first_only] [--offset OFFSET]
                    [--max_difference MAX_DIFFERENCE]
                    first_file second_file

This script takes two data files with timestamps and associates them

positional arguments:
  first_file            first text file (format: timestamp data)
  second_file           second text file (format: timestamp data)

optional arguments:
  -h, --help            show this help message and exit
  --first_only          only output associated lines from first file
  --offset OFFSET       time offset added to the timestamps of the second file
                        (default: 0.0)
  --max_difference MAX_DIFFERENCE
                        maximally allowed time difference for matching entries
                        (default: 0.02)

2、评估

在估计 Kinect 的相机轨迹并将其保存到文件中后,我们需要通过将其与地面事实进行比较来评估估计轨迹中的误差。有不同的错误指标。两种突出的方法是绝对轨迹误差(ATE)和相对姿势误差(RPE)。ATE 非常适合测量可视 SLAM 系统的性能。相比之下,RPE非常适合测量视觉里程计系统的漂移,例如每秒漂移。

对于这两个指标,我们提供了可在此处下载的自动评估脚本。请注意,我们的网站上还有一个在线版本。 这两个轨迹都必须存储在一个文本文件中(格式:“时间戳 tx ty tz qx qy qy qw”,更多信息)。为了进行比较,我们提供一组轨迹来自 RGBD-SLAM。

2.1、绝对轨迹误差 (ATE)

绝对轨迹误差直接测量真实轨迹点与估计轨迹点之间的差异。作为预处理步骤,我们使用时间戳将估计的姿势与真实姿势相关联。基于这种关联,我们使用奇异值分解来对齐真实轨迹和估计轨迹。最后,我们计算每对姿势之间的差异,并输出这些差异的平均值/中位数/标准偏差。或者,该脚本可以将这两个轨迹绘制到 png 或 pdf 文件中。

usage: evaluate_ate.py [-h] [--offset OFFSET] [--scale SCALE]
                       [--max_difference MAX_DIFFERENCE] [--save SAVE]
                       [--save_associations SAVE_ASSOCIATIONS] [--plot PLOT]
                       [--verbose]
                       first_file second_file

This script computes the absolute trajectory error from the ground truth
trajectory and the estimated trajectory.

positional arguments:
  first_file            first text file (format: timestamp tx ty tz qx qy qz
                        qw)
  second_file           second text file (format: timestamp tx ty tz qx qy qz
                        qw)

optional arguments:
  -h, --help            show this help message and exit
  --offset OFFSET       time offset added to the timestamps of the second file
                        (default: 0.0)
  --scale SCALE         scaling factor for the second trajectory (default:
                        1.0)
  --max_difference MAX_DIFFERENCE
                        maximally allowed time difference for matching entries
                        (default: 0.02)
  --save SAVE           save aligned second trajectory to disk (format: stamp2
                        x2 y2 z2)
  --save_associations SAVE_ASSOCIATIONS
                        save associated first and aligned second trajectory to
                        disk (format: stamp1 x1 y1 z1 stamp2 x2 y2 z2)
  --plot PLOT           plot the first and the aligned second trajectory to an
                        image (format: png)
  --verbose             print all evaluation data (otherwise, only the RMSE
                        absolute translational error in meters after alignment
                        will be printed)

2.2、相对姿势误差 (RPE)

为了计算相对姿势误差,我们提供了一个脚本“evaluate_rpe.py”.此脚本计算时间戳对之间的相对运动误差。默认情况下,脚本计算估计轨迹文件中所有时间戳对之间的误差。由于估计轨迹中的时间戳对数在轨迹长度上是二次的,因此将此集合下采样为固定数量 (–max_pairs) 是有意义的。或者,可以选择使用固定窗口大小 (–fixed_delta)。在这种情况下,估计轨迹中的每个姿势都根据窗口大小 (–delta) 和单位 (–delta_unit) 与后面的姿势相关联。此评估技术对于估计漂移很有用。

usage: evaluate_rpe.py [-h] [--max_pairs MAX_PAIRS] [--fixed_delta]
                       [--delta DELTA] [--delta_unit DELTA_UNIT]
                       [--offset OFFSET] [--scale SCALE] [--save SAVE]
                       [--plot PLOT] [--verbose]
                       groundtruth_file estimated_file

This script computes the relative pose error from the ground truth trajectory
and the estimated trajectory.

positional arguments:
  groundtruth_file      ground-truth trajectory file (format: "timestamp tx ty
                        tz qx qy qz qw")
  estimated_file        estimated trajectory file (format: "timestamp tx ty tz
                        qx qy qz qw")

optional arguments:
  -h, --help            show this help message and exit
  --max_pairs MAX_PAIRS
                        maximum number of pose comparisons (default: 10000,
                        set to zero to disable downsampling)
  --fixed_delta         only consider pose pairs that have a distance of delta
                        delta_unit (e.g., for evaluating the drift per
                        second/meter/radian)
  --delta DELTA         delta for evaluation (default: 1.0)
  --delta_unit DELTA_UNIT
                        unit of delta (options: 's' for seconds, 'm' for
                        meters, 'rad' for radians, 'f' for frames; default:
                        's')
  --offset OFFSET       time offset between ground-truth and estimated
                        trajectory (default: 0.0)
  --scale SCALE         scaling factor for the estimated trajectory (default:
                        1.0)
  --save SAVE           text file to which the evaluation will be saved
                        (format: stamp_est0 stamp_est1 stamp_gt0 stamp_gt1
                        trans_error rot_error)
  --plot PLOT           plot the result to a file (requires --fixed_delta,
                        output format: png)
  --verbose             print all evaluation data (otherwise, only the mean
                        translational error measured in meters will be
                        printed)

3、从图像生成点云

深度图像已配准到彩色图像,因此深度图像中的像素已与彩色图像中的像素一一对应。因此,生成彩色点云非常简单。示例脚本位于“generate_pointcloud.py”,以彩色图像和深度图为输入,并生成PLY格式的点云文件。这种格式可以被许多3D建模程序读取,例如meshlab。您可以下载适用于Windows,Mac和Linux的meshlab。

usage: generate_pointcloud.py [-h] rgb_file depth_file ply_file

This script reads a registered pair of color and depth images and generates a
colored 3D point cloud in the PLY format.

positional arguments:
  rgb_file    input color image (format: png)
  depth_file  input depth image (format: png)
  ply_file    output PLY file (format: ply)

optional arguments:
  -h, --help  show this help message and exit

4、将点云添加到 ROS 包文件

在下载页面上,我们已经为RVIZ中的视觉检查数据集提供了ROS包文件,并添加了点云。由于生成的文件很大,我们将这些包文件缩减采样为 2 Hz。如果要生成包含所有图像(30 Hz)的点云的ROS包文件,则可以使用“add_pointclouds_to_bagfile.py”脚本。

usage: add_pointclouds_to_bagfile.py [-h] [--start START]
                                     [--duration DURATION] [--nth NTH]
                                     [--skip SKIP] [--compress]
                                     inputbag [outputbag]

This scripts reads a bag file containing RGBD data, adds the corresponding
PointCloud2 messages, and saves it again into a bag file. Optional arguments
allow to select only a portion of the original bag file.

positional arguments:
  inputbag             input bag file
  outputbag            output bag file

optional arguments:
  -h, --help           show this help message and exit
  --start START        skip the first N seconds of input bag file (default:
                       0.0)
  --duration DURATION  only process N seconds of input bag file (default: off)
  --nth NTH            only process every N-th frame of input bag file
                       (default: 15)
  --skip SKIP          skip N blocks in the beginning (default: 1)
  --compress           compress output bag file

5、在 RVIZ 中可视化数据集

RVIZ是ROS中的标准可视化工具。它可以很容易地适应显示许多不同的消息。特别是,它可用于显示ROS包文件中的点云。为此,请运行(在三个不同的控制台中)

roscore
rosrun rviz rviz
rosbag play rgbd_dataset_freiburg1_xyz-2hz-with-pointclouds.bag

如果这是第一次启动,则必须启用内置显示(菜单 –>插件 –>选中内置插件的“已加载”)。在显示选项卡中,将“固定帧”设置为“/world”。单击“添加”,然后选择 PointCloud2 显示,并将主题设置为“/camera/rgb/points”。要显示颜色,请在点云显示中将“颜色转换器”更改为“RGB8”,并将“样式”更改为“点”。如果需要,可以将衰减时间设置为合适的值(例如 5 秒),以便在点进入时累积查看器中的点。然后,结果应如下所示:


名称为*_validation这些序列不包含基本事实。他们只能使用在线工具进行评估。

四、详细信息

1、测试和调试

freiburg1_xyz
对于此序列,Kinect 指向办公环境中的典型办公桌。此序列仅包含沿 Kinect 主轴的平移运动,而方向(大部分)保持固定。此序列非常适合调试目的,因为它非常简单。
freiburg1_rpy
对于此序列,Kinect 指向办公环境中的典型办公桌。当我们保持位置固定时,我们沿所有三个主轴旋转 Kinect(RPY=滚动-俯仰-偏航)。此序列非常适合调试目的,即检查方向估计/跟踪是否有效。
freiburg2_xyz
此序列包含用于调试翻译的非常干净的数据。Kinect 沿主轴在 x、y 和 z 方向上非常缓慢地移动。慢速相机运动基本上确保数据中(几乎)没有运动模糊和滚动快门效果。
freiburg2_rpy
此序列包含用于调试旋转的非常干净的数据。Kinect 在原地非常缓慢地绕主轴转动(RPY 代表滚动俯仰偏航)。慢速相机运动基本上确保数据中(几乎)没有运动模糊和滚动快门效果。

2、手持式SLAM

freiburg1_360
此序列包含典型办公环境中的 360 度转弯。
freiburg1_floor
简单地扫过办公室的木地板。地板包含几个结孔,使用SIFT或SURF等视觉特征检测器可以轻松跟踪。此外,大部分场景(地板)都是平面的,除了一把办公椅在一段时间后变得可见。
freiburg1_desk
此序列包含典型办公环境中对四张办公桌的多次扫描(在相同的四张办公桌中还有第二个序列称为 desk2)。
freiburg1_desk2
此序列包含典型办公环境中对四张办公桌的多次扫描(类似于办公桌,但第二次录制)。
freiburg1_room
对于这个序列,我们沿着整个办公室的轨迹拍摄。它从四张桌子开始(参见办公桌和办公桌2的顺序),但继续围绕房间的(外)墙,直到环闭合。此序列非常适合评估 SLAM 系统应对闭环的能力。
freiburg2_desk
对于这个序列,我们录制了一个典型的办公室场景,有两张桌子、一台电脑显示器、键盘、电话、椅子等。Kinect 在两个表周围移动,以便闭合循环。在freiburg2_person中也有类似的序列,其中还有一个人坐在其中一张桌子上,他在录制过程中移动了各种物体。
freiburg3_long_office_household
华硕Xtion传感器在家庭和办公室场景中沿着大圆圈移动,具有许多纹理和结构。轨迹的终点与起点重叠,因此有一个大的环闭合。

3、机器人SLAM

freiburg2_pioneer_360
这个序列是从安装在先锋机器人顶部的 Kinect 录制的。先锋当场操纵了(超过)360度转弯。袋子文件还包含机器人的激光扫描和测程数据。

4、结构与纹理

freiburg3_nostructure_texture_far
华硕Xtion沿着纹理平面移动了两米高。纹理具有高度的辨别性,因为它由几张会议海报组成。

5、动态对象

freiburg3_sitting_static
两个人坐在桌子前,说话,打了个手势。华硕Xtion传感器已手动固定到位。该序列旨在评估视觉 SLAM 和测程算法对缓慢移动的动态对象的鲁棒性。
freiburg3_sitting_rpy

两个人坐在桌子前,说话,打了个手势。华硕Xtion传感器已在同一位置沿主轴(滚动-俯仰-偏航)旋转。该序列旨在评估视觉 SLAM 和测程算法对缓慢移动的动态对象的鲁棒性。

6、3D 物体重建

freiburg3_teddy
华硕Xtion传感器在不同的高度绕着泰迪熊移动了两轮。泰迪熊有柔软的皮毛,穿着黄色光滑的衬衫。

7、验证文件(无公开的真实值)

freiburg1_desk2_validation
此序列包含典型办公环境中对四张办公桌的多次扫描(类似于办公桌,但第二次录制)。
freiburg3_sitting_rpy_validation
两个人坐在桌子旁,说话,打了个手势。华硕Xtion传感器已在同一位置沿主轴(滚动-俯仰-偏航)旋转。该序列旨在评估视觉 SLAM 和测程算法对缓慢移动的动态对象的鲁棒性。

8、校准文件

freiburg1_rgb_calibration
此序列包含棋盘格校准期间 Kinect 的颜色和深度图像。棋盘角的边长为0.02m。此序列旨在验证校准和重新校准。我们将此序列用于 (1) 查找动作捕捉系统和 Kinect 光学帧之间的外部摄像机参数,以及 (2) 估计动作捕捉系统和 Kinect 之间的时间戳延迟。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年11月27日
下一篇 2023年11月27日

相关推荐