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.bashROS_DISTROwassetto'melodic'before.Pleasemakesurethattheenvironmentdoesnotmixpathsfromdifferentdistributions.(base)shl@zhihui-mint:~$source/opt/ros/melodic/setup.bashROS_DISTROwassetto'eloquent'before.Pleasemakesurethattheenvironmentdoesnotmixpathsfromdifferentdistributions.(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$ros2baginforosbag2_2021_05_19-11_28_34/Files:rosbag2_2021_05_19-11_28_34/rosbag2_2021_05_19-11_28_34_0.db3Bagsize:1.1GiBStorageid:sqlite3Duration:42.616sStart:May19202111:28:34.289(1621394914.289)EndMay19202111:29:16.906(1621394956.906)Messages:857Topicinformation:Topic:/image|Type:sensor_msgs/msg/Image|Count:427|SerializationFormat:cdrTopic:/scan|Type:sensor_msgs/msg/LaserScan|Count:430|SerializationFormat:cdr(base)shl@zhihui-mint:~/Desktop/calibrate_data$
2、转换到ros1之后的bag包信息
(base)shl@zhihui-mint:~/Desktop/calibrate_data$rosbaginfo2021-05-19-19-59-37.bagpath:2021-05-19-19-59-37.bagversion:2.0duration:42.5sstart:May19202119:59:41.91(1621425581.91)end:May19202120:00:24.38(1621425624.38)size:1.1GBmessages:847compression:none[419/419chunks]types:sensor_msgs/Image[060021388200f6f0f447d0fcd9c64743]sensor_msgs/LaserScan[90c7ef2dc6895d81024acba2ac42f369]topics:/image418msgs:sensor_msgs/Image/scan429msgs: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,否则打印没有数据!