做SLAM用什么数据集?经典数据集选型、读取与避坑指南

发布时间:2026/9/2 1:15:30
做SLAM用什么数据集?经典数据集选型、读取与避坑指南 简介这是一份面向SLAM研究与开发者的数据集导航代码包汇总TUM、EUROC、KITTI、TartanAir、ICL-NUIM等常用公开数据集并针对国内下载慢的问题附上百度网盘链接与提取码便于快速获取。压缩包共3个文件以HTML索引页为主配套.inscode与.gitignore配置整体仅6KB轻量易用。目前已有237人学习下载。通过该导航页可一览各数据集特点、适用场景与使用要点并跳转获取原始数据节省检索和下载时间。对于正在验证视觉SLAM、视觉惯性里程计或激光SLAM算法的研究者这份整理能帮助快速建立评测数据集基准提升算法调试与对比效率。 做SLAM开发这几年我最大的体会是算法调得好不好一半取决于数据集选没选对。很多新手一上来就拿着自己的机器人或者手持设备去录数据结果标定没做、光照和纹理又乱算法跑出来的轨迹一塌糊涂最后连是代码问题还是数据问题都分不清。实际上SLAM领域积累了非常成熟的开源数据集覆盖了激光、视觉、视觉惯性、多传感器融合等典型场景。把数据集跑透了很多问题能迎刃而解。这篇内容不聊原理推导就从实际工程视角出发把我用过的经典SLAM数据集、下载渠道、代码读取方式和踩过的坑一次讲清楚。无论你是刚接触SLAM建图、还是准备复现视觉SLAM十四讲里的算法又或者正在为论文找benchmark这份数据集清单和实操思路都可以直接参考。1. 别急着下数据集——先搞清楚自己需要什么1.1 数据集在SLAM项目里到底扮演什么角色很多初学者把数据集当作“测试素材”觉得只要有图片和激光数据就能跑算法。实际上SLAM数据集的核心价值不在于“有数据”而在于它提供了三样东西一是传感器原始数据包括图像、点云、IMU、里程计等二是真值轨迹也就是通过高精度运动捕捉系统或者差分GPS获取的“标准答案”三是标准的评估工具可以用统一的指标对比算法精度。换句话说有了数据集你才能回答三个关键问题我的SLAM算法定位漂移多少地图构建误差多大跟其他算法相比到底是好还是差没有真值你跑完算法只看到地图“看起来挺像那么回事”但这个“像”其实没法量化。这也是为什么很多论文里的实验部分会特意标注“我们在KITTI上评估了ATE和RPE”因为只有用公认的数据集审稿人和读者才相信你的结论是可复现、可对比的。举个我遇到过的例子之前我在室内机器人上调试一个基于激光雷达的2D SLAM自己录了几组走廊数据因为里程计标定不准Gmapping建出来的地图总是出现重影。我一开始以为是参数问题调了整整两天都不行。后来把同样的参数换成Intel Research Lab数据集去跑地图一下就干净了这才反应过来是传感器标定和数据质量的问题。所以说用数据集先验证算法本身再处理自己的数据是调试SLAM的一个非常重要的方法论。1.2 按传感器类型划分的数据集选型思路SLAM数据集按传感器类型分大致可以分四类每一类对应不同的应用场景和算法设计目标。第一类是纯视觉数据集典型代表是TUM RGB-D。传感器只有单目或RGB-D相机适合验证视觉里程计、回环检测和稠密建图。这类数据集的难点在于光照变化、快速运动、纹理缺失算法要在这些干扰下保持稳定。第二类是激光SLAM数据集典型代表是2D激光的Intel Research Lab、Radish以及3D激光的KITTI。激光数据精度高不受光照影响室内机器人扫地机器人大多走这个路线。要是你问“2d slam有哪些”常用数据集Intel Research Lab是最常被拿来练手的因为数据量小、场景简单、真值容易对齐。第三类是视觉惯性数据集典型代表是EuRoC MAV。它同时提供双目图像和IMU数据非常适合测试VIO视觉惯性里程计算法比如VINS-Mono、OKVIS。由于无人机运动剧烈、IMU激励充分这类数据比手持相机数据更难但也更接近实际应用场景。第四类是多传感器融合数据集典型代表是KITTI、Oxford Radar RobotCar。这类数据集同时提供相机、激光雷达、GPS/IMU甚至毫米波雷达主要用来做传感器融合的SLAM算法验证。如果你做的方向是自动驾驶那么KITTI和Oxford Radar基本是绕不开的。选数据集的时候可以按需求倒推我算法的输入是什么就选对应传感器的数据集我要评估evaluation就选有真值的数据集我要验证鲁棒性就选含有挑战性场景的数据集。这比随便下个“看起来很火”的数据集要靠谱得多。2. 我用过的经典数据集逐一点评2.1 KITTI无人驾驶场景的硬通货KITTI数据集由德国卡尔斯鲁厄理工学院KIT和丰田美国技术研究院联合发布是目前视觉SLAM和自动驾驶领域使用率最高的benchmark之一。它采集自德国卡尔斯鲁厄市区包含城区、乡村和高速公路等场景传感器配置相当豪华一个Velodyne HDL-64E激光雷达、两个灰度相机、两个彩色相机、以及一套高精度GPS/IMU组合导航系统。KITTI的优势集中在三点。第一数据同步和标定做得非常规范官方提供了标定参数文件可以直接用投影公式把3D点云映射到图像上。第二真值轨迹来自高精度惯性导航系统定位精度在厘米级做里程计评估非常可靠。第三官方定义了明确的评估协议用KITTI排行榜上的指标ATE、RPE、平均轨迹误差等跟其他算法对比很有说服力。不过KITTI也有坑。它采用的是俯视图相似的场景很多区域建筑和植被重复度高但相比室内环境动态物体行驶的汽车、行人比较多。如果你测的是纯视觉SLAM这些动态物体会给前端特征匹配带来不少干扰。另外KITTI序列数据量很大一个完整序列的压缩包可能超过10GB下载时得注意网络环境。实操上我一般会选择KITTI Odometry数据集里的00到10序列做训练和测试其中00序列是最经典的loop closure场景车辆绕着同一区域跑了三圈回环很明显。测回环检测算法的时候00序列是首选。2.2 TUM RGB-D视觉SLAM入门首选TUM RGB-D数据集是慕尼黑工业大学TUM发布的专门服务于RGB-D SLAM评估。它使用Kinect v1相机采集提供RGB图像、深度图像和真值轨迹并且官方给出了详细的评估工具Python脚本可以一键计算ATE绝对轨迹误差和RPE相对位姿误差。如果你正在看《视觉SLAM十四讲》这本书里的很多实践作业都建议搭配TUM数据集来跑。像我当年跑ORB-SLAM2和RGBD-SLAM的时候就是用TUM的fr1、fr2、fr3系列做对比实验。每个序列的难点也不一样fr1/xyz是缓慢匀速运动适合新手验证基础流程fr1/desk和fr1/room会被人为移动物体、有人走动fr3/structure_notexture_far则专门考验弱纹理场景下的表现。我在实际跑TUM数据集的时候有个明显的感受同一个算法在不同序列上精度差异很大。这就是数据集的挑战性设计在发挥作用。如果你的算法在fr1/room这种有动态物体的场景还能保持较低ATE那基本可以认为鲁棒性不错。另外TUM数据集的真值是由运动捕捉系统提供的时间和坐标系的对齐方式官方文档写得很清楚这个对初学者太友好了——你不需要自己搞复杂的时空同步直接按官方脚本操作就行。然后说一句“数据集下载”的问题。TUM官网提供每个序列单独下载我用的时候很少一次性下完整个数据集都是跑哪个序列就下哪一个省空间也省时间。需要注意深度图像是16-bit PNG格式存储的是毫米单位的深度值读入后要除以1000换算成米这个细节经常有人栽跟头。2.3 EuRoC MAV视觉惯性里程计标杆EuRoC MAV数据集由苏黎世联邦理工学院ETH发布数据采集载体是一台微型无人机搭载双目相机和IMU场景是室内厂房和室外庭院。它专门为视觉惯性SLAM设计是目前VIO算法评估的默认benchmark之一。EuRoC分为Machine Hall和Vicon Room两个大场景每个场景又按飞行难度分成easy、medium、difficult三个档次。difficult序列里飞行动作快、光照条件差、特征点少对VIO算法挑战很大。真值由Vicon运动捕捉系统提供精度非常高。这个数据集的独特之处在于IMU数据非常干净且激励充分你可以直接用它来验证IMU初始化、视觉惯性对齐这些模块。我记得自己第一次复现VINS-Mono的时候就是用EuRoC的MH_05_difficult序列跑出来的轨迹和真值重合度非常高那一刻才真正理解“视觉惯性紧耦合”为什么能抑制纯视觉的尺度漂移问题。实际用的时候要注意一点EuRoC提供了ASL格式.bag和Euroc格式.csv两种数据格式。像我习惯用ROS的话就直接下载bag文件rosbag play就能发布数据如果做非ROS的纯代码测试可以读csv文件。网上很多开源项目比如VINS-Mono、ORB-SLAM3都支持EuRoC格式按代码仓库里的readme配置好路径就能直接跑。2.4 2D激光SLAM常用数据集聊完视觉侧再说说2D激光SLAM。很多做扫地机器人、室内移动底盘的朋友会问“2d slam有哪些数据集”。这里推荐几个我自己用过的Intel Research Lab英特尔研究实验室的2D激光数据场景是室内办公环境包含清晰的回环非常适合测Gmapping、Cartographer的建图效果。数据是.bag格式可以直接用ROS播放。Radish一个比较老的2D激光数据集集合里面包含多所大学不同建筑环境的激光数据格式比较乱但胜在场景多样。ACES澳大利亚学者发布的2D激光数据集包含室内外混合场景可以测一测算法在环境切换时的表现。MIT Killian CourtMIT校园的激光数据走廊长、结构重复度高对回环检测是很大的考验。如果你刚入手Cartographer我强烈建议先拿Intel Research Lab跑一遍。原因有两个一是数据量小跑完一版配置只要十几分钟二是场景里有明显的回环能直观看到后端优化对轨迹修正的效果。我之前给一个客户做室内AGV定位方案时就是用Intel数据集先验证了Cartographer的配置然后才把同一套配置迁移到实际机器上做微调整个调试周期缩短了一半以上。3. 实操从下载到跑通代码的全流程3.1 数据集下载与文件结构解析数据集下载看起来简单但很多人第一步就卡住了因为KITTI、TUM这些官网的下载页面是全英文的而且文件非常多容易下错。这里以KITTI Odometry为例讲一下下载和结构解析。先去KITTI官网的Odometry页面找到“Download”区域。你会看到几个不同的下载项彩色图像color、灰度图像grayscale、激光雷达点云velodyne、真值轨迹poses和标定文件calib。做视觉SLAM的话灰度图像真值标定文件就够了做激光SLAM或者多传感器融合再把点云下载下来。下载解压后目录结构大致是这样的dataset/ ├── poses/ # 真值位姿00.txt, 01.txt ... ├── sequences/ │ └── 00/ │ ├── image_0/ # 左灰度图 │ ├── image_1/ # 右灰度图 │ ├── image_2/ # 左彩色图 │ ├── image_3/ # 右彩色图 │ ├── velodyne/ # 3D激光点云 │ ├── calib.txt # 传感器标定参数 │ └── times.txt # 时间戳列表每次我帮别人排查数据集问题第一件事就是让他检查calib.txt是否跟图像序列匹配。因为KITTI的标定文件是每个序列一份如果你把00序列的图像配了01序列的标定投影结果几乎是必错。这个坑很隐蔽值得单独记一下。TUM数据集的结构跟KITTI不太一样。每个序列文件夹下会有一个rgb.txt、一个depth.txt和一个groundtruth.txt另外还有associations.txt。前三个文件是数据列表时间戳文件路径associations.txt则是官方的rgb和depth时间对齐表。写数据读取代码时务必先读associations.txt来同步图像和深度不要自己去做时间戳最近邻匹配官方已经帮你做好了。3.2 数据读取与SLAM接口代码示例有了数据集文件结构下一步就是写代码把数据喂给SLAM算法。我习惯用Python快速预览数据确认图像和点云没问题之后再到C工程里接入算法。这里分享一个KITTI灰度图序列的读取示例import cv2 import numpy as np import os seq_dir dataset/sequences/00 img_dir os.path.join(seq_dir, image_0) time_file os.path.join(seq_dir, times.txt) # 读取时间戳 timestamps [] with open(time_file, r) as f: for line in f: timestamps.append(float(line.strip())) # 读取一帧灰度图 img_files sorted(os.listdir(img_dir)) img_path os.path.join(img_dir, img_files[0]) img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) print(fimage shape: {img.shape}, timestamp: {timestamps[0]:.6f}) # 读取真值 pose_file dataset/poses/00.txt with open(pose_file, r) as f: first_pose list(map(float, f.readline().strip().split())) # KITTI真值是3x4的变换矩阵按行存储 first_pose np.array(first_pose).reshape(3, 4) print(first_pose)这段代码做的事情很直白读灰度图、读时间戳、读第一帧真值位姿。如果你准备把数据接入ORB-SLAM3或者VINS-Mono这类开源框架它们通常自带数据集读取接口只需要把路径配置成KITTI/TUM/EuRoC的对应格式即可。我个人的经验是先用一个几行的脚本跑通数据读取确认图像不是全黑、时间戳顺序正确再去跑重型框架这样能少走很多弯路。对于2D激光SLAM如果数据是rosbag格式启动就更简单了。以Intel Research Lab数据集为例rosbag play intel.bag然后在另一个终端启动你的SLAM节点比如Cartographerroslaunch cartographer_ros demo_2d.launch bag_filename:intel.bagdemo_2d.launch会自动订阅激光话题并开始建图。这种方式的好处是你完全不用关心数据格式解析ROS帮你把话题通信都处理好了非常适合快速验证算法配置。3.3 评估怎么判断地图建得好不好跑通SLAM不等于能做对比实验要说明算法好必须量化评估。SLAM领域最常用的两个指标是ATEAbsolute Trajectory Error绝对轨迹误差和RPERelative Pose Error相对位姿误差。ATE反映全局轨迹的漂移程度RPE则更关注局部运动估计的精度两者各有侧重一般都会同时报告。TUM官方提供了一套非常方便的评估脚本命令大概长这样python evaluate_ate.py groundtruth.txt estimated_trajectory.txt --plot ate.png python evaluate_rpe.py groundtruth.txt estimated_trajectory.txt --plot rpe.png这里的estimated_trajectory.txt是你SLAM算法输出并保存的轨迹文件格式是timestamp tx ty tz qx qy qz qw。需要注意算法输出的坐标系并不一定会跟真值坐标系对齐所以评估脚本在做比较前会先估计一个Sim3变换包括旋转、平移和尺度缩放把估计轨迹对齐到真值坐标系。这也是SLAM评估跟普通误差计算不同的地方——你不能直接把两个轨迹相减得出误差必须做Sim3对齐后才能比。我记得有一次跑ORB-SLAM2的TUM数据集出来的ATE非常大怎么调参数都降不下来。后来发现是我的轨迹输出缺少尺度对齐单目SLAM本身就存在尺度不确定性必须通过Sim3对齐把尺度统一之后才能跟真值比较。这算是一个很典型的理解误区建议新手注意。4. 数据集使用避坑指南4.1 时间戳与话题同步多传感器数据同步是SLAM里很折磨人的问题。KITTI比较友好官方直接给了times.txt文件所有传感器的图像和点云已经是同步好的你只需要按索引对齐就行。但TUM RGB-D需要你自己读取associations.txtEuRoC更是给了ASL.bag和Euroc.csv两套格式由你自己决定如何对齐。我建议在写代码之前先把数据的时间戳范围打印出来看一遍确认起始时间和结束时间是否一致IMU频率是否如文档所说。比如EuRoC的IMU是200Hz、图像是20Hz如果你拿到的数据频率明显低于标称值很可能是下载的文件不完整需要重新下载。4.2 真值坐标系常见陷阱不同数据集对真值坐标系的定义不一样这一点如果不注意评估结果就会出问题。KITTI的真值矩阵是左相机坐标系下的3x4变换矩阵TUM真值是世界坐标系到相机坐标系的变换EuRoC真值是Vicon坐标系到IMU坐标系的变换。算法输出的轨迹坐标系是由前端定义的世界系不一定跟真值坐标系一致所以评估工具内置的Sim3对齐就是解决这个问题。另一个常见的“陷阱”是单位。TUM深度图单位是毫米EuRoC的IMU加速度计单位是m/s²但有些数据集的IMU数据会以g作为加速度单位。做VIO时如果单位换算错了重力对齐那一步就会出问题整个系统会发散。我建议拿到任何数据集后先看官方readme中的单位说明再做首次运行。4.3 常见问题速查表问题现象可能原因排查方法图像全黑或显示异常深度图是16-bit直接按8-bit显示用img / 1000转换后再可视化轨迹漂移严重、ATE很大单目SLAM没做尺度对齐使用官方脚本的Sim3对齐后再评估回环检测不触发场景重复度低或描述子参数太敏感换KITTI 00序列测试该序列回环非常明显跑Cartographer建图重影激光话题频率/帧类型不匹配检查bag中的/scan话题是否正确订阅VIO初始化失败IMU频率过低或运动激励不足选EuRoC的Vicon Room easy序列验证初始化数据读取报错提示文件不存在路径配错或文件名大小写不一致先ls列目录逐层核对路径4.4 我的几点实操心得最后说几个我踩过多次坑之后总结的经验。第一尽量用官方推荐的数据格式和数据接口。比如EuRoC不同开源项目读它的方式不完全一样有的是读bag、有的是读csv、有的是读ROS launch文件。直接按项目仓库的说明操作比你自创一套接口要省事得多。遇到“作者说能跑但我跑不起来”的情况先检查你的数据版本是否跟项目README指定的一致。第二保存中间结果不要等一个长序列跑完再检查。我以前跑KITTI 00序列一跑就是几分钟每次跑完才看轨迹图发现问题后又重新跑非常浪费时间。后来我习惯在代码里加上中间轨迹输出每处理30帧保存一次就算中途崩溃也能定位到是哪一段开始漂移的。这个方法对排查SLAM算法问题真的是效率神器。第三如果只是验证某个模块比如特征提取或回环检测没必要跑完整的数据集。KITTI 00序列、TUM fr1/xyz、EuRoC MH_01_easy这三个是每个方向的“最小样例集”先跑通再谈大规模实验。我给别人做SLAM相关咨询时也一直推荐这个组合KITTI测视觉里程计TUM测RGB-D建图EuRoC测VIO。每个数据集都有各自side的“坑”先把这三个跑熟了基本就具备读大部分SLAM论文和复现代码的实操基础了。数据集这个东西看起来只是“下载下来喂给代码”但实际用下来你会发现它直接影响你对算法性能的判断。调试SLAM时如果效果不理想先别急着改代码换个标准数据集跑一遍再下结论。很多时候分清是数据问题还是算法问题本身就是SLAM调试中最关键的一步。本文还有配套的精品资源点击获取

相关新闻