2.9 ROS-1和ROS-2的通信
如我们所知,ROS-2仍处于开发之中,目前尚没有一个稳定的长期支持的发行版。因此,直接在ROS-2中编写节点程序或将ROS-1下已有的节点程序移植到ROS-2下将是一项艰巨的任务。为了使得用户能够使用ROS-1和ROS-2的功能包进行项目开发,可以通过一个名为ros1_bridge的功能包实现ROS-1和ROS-2的通信,从而实现两个版本的连接与共用。
ros1_bridge实际上是一个ROS-2功能包,用于自动或手动建立消息、话题和服务的映射,并在ROS-1和ROS-2节点之间进行通信。ros1_bridge可以在某个ROS版本中订阅消息,然后在其他ROS版本中发布它们。当读者想使用一个模拟器(比如带有ROS-2的Gazebo)来测试自己的项目时,这个软件包就派上了用场。在撰写本书时,ros1_bridge功能包仅支持一定数量的消息。我们期待其他功能包能很快移植到ROS-2中,或者其消息能够得到ros1_bridge功能包的支持,这样我们就可以在ROS-1和ROS-2中并行运行它们。
测试ros1_bridge功能包
ros1_bridge功能包默认安装在我们使用的发行版crystal中。下面让我们在ROS-1中运行一个节点,然后打开ros1_bridge,测试ROS-2中发布的话题。此试验需要打开四个独立的终端,具体如下:
1)在第一个终端窗口中,同时初始化ROS-1和ROS-2的工作空间,然后启动ros1_bridge功能包:
读者将会看到Trying to connect to the ROS master的错误提示。
2)在第二个终端窗口中,初始化ROS-1工作空间,并运行roscore命令:
读者将会看到连接到ROS master的信息。
3)在第三个终端窗口中,启动ROS-1的发布者节点:
读者将会在终端1和3中看到发布的信息。
4)在第四个终端窗口中,初始化ROS-2的工作空间,并启动订阅者节点:
读者将会在终端1、3、4中看到发布的信息。
四个终端窗口的输出信息应如图2.16所示。
图2.16 ROS-1与ROS-2的通信示意图,从左到右、从上到下分别为终端1~4
基于上述操作,读者将方便地建立起ROS-1与ROS-2之间的连接,实现两个版本ROS功能包的通信。此外,还可以采用同样的方法,通过使用simple_bridge_2_to_1节点实现ROS-1与ROS-2的通信。
建议读者尝试dynamic_bridge节点,该节点能够自动建立ROS-1和/或ROS-2节点间的通信连接。