3.9 分布式多机通信

ROS是一种分布式软件框架,节点之间通过松耦合的方式进行组合,在很多应用场景下,节点可以运行在不同的计算平台上,通过Topic、Service进行通信。但是“一山不容二虎”,ROS中只允许存在一个Master,在多机系统中Master只能运行在一台机器上,其他机器需要通过ssh的方式和Master取得联系。所以在多机ROS系统中需要进行一些配置。

我们以两台计算机为例,介绍分布式多机通信的配置步骤,其中计算机hcx-pc作为主机运行Master,计算机raspi2作为从机运行节点。

3.9.1 设置IP地址

首先需要确定ROS多机系统中的所有计算机处于同一网络,然后分别在计算机hcx-pc、raspi2上使用ifconfig命令查看计算机的局域网IP地址(见图3-35、图3-36)。

图3-35 hcx-pc的IP地址是192.168.31.198

图3-36 raspi2的IP地址是192.168.31.14

分别在两台计算机系统的/etc/hosts文件中加入对方的IP地址和对应的计算机名:


# @hcx-pc,/etc/hosts
192.168.31.14     raspi2

# @raspi2,/etc/hosts
192.168.31.198    hcx-pc

设置完毕后,分别在两台计算机上使用ping命令测试网络是否连通(见图3-37)。

图3-37 在两台计算机上分别使用ping命令测试网络是否连通

如果双向网络都畅通,就说明底层网络的通信已经没问题,接下来设置ROS相关的环境变量。

3.9.2 设置ROS_MASTER_URI

因为系统中只能存在一个Master,所以从机raspi2需要知道Master的位置。ROS Master的位置可以使用环境变量ROS_MASTER_URI进行定义,在从机raspi2上使用如下命令设置ROS_MASTER_URI:


$ export ROS_MASTER_URI=http://hcx-pc:11311

但是以上设置只能在输入的终端中生效,为了让所有打开的终端都能识别,最好使用如下命令将环境变量的设置加入终端的配置文件中。


$ echo "export ROS_MASTER_URI=http://hcx-pc:11311" >> ~/.bashrc

3.9.3 多机通信测试

现在ROS多机系统已经配置完成,下面使用小乌龟例程进行测试。

首先在主机hcx-pc上运行小乌龟的仿真器:


$ roscore
$ rosrun turtlesim turtlesim_node

然后在从机raspi2上使用“rostopic list”命令查看ROS系统中的话题列表(见图3-38)。

图3-38 查看ROS系统中的话题列表

可以看到,现在从机已经可以与Master取得联系。在从机raspi2上发布一只小乌龟的速度控制消息:


$ rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
    x: 0.5
    y: 0.0
    z: 0.0
angular:
    x: 0.0
    y: 0.0
    z: 0.5"

此时,主机hcx-pc中的小乌龟应该就开始移动了(见图3-39),ROS多机系统配置成功。

在实际应用中,可能需要使用两个以上的计算平台,可以使用相同的方法进行配置,主机运行Master,其他从机通过设置ROS_MASTER_URI环境变量确定Master位置即可。

图3-39 通过从机控制主机中的小乌龟运动