ROS教程 - 多台计算机 网络 设置

本文主要参考ROS官网教程 和 白巧克力亦唯心的博文: ROS设计的灵魂就在于其分布式计算。一个优秀的节点不需要考虑在哪台机器上运行,它允许实时分配计算量以最大化的利用系统资源。(有一个特例——驱动节点必须运行在跟硬件设备有物理连接的机器上)。在多个机器人上使用ROS是一件很简单的事,你只需要记住一下几点: - 你只需要一个master,只要在一个机器上运行它就可以了。 - 所有节点都必须通过配置 ROS_MASTER_URI连接到同一个master。 - 任意两台机器间任意两端口都必须要有完整的、双向连接的网络。 - 每台机器都必须向其他机器广播其能够解析的名字。


一、获取两台机器的IP 和 主机名,并配置hosts文件

首先利用ifconfig和hostname命令查看两台电脑的IP和主机名,在此,假设这两台电脑主机名分别为marvin和hal,分别在对应的电脑终端输入以下两条命令可以查看对应IP和主机名:

ifconfig
hostname

为了让两台电脑都识别对方IP以及和对方的hostname对应上,在这里我们配置/etc/hosts 映射文件,/etc目录下包含很多配置文件,可以参考Linux教程了解该文件相关信息,如果不配置该文件,ping的时候需要用IP地址,无法直接ping主机名。 由于hosts文件是只读文件,因此修改是需要sudo以后才能修改,如果是ubuntu等有gedit编辑器的系统可以通过如下命令修改:

gksu gedit /etc/hosts

如果没有gedit等可视化界面,则一般采用vim修改(如果没有vim,一般也有vi的),可以:

sudo vim /etc/hosts

修改以后保存文件。 打开hosts文件,通常文件中已经有两行:localhost和当前电脑的主机名,然后在下面再添加两行,分别是当前电脑的IP和其主机名,以及两外一台电脑的IP和对应主机名,一般如下形式:

192.168.1.1 marvin
192.168.1.2 hal

这个IP为该电脑在对应网络中的IP,如果电脑连入多个网络,在ifconfig查看IP的时候要注意一下。 修改完hosts文件以后,需要重启网络,输入下列命令:

sudo /etc/init.d/networking restart

二、全连接测试

采用ping命令测试所有端口的双向连通性(full bi-directional connectivity on all ports) 测试方式:ping 主机名,包括self ping 和 ping between machines 在两台电脑上分别输入如下命令:

ping marvin
ping hal

应该看到类似的测试结果:

PING marvin (192.168.0.1): 56 data bytes
64 bytes from 192.168.1.1: icmp_seq=0 ttl=63 time=1.868 ms
64 bytes from 192.168.1.1: icmp_seq=1 ttl=63 time=2.677 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=63 time=1.659 ms
......

进一步测试:利用netcat 为什么需要进一步测试,这是ros官网给出的理由:ping only checks that ICMP packets can get between the machines, which isn’t enough. You need to make sure that you can communicate over all ports. 从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况,也能确保连线的准确性,但是这还不够,我们需要测试所有端口的通信情况。 ROS官网给出的方法是利用netcat随机测试端口通信情况,前提是只能测试端口号大于1024的端口,因为1024以下端口需要superuser的权限,在某些版本linux下netcat命令可能又叫 nc。netcat(nc)的使用可以参考开源中国社区的一个技术分享 测试方法如下: 首先从第一台电脑(marvin)侦听另外一台电脑,在第一台电脑上输入命令:

netcat -l 1234

在另外一台电脑(hal)上输入:

netcat marvin 1234

如果通讯成功,则可以在两个命令行中敲入字符,进行交流,类似于QQ即时通讯。 同样的,交换方向,在hal上输入

netcat -l 1234

在marvin上输入:

netcat hal 1234

测试通讯。 如果有一台电脑是虚拟机,则可参考linux虚拟机可以ping通主机,主机无法ping通虚拟机

三、设置ROS MASTER(ROS 主机)

设置ROS主机,即设置环境变量 ROS_MASTER_URI,我们要在两台电脑上都进行如下设置,这样两台电脑才会共同认定marvin为MASTER: 一般可以通过如下命令修改ROS_MASTER_URI

export ROS_MASTER_URI=http://marvin:11311

但是这样子操作,只对当前的终端起作用,我们可以通过修改~/.bashrc 文件来设置环境变量,即打开该文件,并在最后添加如上的命令,然后对该文件进行source,即输入一下命令:

source ~/.bashrc

这里可以参考博文《理解bashrc 和profile》以及 bashrc和profile区别 了解我们为什么要这样做。 然后我们可以通过ROS自带的测试节点来测试配置是否成功。 第一步在ROS主机marvin上运行listener节点,输入:

rosrun rospy_tutorials listener.py

然后到另一台电脑hal上输入:

rosrun rospy_tutorials talker.py

如果配置成功,则会看到主机marvin上出现从机hal发布的消息。同样,可以反向测试,即在主机marvin运行:

rosrun rospy_tutorials talker.py

在hal上运行

rosrun rospy_tutorials listener.py

配置成功也可以看到同样的现象。 下一步可以修改ROS_MASTER_URI,即选择其他电脑作为ROS主机,相应进行测试。

到这里为止,就已经将两台计算机的ROS通信网络设置好,可以进行进一步的开发和配置。