☰
TUM、KITTI、EuRoC三大SLAM数据集详解:从格式到评测的避坑指南
2026/11/2 12:06:21 网站建设 项目流程

简介:面向SLAM、视觉里程计与自动驾驶方向的学习者与研究者,这份文档系统梳理了TUM RGB-D、KITTI与EuRoC三大主流数据集的采集平台、数据组织与评测方式,帮助读者在选数据集、搭实验环境时快速建立整体认知。压缩包内为1个docx文件,约1.93MB,按数据集分节展开:TUM部分说明Kinect彩色图与深度图的存储格式、深度值5000倍缩放关系、groundtruth轨迹的timestamp与四元数位姿格式,以及ATE、RPE两项评价准则和点云生成脚本的用法;KITTI部分介绍采集车传感器配置、raw data分类与标定文件组织;EuRoC部分简述微型无人机多传感器数据构成。已有9650人学习下载,适合需要横向对比数据集格式、撰写实验方案或复现评测流程的读者作为查阅手册使用。

1. 三个数据集,三种“考场”:搞懂 TUM、KITTI、EuRoC 到底在考什么

刚接触视觉 SLAM 或自动驾驶感知的人,常会碰到一个尴尬场面:论文里写着“在 TUM 上验证”“在 KITTI 上评测”“在 EuRoC 上对比”,你打开官网一看,满屏的压缩包、标定文件、时间戳,瞬间不知道从哪下手。其实这三个名字,本质上是三个不同难度的“考场”——TUM 考你在小房间里拿着相机慢慢走能不能把轨迹算准,KITTI 考你开着车在街上跑能不能同时认出车、人、路,EuRoC 考你让一架小无人机在室内飞能不能靠双目加惯性稳住自己。搞懂它们各自考什么、怎么打分,你再看论文里的实验表格,就不会一头雾水,也知道自己手头的算法该往哪个考场送。

2. TUM RGB-D:小场景里的“精细体检”

2.1 它到底是什么:一台 Kinect 加一套动作捕捉

TUM RGB-D SLAM Dataset and Benchmark 由某高校计算机视觉组制作,采集设备是一台 Kinect 相机,同时记录彩色图、深度图,部分序列还带 IMU 数据。更关键的是,采集现场架了一套高精度运动采集系统,用多个红外相机追踪贴在设备上的反光标记,从而给出毫米级精度的真实位姿——也就是大家常说的 groundtruth(真值)。有了真值,你算法跑出来的轨迹才有“标准答案”可以对照。

它的文件组织很朴素:彩色图和深度图分别打包成 gzip 压缩文件(TGZ),彩色图是 640×480 的 8 位 RGB PNG,深度图是 640×480 的 16 位单色 PNG。这里有个新手最容易翻车的点:深度图的像素值不是米,而是被放大了 5000 倍,像素值 5000 才对应 1 米,像素值 0 表示这个点没有深度数据。你要是直接拿像素值当米用,算出来的点云会大到离谱。

真值轨迹用 txt 存,每行一个位姿,格式是timestamp tx ty tz qx qy qz qw。前四个数里,timestamp 是自 Unix 纪元起的秒数,tx ty tz 是彩色相机光心相对运动捕捉系统世界原点的位置;后四个是单位四元数,描述相机光心的朝向。用 ROS 的人还能拿到 bag 文件,彩色图、单色图、深度图、相机内参、点云和变换都塞在一个文件里,回放起来省事。

2.2 为什么它值得用:ATE 和 RPE 两把尺子

TUM 提供在线评测脚本,核心是两个指标:ATE(绝对轨迹误差)和 RPE(相对姿势误差)。ATE 直接量真实轨迹和估计轨迹上对应点之间的距离,预处理时先用时间戳把估计位姿和真值位姿关联起来,再用奇异值分解把两条轨迹对齐,最后算每对位姿差值的均值、中位数、标准差,还能顺手把两条轨迹画成 png 或 pdf。它适合衡量一个完整 SLAM 系统的整体表现——你建出来的图跟真实世界差多少。

RPE 则换了个思路,它看的是“相对运动”的误差:取时间戳对,比较两帧之间估计的相对位移和真值里的相对位移差多少。默认会算所有时间戳对,但轨迹一长,对数就是平方级增长,所以脚本支持用-max_pairs下采样,或者用-fixed_delta配-delta和-delta_unit固定一个窗口。RPE 特别适合看视觉测距系统的漂移,比如“每秒漂多少”。

提示:ATE 看整体形状对不对,RPE 看局部增量稳不稳,两个指标一起看,才能判断你的算法是“整体偏了”还是“越走越飘”。

2.3 点云怎么来:深度图和彩色图已经对齐

TUM 的深度图已经配准到彩色图上,也就是说深度图里每个像素和彩色图里同一位置的像素是一一对应的。所以生成彩色点云非常直接:拿彩色图取颜色,拿深度图取距离(记得除以 5000 换成米),再结合相机内参反投影成三维点。官方给了generate_pointcloud.py示例脚本,输入彩色图和深度图,输出 PLY 格式点云,Meshlab 这类三维软件都能直接打开看。在 ROS 里回放带点云的 bag,配合 rviz 就能看到实时效果。

3. KITTI:马路上的“全能大考”

3.1 它到底是什么:一辆改装车顶着一堆传感器

KITTI Vision Benchmark Suite 由某高校和另一所工科院校合作制作,面向自动驾驶。采集车是一辆改装过的轿车,后备箱里塞了一台 8 核 i7 计算机跑 Ubuntu 录数据。车顶的传感器阵容相当豪华:1 个惯性导航系统(GPS/IMU)、1 台 64 线激光扫描仪、2 个 140 万像素灰度相机、2 个 140 万像素彩色相机,外加 4 个 4–8mm 变焦镜头。激光雷达 10 帧/秒扫描,相机也保持 10Hz,并且在激光雷达朝向正前方时释放快门,尽量让各传感器数据对得上。图像原始采集尺寸被裁到 1382×512,校正后可能还会再小一点。

这套配置决定了 KITTI 的“气质”:它不是在小房间里慢慢走,而是在真实道路上以车辆速度采集,场景包括 Road、City、Residential、Campus 和 Person 几类。数据按用途分成 stereo、flow、sceneflow、depth、odometry、object、tracking、road、semantics 和 rawdata 等部分,但大多数用途的数据都是从 raw data 里切出来的。

3.2 raw data 怎么组织:同步校正过的才是常用货

raw data 里每个序列都提供传感器原始数据、相机视野内目标的 3D bounding box tracklets 文件,以及一个标定文件。所有数据以 image_00 为同步参考系,按激光雷达的 10Hz 节奏采集。内容包括:原始(未同步未校正)和处理过(同步且校正)的双目灰度图、双目彩色图(png)、3D 激光雷达数据(每帧 10 万+个点,.bin 格式存 float 矩阵)、标定文件(相机之间、相机与 GPS/IMU 之间、相机与激光雷达之间,txt 存),以及 3D 目标跟踪标签(汽车、卡车、火车、行人、自行车人,xml 存)。

“原始”意味着带畸变、没同步;“同步且校正”意味着去掉了畸变、做了双目校正,并且和其他传感器的时间戳对好了。实际做实验基本都用后者,省掉一大堆预处理麻烦。所有数据都带时间戳,这点对多传感器融合至关重要。

3.3 object 和 tracking:一个考“认得出”,一个考“跟得住”

object 数据集专门验证目标检测,分“2D Object Detection”“3D Object Detection”和“Bird's Eye View”三块,分别对应图像上的二维框、三维包围盒和鸟瞰图检测。你可以按算法需要只下图像或只下雷达数据,每个包解压后有 training 和 testing 两个文件夹,training 里带标注。要注意 object 的数据不是连续采集的,都是单帧,只适合检测,不适合跟踪。

tracking 数据集的组织方式和 object 类似,最大区别是每个序列是连续的,用来验证目标跟踪算法。这个区分很实用:你想证明自己的检测器准,用 object;想证明跟踪器稳,用 tracking。拿单帧数据去训跟踪模型,就是典型的用错考场。

4. EuRoC:无人机在室内的“平衡木”

4.1 它到底是什么:双目加 IMU 的飞行记录

EuRoC MAV Dataset 由某理工院校制作,采集平台是一架装备了双目相机和 IMU 的四旋翼无人机,室内场景包括一个机器大厅等。真值同样来自高精度运动采集系统:在无人机上贴一组反射标志,用动作捕捉系统在单一坐标系下给出 6D 位姿,帧率 100Hz,精度到毫米级。这套配置让它成为验证“视觉惯性里程计”的经典考场——双目提供尺度,IMU 提供高频运动信息,两者互补。

数据集结构里有 cam0、cam1、imu0、leica0 四个文件夹,分别对应四个传感器。这里有个坐标系约定必须记牢:飞行器的 Body Frame 以 IMU 中心为原点,四个传感器文件夹里的数据都是相对各自传感器坐标系的,而 IMU 的传感器坐标系就是 Body Frame。每个传感器文件夹配一个sensor.yaml,写明该传感器相对 Body 坐标系的变换以及内参。

4.2 坐标变换为什么容易绕晕

数据集里给了一个旋转坐标变换的约定:设相机坐标系 pc 下的向量 (c1,c2,c3)ᵀ 变换到世界坐标系 pw 下的 (w1,w2,w3)ᵀ,公式里出现的 RWC 表示“把一个在 C 坐标系下表示的点的坐标,变换成以 W 坐标系表示的坐标”。同理,TBS 表示把所有传感器坐标系下的向量变到 Body Frame 下。很多人第一次看这个记号会懵,因为下标顺序和“从哪到哪”的直觉相反。通俗地说,下标右边是“原来在哪”,左边是“要变到哪”,读的时候从右往左念就顺了。

真值输出格式是 18 位时间戳加位姿。实际使用时,你得先把各传感器数据按sensor.yaml里的外参统一到 Body Frame,再和真值对齐,否则算出来的误差里混着坐标系错误,看起来像算法崩了,其实是自己把轴搞反了。

4.3 它和 TUM 像在哪、差在哪

两者都用动作捕捉系统给真值,都提供量化评估脚本,这是像的地方。差别在于:TUM 是 Kinect 的 RGB-D,主打小场景、慢速、稠密深度;EuRoC 是双目加 IMU,主打室内飞行、快速运动、没有直接深度。所以 TUM 上跑得好的纯视觉 RGB-D 方法,搬到 EuRoC 上未必行,因为后者更依赖 IMU 预积分和双目三角化。选数据集之前先想清楚:你的传感器配置和它像不像。

5. 常见误区:这三个数据集最容易搞混的地方

5.1 误区一:以为三个数据集可以随便互换评测

易混点:看到论文在 TUM 上刷了高分,就默认同一算法在 KITTI 上也强。为什么混:三者都叫“SLAM 数据集”,指标里都有轨迹误差。怎么区分:TUM 是手持 Kinect 的小场景 RGB-D,KITTI 是车载多传感器、场景大、速度快,EuRoC 是无人机双目惯性。传感器不同、运动模式不同、场景尺度不同,换考场等于换考题,分数没有可比性。正确做法是看论文的传感器配置和你的接近不接近,再决定参考哪个结果。

5.2 误区二:把 ATE 和 RPE 当成一回事

易混点:两个都是误差指标,都输出均值中位数,看起来差不多。为什么混:名字都带“误差”,脚本又常一起跑。怎么区分:ATE 衡量整条轨迹和真值的绝对偏差,适合评完整 SLAM 系统的建图精度;RPE 衡量固定时间窗口内相对运动的偏差,适合评里程计的漂移率。一个看“整体像不像”,一个看“局部稳不稳”。报告结果时写清楚用的哪个,别只写“误差 0.05”。

5.3 误区三:把 KITTI 的 object 数据拿去做跟踪

易混点:object 和 tracking 都有车、人、自行车这些类别,标注格式也像。为什么混:两者都从 raw data 切出来,类别名一样。怎么区分:object 是单帧、不连续,只用于检测;tracking 是连续序列,才用于跟踪。拿 object 训跟踪模型,等于用一张张孤立的照片教人预测下一步往哪走,时序信息根本不存在。

5.4 误区四:忽略 TUM 深度图的 5000 倍缩放

易混点:深度图像素值看着像几百几千,直觉上以为是毫米。为什么混:16 位单色图,数值范围确实像毫米级。怎么区分:TUM 明确规定像素值 5000 对应 1 米,0 是缺失值。生成点云前必须先除以 5000,否则点云尺度整体放大 5000 倍,和真值一对齐就发现完全对不上。这个坑几乎每个新手都踩过一次。

5.5 误区五:EuRoC 里不统一坐标系就直接算误差

易混点:以为 cam0、cam1、imu0 的数据天然就在同一个坐标系下。为什么混:它们确实来自同一架飞机、同一段时间。怎么区分:每个传感器数据都在自己的 Sensor Frame 下,必须用sensor.yaml里的外参变换到 Body Frame 再比较。跳过这一步,误差里混进的是坐标变换错误,不是算法误差,调参调到天亮也调不好。

6. 什么时候该用哪个:一份选型判断和我的踩坑习惯

选数据集这件事,本质是问自己三个问题:我的传感器配置是什么、我的场景尺度多大、我要评的是整体精度还是漂移。如果你做的是 RGB-D 稠密建图,手头是 Kinect 类设备,场景是桌面或房间,TUM 是最顺手的起点,ATE 看整体、RPE 看漂移,脚本开箱即用。如果你做的是车载感知,要同时处理图像、激光雷达、GPS/IMU,关心目标检测和跟踪,KITTI 的 raw data 和 object/tracking 子集能覆盖大部分需求,但注意用同步校正后的数据,别拿原始数据给自己加难度。如果你做的是视觉惯性里程计,尤其是室内快速运动场景,EuRoC 的双目加 IMU 配置最贴近,前提是把坐标系变换理清楚。

判断维度TUM RGB-DKITTIEuRoC
传感器Kinect RGB-D,部分带 IMU双目相机 + 64 线激光 + GPS/IMU双目相机 + IMU
场景尺度桌面到房间城市道路,百米级室内大厅,十米级
运动速度慢速手持车载速度无人机快速机动
典型指标ATE、RPE检测/跟踪/里程计多项 benchmark轨迹误差,常配 EVO 类工具
适合评什么稠密建图、RGB-D SLAM自动驾驶感知与定位视觉惯性里程计

也有明确不该用的时候。你如果只是验证一个纯视觉里程计在室内的漂移,硬上 KITTI 会因为场景太大、速度太快而掩盖局部问题;反过来,你想证明算法在高速车载场景下能扛住,只拿 TUM 的小房间数据说话,说服力不够。还有一种情况:你的算法根本不输出轨迹,只做单帧检测,那就别去凑 ATE/RPE 的热闹,直接看 KITTI object 的检测指标更对路。

我自己有过一次血泪教训:早期拿 TUM 的深度图直接当米用,点云和真值叠在一起差了三个数量级,排查了一整晚以为是外参写错,最后发现是忘了除以 5000。从那以后我每次加载任何数据集,都强制先走一遍“单位、坐标系、时间戳”三件套检查,再谈算法效果。希望帮到你,少走一次这种冤枉路。这份资料把三个数据集的格式、指标和结构都整理在一起,需要的时候翻出来对照着看,比每次重新翻官网省事得多。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询