3. 数据采集与存储格式:ROS Bag、HDF5、Mcap、自定义二进制格式
做多传感器融合,第一步就是搞定数据怎么存。
我见过太多团队,算法调得飞起,结果回放数据时发现格式不兼容,或者磁盘写爆了。说白了,存储格式选错了,后面全是坑。
今天咱们就把主流的几种格式掰开揉碎聊一聊。我个人习惯,先看场景再选格式,别盲目跟风。
3.1 ROS Bag:老牌劲旅,生态为王
ROS Bag 是 ROS 生态下的标准格式。你想想看,如果你用 ROS 做开发,那 Bag 几乎是默认选项。
优点:
- 与 ROS 无缝集成,录制和回放就是一行命令的事
- 支持时间戳同步,话题过滤,非常方便
- 社区资源丰富,各种工具链成熟
缺点:
- 文件体积大。我做过一个项目,64线激光雷达加上6个摄像头,录了10分钟,Bag文件直接飙到50GB
- 不支持随机访问。你想跳转到第5分钟的数据?得从头读到尾
- 跨语言支持一般,C++和Python没问题,但其他语言就麻烦了
我的经验: 如果你在做原型验证,或者团队全是ROS生态,用Bag没毛病。但如果是量产车的数据采集,我建议你慎重。
3.2 HDF5:科学计算的老大哥
HDF5 来自高性能计算领域。我第一次接触它是在做气象数据分析时,后来发现用在传感器数据上也很香。
优点:
- 支持分层数据结构,像文件系统一样组织数据
- 压缩效率高。同样的数据,HDF5 比 Bag 小 30%-50%
- 支持随机访问和并行I/O,大数据场景下性能极佳
缺点:
- 学习曲线陡。API 设计偏底层,新手容易搞错
- 时间戳管理需要自己实现,不像 Bag 那么方便
- 跨语言绑定虽然多,但质量参差不齐
避坑指南: 我曾经在项目里直接用 HDF5 的默认配置,结果写入速度慢得离谱。后来发现要调 chunk size 和 compression level,才把性能提上来。记住,HDF5 默认配置不是为实时写入优化的。
3.3 MCAP:后起之秀,专为自动驾驶而生
MCAP 是 Foxglove 团队推出的新格式。说实话,我第一次看到它时觉得「又一个新格式?」,但用下来发现确实有两把刷子。
优点:
- 支持流式写入,适合长时间录制
- 文件结构紧凑,支持索引,随机访问速度极快
- 与 ROS 2 深度集成,同时支持非 ROS 场景
缺点:
- 生态还在成长中,工具链不如 Bag 丰富
- 对老版本 ROS 1 支持有限
我的建议: 如果你在做一个新的自动驾驶项目,或者从 ROS 1 迁移到 ROS 2,MCAP 是当前最好的选择。它解决了 Bag 的很多痛点,而且性能确实好。
3.4 自定义二进制格式:终极性能,但代价不菲
嗯,这里要注意。自定义格式是最后的选择,不是第一选择。
优点:
- 极致性能。你可以针对传感器数据做最紧凑的编码
- 完全控制数据布局,内存映射直接访问
- 文件体积可以做到最小
缺点:
- 开发成本高。你要自己处理序列化、版本兼容、校验和
- 调试困难。二进制文件出错了,肉眼根本看不出来
- 团队协作成本高。每个新人都要学你的私有格式
避坑指南: 我曾经在一个项目里自己撸了一套二进制格式,当时觉得特别牛。结果半年后换了个传感器,协议变了,我的解析代码全得重写。从那以后,除非性能真的压不住,否则我绝不碰自定义格式。
3.5 各格式优缺点对比
| 特性 | ROS Bag | HDF5 | MCAP | 自定义二进制 |
|---|---|---|---|---|
| 生态成熟度 | ★★★★★ | ★★★★ | ★★★ | ★ |
| 文件体积 | ★★ | ★★★★ | ★★★★ | ★★★★★ |
| 随机访问 | ★ | ★★★★ | ★★★★ | ★★★★★ |
| 写入性能 | ★★★ | ★★★ | ★★★★ | ★★★★★ |
| 跨语言支持 | ★★ | ★★★★ | ★★★ | ★ |
| 学习成本 | ★ | ★★★ | ★★ | ★★★★★ |
3.6 核心逻辑:如何选择?
我画了一张图,帮你理清思路。说白了,就三个问题:
- 你在用 ROS 吗? 是 → Bag 或 MCAP;否 → 看下一个问题
- 需要随机访问吗? 是 → HDF5 或 MCAP;否 → Bag 也能凑合
- 性能压不住了吗? 是 → 自定义二进制;否 → 别折腾
你想想看,选格式其实就是在「生态便利性」和「性能」之间做权衡。没有银弹,只有最适合你场景的方案。
我的最终建议:
- ROS 1 项目 → ROS Bag,别折腾
- ROS 2 项目 → MCAP,一步到位
- 非 ROS 项目,需要随机访问 → HDF5
- 非 ROS 项目,极致性能 → 自定义二进制(但要做好心理准备)
好了,这一章的内容就到这里。记住,数据格式选对了,后面回放、分析、训练都会顺畅很多。别像我当年一样,在格式上栽了跟头才回头补课。