数据格式入门:常见的轨迹数据格式简介
做机器人也好,自动驾驶也好,录完数据只是第一步。真正头疼的是——不同传感器、不同算法、不同工具,用的数据格式完全不一样。我刚开始入行那会儿,光是转换格式就折腾了好几天。
今天咱们就聊聊四种最常见的轨迹数据格式:TUM、KITTI、EuRoC 和 ROS Bag。搞懂它们,你就能在各种工具链之间自由穿梭了。
一句话总结:这四种格式,说白了就是不同社区约定俗成的「数据方言」。TUM 是 RGB-D SLAM 的标配,KITTI 是自动驾驶的标杆,EuRoC 是视觉惯导的宠儿,ROS Bag 则是机器人界的通用语言。
1. TUM 格式:简单到极致
TUM 格式来自慕尼黑工业大学。我最早接触它是在做 RGB-D SLAM 评测的时候。它的结构极其简单——就是一个纯文本文件,每行四个数字。
# timestamp tx ty tz qx qy qz qw
1403636579.647200 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000
1403636579.647200 0.001000 0.002000 0.003000 0.010000 0.020000 0.030000 0.999000
格式是:时间戳 + 位置 (x, y, z) + 四元数 (qx, qy, qz, qw)。
我个人习惯用 TUM 格式做快速验证。 为什么?因为它太容易解析了。写个 Python 脚本,几行代码就能读进来。我在项目中经常用它做中间格式——先把其他格式转成 TUM,再喂给算法。
小技巧:TUM 格式的时间戳单位是秒。注意精度——通常是小数点后 6 位,对应微秒级。如果你的传感器精度不够,别硬凑 6 位,会引入噪声。
2. KITTI 格式:自动驾驶的工业标准
KITTI 格式来自卡尔斯鲁厄理工学院和丰田研究所。它比 TUM 复杂一些,但信息更丰富。
# 每行 12 个数字,表示 3x4 的变换矩阵
1.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
0.000000e+00 1.000000e+00 0.000000e+00 0.000000e+00
0.000000e+00 0.000000e+00 1.000000e+00 0.000000e+00
KITTI 用 3x4 变换矩阵表示位姿。说白了就是旋转矩阵 R 加上平移向量 t,拼在一起。
嗯,这里要注意:KITTI 格式通常没有时间戳。它的时间信息隐含在文件名里。比如 0000000000.txt 表示第 0 帧,0000000001.txt 表示第 1 帧。帧率是固定的 10 Hz。
避坑指南:我曾经在 KITTI 格式上吃过亏——它的坐标系是「右-下-前」,而很多 SLAM 算法用的是「右-前-上」。不转换坐标系直接跑,轨迹会歪到天上去。记得先检查坐标系定义。
3. EuRoC 格式:视觉惯导的黄金标准
EuRoC 数据集来自苏黎世联邦理工学院。它专门为视觉-惯性 SLAM 设计,格式比前两种都复杂。
# timestamp [ns], p_RS_R_x [m], p_RS_R_y [m], p_RS_R_z [m],
# q_RS_w, q_RS_x, q_RS_y, q_RS_z
1403636579647200000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000
注意看——时间戳单位是纳秒!这是 EuRoC 和 TUM 最大的区别。我刚开始用的时候没注意,直接把纳秒当秒用,结果轨迹全乱了。
EuRoC 格式还有一个特点:它同时提供 IMU 数据和地面真值。IMU 数据是高频的(200 Hz),地面真值是低频的(20 Hz)。做 VIO 评测时,这两个数据缺一不可。
我的经验:如果你在做视觉惯导融合,EuRoC 格式是最佳选择。它把 IMU 和视觉数据的时间戳对齐好了,省去很多麻烦。但要注意——它的坐标系是「前-左-上」,和 KITTI 不一样。
4. ROS Bag:机器人界的通用语言
ROS Bag 不是纯文本格式,而是一个二进制文件。它把 ROS 消息打包在一起,可以包含任意类型的数据——图像、点云、IMU、里程计……
说白了,ROS Bag 就是一个「数据集装箱」。 你可以在一个 bag 文件里同时存放相机图像、激光雷达点云和 IMU 数据。时间戳由 ROS 自动管理。
# 查看 bag 信息
rosbag info your_data.bag
# 提取轨迹数据
rostopic echo /ground_truth/state > trajectory.txt
ROS Bag 的轨迹数据通常以 nav_msgs/Odometry 或 geometry_msgs/PoseStamped 消息形式存在。你可以用 rostopic echo 命令把它转成文本格式。
实用技巧:我习惯用 rosbag play 配合 rostopic echo 来提取数据。但注意——bag 文件可能很大,几十 GB 很常见。提取前先用 rosbag info 看看里面有什么话题,别盲目提取。
5. 四种格式对比
| 特性 | TUM | KITTI | EuRoC | ROS Bag |
|---|---|---|---|---|
| 文件格式 | 纯文本 | 纯文本 | 纯文本 | 二进制 |
| 位姿表示 | 位置+四元数 | 3x4 矩阵 | 位置+四元数 | ROS 消息 |
| 时间戳单位 | 秒 | 无(帧号) | 纳秒 | ROS 时间 |
| 坐标系 | 自定义 | 右-下-前 | 前-左-上 | 自定义 |
| 适用场景 | RGB-D SLAM | 自动驾驶 | 视觉惯导 | 通用 |
6. 格式转换:绕不开的苦活
实际项目中,你很少只用一种格式。我做过一个项目,传感器输出 ROS Bag,算法要求 TUM 格式,评测工具又只认 KITTI 格式。怎么办?自己写转换脚本。
这里分享一个我常用的转换思路:
- 先把所有格式统一成「中间格式」——我选 TUM,因为它最简单
- 从中间格式再转成目标格式
- 转换时注意坐标系变换和时间戳单位
核心原则:转换格式时,保持数据精度不变。我曾经为了省事,把纳秒时间戳四舍五入到毫秒,结果导致轨迹对齐误差大了 10 倍。数据精度,能保留就保留。
7. 知识体系总览
下面这张图总结了四种格式的核心关系。你想想看——TUM 和 EuRoC 很像,只是时间戳单位不同。KITTI 用矩阵表示位姿,ROS Bag 则包罗万象。搞懂这些,你就能在数据格式的迷宫里找到方向。
四种格式各有千秋。TUM 简单易用,KITTI 工业标准,EuRoC 专为 VIO 设计,ROS Bag 通用性强。你不需要全部精通,但至少要能读懂它们。因为在实际项目中,你永远不知道下一个工具会要求什么格式。
最后提醒一句:无论用哪种格式,一定要先检查坐标系定义和时间戳单位。这两个坑,我每个都踩过不止一次。数据格式本身不难,难的是细节。
可可精品资料库