一、bag包格式差异
- 文件格式
ros1
:使用单一的.bag
文件格式,基于自定义的二进制格式,包含消息数据、元数据(话题名称、时间戳等)和索引。ros2
:默认使用SQLite3
数据库格式(.db3 文件),存储在目录结构中(例如 rosbag2_YYYY_MM_DD_HH_MM_SS)。也可以选择其他存储插件(如 MCAP 格式),更模块化。
- 存储方式
ros1
:数据以连续的二进制流存储,消息按时间顺序写入。索引存储在文件末尾,用于快速定位(若索引损坏需rosbag reindex
修复)。ros2
:使用数据库(如 SQLite3)存储,消息分表保存,元数据和数据分离。
支持更灵活的查询和扩展,不依赖单一文件结构。
- 消息序列化
ros1
:使用自定义的序列化格式(ros 1 的 raw 格式)。与 ros 1 的消息类型紧密耦合。ros2
:使用 CDR(Common Data Representation)格式,基于 DDS(Data Distribution Service)标准。更通用,与 ros 2 的中间件兼容。
二、bag包转换工具
rosbags-convert
是 rosbags 库的一部分,而 rosbags 是一个纯 Python 实现的工具包,专注于处理 ros 的 rosbag 文件。rosbag 文件是 ros 中用于存储消息数据的文件格式,常用于记录传感器数据、话题消息等,以便后续分析或回放。rosbags-convert
的主要功能是将 ros 1 的 rosbag 文件(通常为 .bag 格式)转换为 ros 2 的 rosbag 文件(通常为目录结构或 .db3 文件),或者将 ros 2 的 rosbag 文件转换回 ros 1 格式。常用指令如下:
-
rosbags 库可以通过 Python 的包管理工具 pip 安装,
rosbags-convert
作为其命令行工具会随之可用。pip install rosbags ------------------------------------------ # 同样可以指定其他源下载: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple rosbags
-
bag包互转
rosbags-convert --src ros1.bag --dst ros2bag/ ------------------------------------------ # --src <输入路径>:源文件是 ros1格式.bag 或 ros2的bag目录。 # --dst <输出文件>:目标转换文件的路径。
-
指定转换的话题
rosbags-convert --src input.bag --dst output --topics /camera/image_raw /imu/data ------------------------------------------- # --topics <topic1> <topic2>:指定要转换的 topic 列表,默认转换所有 topic
-
指定转换的时间范围
rosbags-convert --src input.bag --dst output --start 5 --end 60 ------------------------------------------- # --start <seconds> 和 --end <seconds>:指定转换的时间范围,适合大文件部分转换。
-
请保持备份的好习惯,以防转换过程中出现问题,在转换后,请仔细检查并测试新的bag文件,避免数据源出现问题!!
小结
rosbags-convert
不依赖 ROS 1 或 ROS 2 的运行环境,只需安装 Python 和 rosbags 库即可运行。专门设计用于 ROS 1 和 ROS 2 的 bag 文件互转,能够直接处理两种格式的差异,简单易用,社区支持较好。如有其他问题,欢迎在评论区交流!!