ROS2虽然重新设计了架构实现,但是也考虑到了与ROS1的兼容,专门开发了一个功能包——ros1_bridge,来完成ROS2ROS1之间的通讯。但是目前ros1_bridge这个包的功能有限,还不提供python实现,而且仅支持ros2/common_interfaces repository中列出的通讯类型,如果要支持自己定义的接口,还需要自己编译ros1_bridge包。

       无论如何,还是让我们先来尝尝鲜,看看如何建立ROS1ROS2之间的通讯。

一、前提条件

       在使用ros1_bridge包之前,需要先确定以下几点:

1.    你已经安装了ROS2,可以参考ROS2探索总结(三)使用预编译好的ROS2二进制文件,或者参考wiki进行源码编译。本文使用的前者。

2.    既然要让ROS2ROS1通讯,当然也要保证你的电脑里已经安装了ROS1,并且设置了相关的环境变量,本文使用的环境是Ubuntu16.04+ROS Kinetic

二、示例1talkerlistener

       还是这个经典的案例,在前边几篇的探索中,我们都是在ROS2中运行的talkerlistener,这次,我们将两个节点分别运行在ROS1ROS2上。

       首先打开第一个终端,运行ROS1rocore

       然后打开第二个终端,进入到预编译好的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'

       并且,伴随着talkerlistener直接的通信,ros1_bridge也会显示“Passing message from ROS 1 to ROS 2”,当终止talker或者listener时,会显示“removed 1to2 bridge for topic 'chatter'”

1

       ros1_bridge类似于一个桥梁,一直在监听ROS2/ROS1中发布/订阅的消息/服务,当找到需要在ROS1ROS2之间传递的信息后,就将这些信息从桥上运过去,类似的概念在ROS1还有不少,比如arduino_bridge等。

       当然,我们也可以在ROS1中运行listener,在ROS2中运行talker,方法和效果与上文类似,不再赘述。

三、示例2:图像传输

      上边我们看到的是传输简单的string消息,如果需要传输大数据(例如图像数据),那么效果会怎样呢?我们不妨来试试。

       方法和示例1类似,可以直接看下边图片中所输入的命令。可以看到,即便是传输图像数据,ros1_bridge也是可以胜任,而且依然可以使用rqt_image_view中的命令保存图片。

2

四、示例三:AddTwoInts

       试过了主题消息的传输,那么服务消息是不是也可以通过ros1_bridge来传输呢?答案当然是肯定的。还记不记得ROS wiki教程中的讲解服务时使用的示例AddTwoInts,我们再用这个示例来测试一下。

        方法类似,命令和测试结果如下图所示:

3

       好啦,ros1_bridge我们就测试到这里。通过ros1_bridge,我们可以方便的将系统中ROS1ROS2的节点连接,实现消息的无障碍传输,但是ros1_bridgeROS2一样,还处于开发阶段,功能还不是很完善,只是为我们提供了一种功能的预览,期待ROS2成熟后,会有更方便、稳定的集成方案。

参考资料

ros1_bridge https://github.com/ros2/ros1_bridge