1.3.6 ROS节点管理器

ROS节点管理器很像DNS服务器,因为它将唯一的名称和ID与系统中活动的ROS元素相关联。当ROS系统中的任何节点启动时,它将开始寻找ROS节点管理器,并在其中注册节点的名称。因此,ROS节点管理器拥有ROS系统上当前运行的所有节点的详细信息。当节点的任何详细信息发生更改时,它将生成一个回调,并用最新的详细信息更新节点。这些节点详细信息对于连接每个节点都很有用。

当一个节点开始发布某个主题时,该节点将向ROS节点管理器提供该主题的详细信息,例如其名称和数据类型。ROS节点管理器将检查是否有任何其他节点订阅了同一主题。如果有任何节点订阅了同一主题,ROS节点管理器将向订阅节点共享发布服务器的节点详细信息。获取节点详细信息后,这两个节点将被连接。在连接到两个节点后,ROS节点管理器就不再起作用了。根据要求,我们可以停止发布者节点或订阅者节点。停止任何节点后,它们将再次向ROS节点管理器报到。ROS服务也使用同样的方法。

正如我们已经说过的,节点是使用ROS客户端库编写的,比如roscpp和rospy。这些客户端使用基于XML远程过程调用(XMLRPC)的API与ROS节点管理器交互,这些API充当ROS系统API的后端。

ROS_MASTER_URI环境变量包含ROS节点管理器的IP和端口。使用此变量,ROS节点可以定位ROS节点管理器。如果该变量错误,节点之间将不会进行通信。当我们在单个系统中使用ROS时,可以使用localhost的IP或localhost本身的名称。但是在一个分布式网络中,计算是在不同的物理计算机上进行的,我们应该正确定义ROS_MASTER_URI,只有这样,远程节点才能找到彼此并相互通信。在一个分布式系统中,我们只需要一个节点管理器,它应该运行在一台所有其他计算机都可以正确ping它的计算机上,以确保远程ROS节点可以访问节点管理器。

图1.8显示了ROS节点管理器如何与发布节点和订阅节点交互,发布者节点发布带有Hello World消息的字符串类型主题,订阅者节点订阅此主题。

图1.8 ROS节点管理器与Hello World发布者和订阅者之间的通信

当发布者节点开始在特定主题中发布Hello World消息时,ROS节点管理器将获得该主题和节点的详细信息。它将检查是否有任何节点订阅同一主题。如果当时没有节点订阅同一主题,则两个节点将保持未连接状态。如果发布者节点和订阅者节点同时运行,ROS节点管理器将向订阅者交换发布者的详细信息,它们将通过ROS主题连接和交换数据。