ROS 教程之 network:多台计算机之间网络通信(1)

        LZ在实验室环境下要实现一台台式主机和移动机器人上的笔记本通信。台式机作为主机,用rviz监控和无线操作移动机器人,笔记本上通过ROS实现移动机器人的自主定位和路径规划等程序。主机上用的虚拟机装的ubuntu 12.04,通过有线连接一个无线路由,而笔记本端是通过这个路由的wifi上网,台式机和笔记本是在同一个路由下。

       由于LZ最开始的时候照着《ROS by example 1》中的4.12章节用Zeroconf实现ROS networking失败,又跑去照着官网的ROS/Networking 教程 操作,还是失败。两台电脑之间要么就是无法解析主机名(resolve hostname),要么就是台式机上虚拟机这边可以向笔记本发送消息,笔记本无法发消息给台式机。本文纪录LZ的实验过程,希望能让您少走弯路。

      系列文章分为两部分:

      1.在该系列文章1即本文中实现官网ROS Networking的基础教程:台式机上启动talker.py节点,不断向笔记本上发送hello world。笔记本端启动roscore,和listener.py节点,接受台式机发来的消息。

      2.在该系列文章2中实现:台式机上启动rviz监控和操控小车,笔记本放在移动机器人实现自主定位和路径规划。

注:两台笔记本在同一个wifi路由下,直接使用《ROS by example 1》中的Zeroconf是可行的,如果无法解析,再接着下面的操作。

一、两台电脑通信前的准备工作:

     1.首先查看两台电脑各自的ip信息和主机名hostname:

      查看ip:在终端中输入下面的命令

ifconfig
     我实验室台式机上得到结果如下:

ROS 教程之 network:多台计算机之间网络通信(1)_第1张图片

台式机是有线连接的,在eth0这一栏里找到你的ip地址,笔记本是通过wifi连接的,在wlan0一栏找到笔记本端的ip地址.

      查看两电脑各自的主机名,在终端中输入:

hostname

我台式机上的得到的结果如下:


台式机主机名为:hyjlab-virtual-machine,其实主机名hostname就是终端的标题栏上 @后面的那串字符,如上图。

        2.修改/etc文件夹下的hosts文件:

        修改hosts文件的目的是将两电脑的ip和主机名绑定,两台电脑之间通过hostname就能找到对方。没有这一步的时候,你直接去ping 对方主机名时,结果是无法解析对方主机名。

        这里以修改台式机上的hosts文件为例,笔记本上也要相同操作。由于电脑上的 hosts文件是只读文件,直接修改后是保存不了的。因此先用root方式对该文件属性进行修改。

第一种方式(推荐):

        使用常用的gedit 修改,只是在gedit前面加上gksu,如:

gksu gedit /etc/hosts
这种方式修改大批量很方便。
第二种方式,通过vim:

        在终端里输入:

sudo chmod a+w /etc/hosts
修改了权限以后,再输入:

vim /etc/hosts

如果提示没有vim命令,先sudo apt-get install vim 装一下vim

        打开hosts后,你看到hosts文件内开头已经有了两行,我们从第三行开始插入你刚刚查到的两台电脑的ip地址和主机名hostname,形式如下:

your_ip   your_hostname

中间用tab键隔开,不是空格。LZ的台式机的hostname为:hyjlab-virtual-machine。笔记本为:hyj-F83VF。

如下图所示:

ROS 教程之 network:多台计算机之间网络通信(1)_第2张图片

输入完以后,按下退出ESC键,然后按下 “  : ”  ,输入wq! 回车就行了,如下图:

ROS 教程之 network:多台计算机之间网络通信(1)_第3张图片

修改完以后,在两台电脑上都输入下列命令重启以下网络:

sudo /etc/init.d/networking restart


二、实现两台电脑间通信:

        1.在两台电脑上装上chrony包,用于实现同步:

sudo apt-get install chrony

        2. 在两台电脑上都进行ssh服务器的安装

        关于SSH命令可以参考下Ubuntu环境下SSH的安装及使用,这里只管使用,不细谈SSH本身。

        首先在终端中输入下面的命令,安装SSH服务器,SSH的客服端Ubuntu自带已经安装好了:

sudo apt-get install openssh-server

安装完以后,确认服务器是否已经启动:

ps -e|grep ssh
如果只有ssh-agent,那ssh-server还没有启动,需要/etc/init.d/ssh start,如果看到sshd那说明ssh-server已经启动了。

         3.正式开始通信

        首先进行基本的ping操作,下面用desktop_hostname代表台式机的主机名,用laptop_hostname代表笔记本上的主机名:

第一步先检查台式机去ping 笔记本,看通信是否正常,输入: 

ssh desktop_hostname
ping laptop_hostname
你应该会得到如下的一些东西:

ROS 教程之 network:多台计算机之间网络通信(1)_第4张图片
第二步,反过来从笔记本去ping台式机:

ssh laptop_hostname
ping desktop_hostname

如果你的台式机上是直接装的Ubuntu,那应该也能返回正确的结果。这里由于LZ是在台式机的虚拟机上运行的Ubuntu,然后上网方式是用的Nat方式,导致笔记本那段不能返回正确结果,也就是ping不通。LZ在查阅资料linux虚拟机可以ping通主机,主机无法ping通虚拟机后,给出解决办法如下:

在虚拟机设置里面选择将网络适配器的网络连接方式由NAT改为桥接就行了。

ROS 教程之 network:多台计算机之间网络通信(1)_第5张图片

第三步:跨机器运行talk/listener。如果前面的测试都通了,照着ROS在多机器人上的使用 操作一下,就能实现跨机器运行ROS节点。

这里我们把笔记本当做主机master,在笔记本上启动master:

ssh laptop_hostname
roscore
然后在新的终端里启动listener, 并配置ROS_MASTER_URI,这样就可以使用刚刚启动的master了:
export ROS_MASTER_URI=http://laptop_hostname:11311 
rosrun rospy_tutorials listener.py
最后,在台式机上启动talker节点,在台式机上要 配置 ROS_MASTER_URI,这样台式机上的ROS才能指向笔记本上已经启动的master
ssh desktop_hostname
export ROS_MASTER_URI=http://laptop_hostname:11311
rosrun rospy_tutorials talker.py
这时你将发现笔记本上的listener开始接受台式机上发布的消息了,这就实现了跨机器运行不同的ROS node。

接下来再反过来测试一下笔记本作为talker,往台式机发布消息,可以参考官网教程ROS在多机器人上的使用 :

         先用Ctrl+C 终止你笔记本上的listener 和台式机上的talker,注意终端没有关闭,然后不用多余的变动,直接在笔记本的该终端下运行talker节点,在台式机上的那个终端下运行listener节点。

        只要你按着上面的一步一步过来的,反过来应该也是OK的。


        到这里,ROS Netwoking的基础部分已经完成了,并且在设置了上面的这些步奏以后,《ROS by example 1》4.12中提到的Zeroconf可以使用了。接下来就开始运用在我们自己的项目上,请见下篇教程。


文章为原创,

请注重博主劳动成果,

错误请指出,转载请注明。

                                --白巧克力


reference:

1.ROS/Network Setup

2.李宝全 ROS:典型功能实现方法

3.the /etc/hosts file

4.ROS networking tutorials

5.ROS在多机器人上的使用 

6.Ubuntu环境下SSH的安装及使用

7.linux虚拟机可以ping通主机,主机无法ping通虚拟机


你可能感兴趣的:(用ROS开发自己的机器人)