数据格式入门:常见的轨迹数据格式简介

做机器人也好,自动驾驶也好,录完数据只是第一步。真正头疼的是——不同传感器、不同算法、不同工具,用的数据格式完全不一样。我刚开始入行那会儿,光是转换格式就折腾了好几天。

今天咱们就聊聊四种最常见的轨迹数据格式: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 格式。怎么办?自己写转换脚本。

这里分享一个我常用的转换思路:

  1. 先把所有格式统一成「中间格式」——我选 TUM,因为它最简单
  2. 从中间格式再转成目标格式
  3. 转换时注意坐标系变换和时间戳单位

核心原则:转换格式时,保持数据精度不变。我曾经为了省事,把纳秒时间戳四舍五入到毫秒,结果导致轨迹对齐误差大了 10 倍。数据精度,能保留就保留。

7. 知识体系总览

下面这张图总结了四种格式的核心关系。你想想看——TUM 和 EuRoC 很像,只是时间戳单位不同。KITTI 用矩阵表示位姿,ROS Bag 则包罗万象。搞懂这些,你就能在数据格式的迷宫里找到方向。

常见轨迹数据格式知识体系 TUM 格式 KITTI 格式 EuRoC 格式 ROS Bag 位置+四元数 3x4 变换矩阵 纳秒时间戳 二进制消息 核心要点 • TUM 和 EuRoC 结构相似,注意时间戳单位不同 • KITTI 用矩阵表示位姿,适合自动驾驶场景 • ROS Bag 是通用容器,可包含多种传感器数据

四种格式各有千秋。TUM 简单易用,KITTI 工业标准,EuRoC 专为 VIO 设计,ROS Bag 通用性强。你不需要全部精通,但至少要能读懂它们。因为在实际项目中,你永远不知道下一个工具会要求什么格式。

最后提醒一句:无论用哪种格式,一定要先检查坐标系定义和时间戳单位。这两个坑,我每个都踩过不止一次。数据格式本身不难,难的是细节。

可可精品资料库