把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,否则打印没有数据!