SLAM 数据集指南:EuRoC、TUM 与 KITTI 怎么用才不自嗨
对比 EuRoC、TUM、KITTI 的传感器配置与评价协议,强调失败序列报告、参数隔离与真机迁移时的常见陷阱。

1. 数据集 SOTA 不等于能部署
EuRoC MH_05 上 ATE 0.05 m,换到自家仓库直接丢跟踪——我复现论文时吃过这个亏。公开 benchmark 的价值是可复现的回归,不是排行榜数字。只报最佳序列、为每条轨迹单独调参、隐藏 FAIL,等于把算法自嗨包装成工程结论。下文按数据集讲清传感器契约、评价对齐与验收该量什么。
2. EuRoC MAV:VIO 的事实标准
Machine Hall (MH) 与 Vicon Room (V1/V2) 共 11 条序列,双目 + IMU + 部分真值。难度标 easy/medium/difficult:MH_01 慢速纹理好,易过拟合默认参数;MH_04 快速运动模糊,测曝光与 IMU 饱和;MH_05 暗光弱纹理,特征法易 LOST;V1/V2 纹理较好,尺度可观性比 MH 宽松。
评价协议:双目/VIO 有米制尺度,对齐用 SE(3),报 ATE RMSE。工具 evo_ape euroc_eval 是事实标准。必须 11 条全报——若论文只晒 8/11,我会直接看失败 3 条的失败模式:初始化挂、跟踪丢,还是回环假阳性。
3. TUM RGB-D 与 TUM-VI
TUM RGB-D:Kinect 深度 + 手持轨迹,室内为主,适合 RGB-D SLAM 与稠密方法。真值来自 motion capture,但不同论文对齐方式不一,数字不可直接横比。
TUM-VI:鱼眼 + IMU,快速旋转与曝光变化比 EuRoC 部分序列更狠。鱼眼模型必须正确——硬套针孔会在边缘产生系统性误差,ATE 看起来「还行」其实是模型错配。
TUM 工具链 associate.py 做时间戳对齐。不对齐就评,数字无意义。常见错误:用 arrival time 而非 capture time 关联 RGB 与 depth;深度帧滞后 30 ms 未补偿,RPE 在转弯段爆炸。
4. KITTI Odometry
车载双目 + GPS/IMU,户外驾驶。Seq 00–10 有真值,11–21 测试集无真值(在线提交)。大尺度、主要是 forward motion,回环少——评 RPE 比 ATE 更有意义。运动模式单一,不适合评 VIO 初始化鲁棒性。激光里程计 benchmark 另评点云方法,别把视觉 odometry 数字与 LO 数字混谈。
5. 怎么用才不造假
报告失败,不是可选:
序列 ATE(m) 状态
MH_01 0.04 OK
MH_05 FAIL 跟踪丢失 @ 120s
成功率: 9/11参数隔离:调参集与测试集分开(至少 MH vs V1 交叉验证);同一份 yaml 跑全部序列,不为单条轨迹调参;算法含随机性时固定种子,报均值与方差。
实时性:报 ATE 同时报平均 CPU/GPU、是否实时(> sensor rate)、端到端延迟。离线 BA 调到 0.01 m 不能实时,没有工程意义。
消融公平:去掉 IMU 后 ATE 恶化 300%,可能是初始化策略绑死了 IMU——每个消融只改一个变量。
6. 从数据集到真机的鸿沟
| 数据集有 | 真机常缺 |
|---|---|
| 精确时间同步 | 软件 stamp、无硬件 trigger |
| 出厂标定 | 安装后未重标 |
| 固定光照 | 自动曝光、频闪 |
| 无动态障碍 | 人、车、门 |
| ground truth | 只有 GPS/人工测量 |
我的做法:数据集验证算法逻辑与 CI 回归;真机用独立场景验收。维护 2–3 条代表序列(MH_05 + V1_03 + 一条 TUM 失败序列)固化进 CI:同一套 yaml,ATE 恶化 >10% 就拦。
7. evo 对齐与常见踩坑
evo_ape 默认 SE(3) 对齐;单目必须加 --correct_scale 做 Sim(3),否则 ATE 无意义。对齐只估一个全局变换——若轨迹中间段 drift 模式与首尾不同,ATE 会「好看」但 RPE 暴露问题。我习惯同时报 ATE 与 segment RPE(每 100 m 一段),失败序列附丢跟踪时刻与当时特征数/内点数。
时间戳对齐是 TUM RGB-D 的头号坑:associate.py 的 --offset 和 --max_difference 要按 bag 实测,不是抄论文默认值。EuRoC 的 IMU 与相机硬件同步,但自录 bag 往往只有软件 stamp——在数据集上刷出来的参数,换到自录数据可能对齐全错而 ATE 仍「正常」。
8. baseline 对比的公平性
与 ORB-SLAM3/VINS-Mono 对比时,必须同一评价脚本、同一对齐方式、同一序列子集。只换算法不换前端特征数/后端迭代次数,结论不可比。我会固定 --params 文件 hash 写进报告,避免「后来手改 yaml 忘了」。
9. 验收
- 全序列 ATE/RPE 表格 + FAIL 标记与失败模式分类
- 初始化成功率、跟踪丢失次数
- 噪声 ×2 / ×0.5 时 ATE 变化(参数敏感性)
- 运行时间与内存峰值
- 与 baseline 在相同评价脚本下的对比
- 报告计算资源:是否实时、平均延迟
- segment RPE 与丢跟踪时刻诊断字段
数据集是尺子,不是奖杯。尺子用错(对齐错、参数泄漏、隐藏 FAIL),再低的 ATE 也预测不了真机会不会挂。
相关
也可以看看
johan's blog