把ros2录制的bag包转换为ros1格式的bag包

1 安装ros2和ros1之间通信的库包

安装ros-eloquent-ros1-bridge,这个库包主要是用于ros2和ros1之间的通信

sudo apt update
sudo apt install ros-eloquent-ros1-bridge

2 把录制的ros2的bag包转换ros1格式的bag包

先说明一下录制

1、ros2和ros1录制的命令

  • ros2录制数据包命令:ros2 bag record /image /scan
  • ros1录制数据包命令:rosbag record /image /scan

2、ros2和ros1录制的文件格式

  • ros2录制的bag包文件,录制完后会生成一个目录,在目录下会生成多个文件,如下:

  • ros1 录制的bag文件,只有一个文件:例如 2021-05-19-19-10-18.bag

下面介绍如何把录制的ros2的bag包转换ros1格式的bag包,大致流程就是:

  • 播放ros2的包
  • ros1监听到ros2播放的topic,然后再录制topic即可!

2.1 启动ros2到ros1的桥

1、首先打开一个终端命令行

2、在该终端下添加ros2和ros1的环境变量

source /opt/ros/eloquent/setup.bash
source /opt/ros/melodic/setup.bash

(base) shl@zhihui-mint:~$ source /opt/ros/eloquent/setup.bash 
ROS_DISTRO was set to 'melodic' before. Please make sure that the environment does not mix paths from different distributions.
(base) shl@zhihui-mint:~$ source /opt/ros/melodic/setup.bash 
ROS_DISTRO was set to 'eloquent' before. Please make sure that the environment does not mix paths from different distributions.
(base) shl@zhihui-mint:~$ 

3、然后紧接着运行如下命令,启动ros2到ros1的桥

ros2 run ros1_bridge dynamic_bridge

2.2 使用ros2播放ros2的bag包

1、再打开一个新的终端

2、添加ros2的环境变量

source /opt/ros/eloquent/setup.bash

3、播放ros2的bag包

ros2 bag play rosbag2_2021_05_19-11_28_34/

注意:

要先开启ros1录制包监听,然后在开启ros2播放包,如果顺序相反,就会认为造成开头一段数据没有录上!

2.3 使用ros1录制包

1、再开启一个终端

2、然后添加ros1的环境变量

source /opt/ros/melodic/setup.bash

3、使用ros1开始录制数据

rosbag record /scan /image

当你看到ros2播放完bag包之后,ros1就可以Ctrl+C停止bag的录制了!!!

2.4 转换之后的结果

1、原始的ros2录制的bag包信息

(base) shl@zhihui-mint:~/Desktop/calibrate_data$ ros2 bag info rosbag2_2021_05_19-11_28_34/

Files:             rosbag2_2021_05_19-11_28_34/rosbag2_2021_05_19-11_28_34_0.db3
Bag size:          1.1 GiB
Storage id:        sqlite3
Duration:          42.616s
Start:             May 19 2021 11:28:34.289 (1621394914.289)
End                May 19 2021 11:29:16.906 (1621394956.906)
Messages:          857
Topic information: Topic: /image | Type: sensor_msgs/msg/Image | Count: 427 | Serialization Format: cdr
                   Topic: /scan | Type: sensor_msgs/msg/LaserScan | Count: 430 | Serialization Format: cdr

(base) shl@zhihui-mint:~/Desktop/calibrate_data$ 

2、转换到ros1之后的bag包信息

(base) shl@zhihui-mint:~/Desktop/calibrate_data$ rosbag info 2021-05-19-19-59-37.bag 
path:        2021-05-19-19-59-37.bag
version:     2.0
duration:    42.5s
start:       May 19 2021 19:59:41.91 (1621425581.91)
end:         May 19 2021 20:00:24.38 (1621425624.38)
size:        1.1 GB
messages:    847
compression: none [419/419 chunks]
types:       sensor_msgs/Image     [060021388200f6f0f447d0fcd9c64743]
             sensor_msgs/LaserScan [90c7ef2dc6895d81024acba2ac42f369]
topics:      /image   418 msgs    : sensor_msgs/Image    
             /scan    429 msgs    : sensor_msgs/LaserScan
(base) shl@zhihui-mint:~/Desktop/calibrate_data$ 

对比转换前后的bag包的信息对比:

  • 图像的topic数据丢失了:9帧
  • 2D激光雷达的数据丢失了:1帧
  • 关于这是数据丢帧,目前我还不知道如何解决,我同时说在使用ros2进行播放包的时候,可以加上-r参数,这样会好些,单依旧还是会丢帧,我认为最好的方法就是就是把ros2录制的bag包中的数据一帧一帧的读取出来,然后再手动保存成ros1的bag包,但是我并不知道该如何写这个code([捂脸])

2.5 其他注意事项
1、虽然是用ros2播放的ros2的bag包,但是因为已经和ros1建立起了桥,因此使用ros1的rostopic也是可以监听到ros2播放的topic的

2、如果要使用ros1的rostopic echo /scan打印数据,必须要保证ros1录制了该topic,否则打印没有数据!