ROS2虽然重新设计了架构实现,但是也考虑到了与ROS1的兼容,专门开发了一个功能包——ros1_bridge,来完成ROS2与ROS1之间的通讯。但是目前ros1_bridge这个包的功能有限,还不提供python实现,而且仅支持ros2/common_interfaces repository中列出的通讯类型,如果要支持自己定义的接口,还需要自己编译ros1_bridge包。
无论如何,还是让我们先来尝尝鲜,看看如何建立ROS1与ROS2之间的通讯。
一、前提条件
在使用ros1_bridge包之前,需要先确定以下几点:
1. 你已经安装了ROS2,可以参考ROS2探索总结(三)使用预编译好的ROS2二进制文件,或者参考wiki进行源码编译。本文使用的前者。
2. 既然要让ROS2与ROS1通讯,当然也要保证你的电脑里已经安装了ROS1,并且设置了相关的环境变量,本文使用的环境是Ubuntu16.04+ROS Kinetic。
二、示例1:talker和listener
还是这个经典的案例,在前边几篇的探索中,我们都是在ROS2中运行的talker和listener,这次,我们将两个节点分别运行在ROS1和ROS2上。
首先打开第一个终端,运行ROS1的rocore。
然后打开第二个终端,进入到预编译好的ROS2目录下,设置环境变量,启动ros1_bridge。
. <install-space-with-bridge>/setup.bash
dynamic_bridge
接着打开第三个终端,在ROS1中运行talker节点。
rosrun rospy_tutorials talker
最后打开第四个终端,在ROS2中运行listener节点。
. <install-space-with-bridge>/setup.bash
listener
OK,此时,你应该可以在第二个运行着ros1_bridge的终端中看到一句话:
created 1to2 bridge for topic ‘chatter’ with ROS 1 type ‘std_msgs/String’ and ROS 2 type ‘std_msgs/String’
并且,伴随着talker与listener直接的通信,ros1_bridge也会显示“Passing message from ROS 1 to ROS 2”,当终止talker或者listener时,会显示“removed 1to2 bridge for topic ‘chatter’”。
ros1_bridge类似于一个桥梁,一直在监听ROS2/ROS1中发布/订阅的消息/服务,当找到需要在ROS1和ROS2之间传递的信息后,就将这些信息从“桥上”运过去,类似的概念在ROS1还有不少,比如arduino_bridge等。
当然,我们也可以在ROS1中运行listener,在ROS2中运行talker,方法和效果与上文类似,不再赘述。
三、示例2:图像传输
上边我们看到的是传输简单的string消息,如果需要传输大数据(例如图像数据),那么效果会怎样呢?我们不妨来试试。
方法和示例1类似,可以直接看下边图片中所输入的命令。可以看到,即便是传输图像数据,ros1_bridge也是可以胜任,而且依然可以使用rqt_image_view中的命令保存图片。
四、示例三:AddTwoInts
试过了主题消息的传输,那么服务消息是不是也可以通过ros1_bridge来传输呢?答案当然是肯定的。还记不记得ROS wiki教程中的讲解服务时使用的示例AddTwoInts,我们再用这个示例来测试一下。
方法类似,命令和测试结果如下图所示:
好啦,ros1_bridge我们就测试到这里。通过ros1_bridge,我们可以方便的将系统中ROS1与ROS2的节点连接,实现消息的无障碍传输,但是ros1_bridge和ROS2一样,还处于开发阶段,功能还不是很完善,只是为我们提供了一种功能的预览,期待ROS2成熟后,会有更方便、稳定的集成方案。
参考资料
ros1_bridge :https://github.com/ros2/ros1_bridge