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
我实验室台式机上得到结果如下:
台式机是有线连接的,在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
这种方式修改大批量很方便。
在终端里输入:
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。
输入完以后,按下退出ESC键,然后按下 “ : ” 键,输入wq! 回车就行了,如下图:
修改完以后,在两台电脑上都输入下列命令重启以下网络:
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
你应该会得到如下的一些东西:
ssh laptop_hostname
ping desktop_hostname
如果你的台式机上是直接装的Ubuntu,那应该也能返回正确的结果。这里由于LZ是在台式机的虚拟机上运行的Ubuntu,然后上网方式是用的Nat方式,导致笔记本那段不能返回正确结果,也就是ping不通。LZ在查阅资料linux虚拟机可以ping通主机,主机无法ping通虚拟机后,给出解决办法如下:
在虚拟机设置里面选择将网络适配器的网络连接方式由NAT改为桥接就行了。
第三步:跨机器运行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通虚拟机