需求
要将ros2录制的db3文件,转为ros1的bag文件。
太长不开,直接看方案3
方案1
网上找了一圈,说的最多的方案是利用ros1_bridge转录的方案。
(1) source ros2 & ros1, and then ros2 run ros1_bridge dynamic_bridge;
(2) ros2 bag play xxxx.db3
(3) rosbag record /openzen/data /rslidar_points
转录制方案有好几个缺点
- 需要同时安装ros1和ros2,依赖较多。
- 转录的时候,容易掉帧。实测在我的笔记本上,转录点云数据掉了30%以上。
- 慢,原始db3文件时长多少,转录为bag就得多久时间。
方案2
ros2 bag play xxx.db3,然后写一个节点接收数据,存到本地。
然后ros1去读取存在本地的数据,写为bag文件。
太ugly了。
方案3
方案1和2的根本原因在于官方没有提供ros2 db3的读写接口。
ros最强大的地方在于开源工具多。
经过一番搜索,我找到了一个现成的包。
这个工具有如下特点
- 可以无缝实现bag和db3的互相转换
- 提供了db3文件的读写接口,非常方便。
- 转换速度很快,我半小时的数据,只需要20s转好。
- 不用依赖ros2、ros1
这个工具就是
rosbags
update 2023-03-24
更新对ros2 mcap格式数据支持。
注意rosbags版本要大于等于0.9.15
已经安装过rosbags的话,请更新 pip install --upgrade rosbags
关键是这个包还不用依赖ros2和ros1,在python3下可以直接使用
废话不多说,
其文档在https://ternaris.gitlab.io/rosbags/index.html
代码托管在gitlab上,https://gitlab.com/ternaris/rosbags
安装
pip install rosbags
将ros2的db3转为bag
rosbags-convert rosbag2_2023_01_31-14_40_45
即可得到rosbag2_2023_01_31-14_40_45.bag
将bag文件转为ros2的db3
rosbags-convert rosbag2_2023_01_31-14_40_45.bag
从db3中读取msg
from rosbags.rosbag2 import Reader
from rosbags.serde import deserialize_cdr
# create reader instance and open for reading
with Reader('/home/xxx/data/rosbag2_2023_01_04-17_24_41') as reader:
connections = [x for x in reader.connections if x.topic == '/Imu']
for connection, timestamp, rawdata in reader.messages(connections=connections):
msg = deserialize_cdr(rawdata, connection.msgtype)
print(msg.header.frame_id)