2. 数据采集与存储

做数据回放和坐标变换,第一步就是搞定数据。我见过太多团队,算法调得再好,数据采集阶段埋了坑,后面全白费。今天咱们就聊聊数据怎么存、怎么采,这里头门道不少。

一、常见数据格式,你选对了吗?

数据格式的选择,说白了就是平衡「存储效率」和「使用便利性」。我个人习惯根据场景来定,下面这四种是我最常用的。

1. ROS bag —— 机器人界的「万能容器」

ROS bag 是 ROS 生态下的标准格式。它把话题、时间戳、消息类型打包在一起。你想想看,一个 bag 文件里可以同时塞进激光点云、图像、IMU 数据,回放时还能按原时间轴重演,调试起来特别方便。

我的经验: 采集 bag 时,记得用 --split 参数按大小分割文件。我曾经一次采集跑了 8 小时,生成一个 200GB 的 bag,后面读取时内存直接爆了。分割成 2GB 一个的小文件,处理起来轻松得多。
# 录制所有话题,按 2GB 分割
rosbag record -a --split --size=2000

2. MCAP —— 新一代高性能格式

MCAP 是 Foxglove 团队推出的格式,专门解决 bag 的痛点。它支持并行写入、随机访问,而且压缩率更高。说白了,如果你做长时间采集(比如自动驾驶路测),MCAP 是更好的选择。

关键区别: bag 是顺序写入,MCAP 是索引式写入。这意味着 MCAP 可以快速跳转到任意时间点,而 bag 得从头扫到尾。

3. CSV —— 简单但别滥用

CSV 适合存储结构化数据,比如 GPS 坐标、IMU 读数。但我不建议用它存点云或图像——文件会变得巨大,而且读取效率低。

# 一个典型的 GPS CSV 格式
timestamp,lat,lon,alt,speed
1712345678.123,31.2304,121.4737,12.5,0.3
1712345678.223,31.2305,121.4738,12.6,0.4
注意: CSV 没有时间戳精度保证。我遇到过有人用字符串存时间戳,结果解析时丢精度,导致坐标变换对不上。建议统一用 Unix 时间戳(浮点数)。

4. Parquet —— 大数据场景的利器

Parquet 是列式存储格式,压缩率高,适合批量分析。如果你要处理海量传感器数据(比如 1000 小时的路测数据),Parquet 能省下 70% 的存储空间。

格式 适用场景 压缩率 随机访问
ROS bag 调试、小规模回放 低 不支持
MCAP 长时间采集、生产环境 中 支持
CSV 结构化小数据 低 不支持
Parquet 大数据分析 高 支持

二、传感器数据采集要点

采集数据不是把传感器接上就完事。每个传感器都有自己的脾气,下面我逐个说说。

1. LiDAR(激光雷达)

LiDAR 采集的核心是「时间同步」和「畸变校正」。旋转式 LiDAR 在运动时会产生点云畸变——说白了,车在动,激光还在转,扫出来的点位置就偏了。

  • 时间戳: 用 LiDAR 的 PPS 信号或 IEEE 1588 协议同步时钟。我建议用硬件同步,软件同步的精度不够。
  • 畸变校正: 需要 IMU 或里程计辅助。我曾经试过只用 LiDAR 自身数据做校正,效果很差,加了 IMU 后精度提升了一个数量级。
  • 存储: 点云数据量大,建议用 MCAP 或压缩后的 bag 格式。

2. Camera(相机)

相机采集的坑主要在「曝光时间」和「触发同步」上。

  • 曝光时间: 曝光期间车辆在运动,图像会模糊。我建议曝光时间控制在 10ms 以内,夜间可以适当放宽。
  • 触发同步: 多相机系统要用硬件触发,保证所有相机在同一时刻曝光。软件触发会有几毫秒的延迟,对于高速运动场景影响很大。
  • 存储: 原始图像用 PNG 或 JPEG 压缩。别存 BMP,文件太大,回放时 I/O 会成为瓶颈。
小技巧: 采集时同时保存相机内参和畸变参数。我见过有人只存图像,后面标定时找不到参数,只能重新采集,白白浪费一周时间。

3. IMU(惯性测量单元)

IMU 采集的关键是「高频」和「零偏校准」。

  • 采样率: IMU 通常工作在 100Hz-400Hz。别降采样,高频数据对运动估计至关重要。
  • 零偏: 采集前让 IMU 静止 1-2 分钟,记录零偏值。我曾经忽略这一步,结果积分出来的位置漂移得离谱。
  • 存储: IMU 数据量小,CSV 或 bag 都行。但注意时间戳精度要到微秒级。

4. GPS(全球定位系统)

GPS 采集的痛点是「信号遮挡」和「坐标系转换」。

  • 信号质量: 高楼、隧道、树荫下 GPS 信号会变差。我建议同时记录卫星颗数和 PDOP 值,方便后续筛选有效数据。
  • 坐标系: GPS 输出的是 WGS84 经纬度,需要转成局部坐标系(比如 UTM)。这个转换参数一定要记下来,否则坐标变换会乱套。
  • RTK: 如果做高精度定位,用 RTK-GPS,精度能到厘米级。但注意 RTK 需要基站信号,离开基站范围就降级了。

三、知识体系总览

下面这张图概括了本章的核心逻辑。数据采集和存储是上下游的关系,格式选择影响采集效率,传感器特性决定存储策略。

数据采集与存储知识体系 数据采集 传感器类型 • LiDAR:时间同步、畸变校正 • Camera:曝光控制、触发同步 • IMU:高频采样、零偏校准 • GPS:信号质量、坐标系转换 采集要点 • 硬件同步(PPS/1588) • 时间戳精度(微秒级) • 参数记录(内参、零偏) 数据存储 常见格式 • ROS bag:调试、小规模回放 • MCAP:长时间、生产环境 • CSV:结构化小数据 • Parquet:大数据分析 选择依据 • 数据量大小 • 随机访问需求 • 压缩率要求 核心原则:格式服务于场景,采集服务于回放

四、避坑指南

最后分享几个我踩过的坑,希望能帮你省点时间。

  • 时间戳不一致: 我曾经同时用系统时间和传感器自带时间戳,结果两个时钟差了 0.5 秒,坐标变换全错。后来统一用 GPS 时间作为主时钟。
  • 存储路径混乱: 采集时没规划好目录结构,后面找数据像大海捞针。我建议按「日期_场景_传感器」的格式命名文件夹。
  • 忽略元数据: 只存数据不存参数,等于白采。每次采集都附带一个 YAML 文件,记录传感器型号、内参、坐标系定义。
一句话总结: 数据采集和存储是数据回放的基石。格式选对、传感器采好、参数记全,后面的坐标变换才能顺利推进。

可可精品资料库