本文旨在解决两台计算机都装有ROS系统的情况下,它们ROS内部的消息传输。本文默认您已基本掌握ROS的基本操作和原理,想了解ROS基本原理和操作,请戳ROS教程。下述的双计算机配置皆为 Ubuntu 14.04 64bit + ROS indigo。
实现思想
假如仅有一台计算机,配置有linux + ROS,想要实现不同节点(node)发布的话题(topic)之间的传输,仅需要确保本机打开了roscore,并且参数ROS_MASTER_URI的设置正确。(我们一般不用考虑ROS_MASTER_URI的设置,在运行roscore的时候,它已经自动设置正确了,默认时,ROS_MASTER_URI=http://localhost:11311/)
roscore会订阅(subscribe)所有该机器下的话题(topic),不妨这样认为,如果有节点(node)需要订阅话题(topic),只需要在roscore处查阅消息即可。因此,roscore实现了服务器的功能。
如果有两台计算机,一台计算机中的节点(node)需要获得另一台计算机的话题(topic)(或者双方都有需求),只需要选一台计算机打开roscore,另一台计算机不打开roscore,而是确保与计算机A的网络通信通畅情况下,把ROS_MASTER_URI设置为roscore的地址,此时两台计算机所有话题都可共享了。
具体步骤
本文需要通信的两台计算机名字分别叫作lty-Lenovo-Y430P和cyberc3.两台计算机连接到相同的无线局域网(wlan)。(本文测试过,有线局域网也可以。)
我们打算让cyberc3打开roscore,lty-Lenovo-Y430P不打开。两台计算机都连接cyberc3的roscore.
获取计算机的ip
请打开终端(ctrl+alt+t),将看到如下形式
|
|
查阅计算机的内网ip地址,在终端下输入命令
|
|
在详细信息中查阅。
本文在lty-Lenovo-Y430P中输入该命令,得到结果如下图。
因为两台电脑都在同一局域网内。所以用内网的ip地址即可通信。对cyberc3执行相同操作,记录ip地址
分别为:
lty-Lenovo-Y430P的ip地址是192.168.0.116
cyberc3的ip地址是192.168.0.10
修改host
在终端下输入
|
|
输入密码后,将在记事本中打开hosts文件,在文末填加对方计算机的地址和名字,保存并关闭。
例如,lty-Lenovo-Y430P的hosts文件将会变为如下图所示
类似的,也要在cyberc3的hosts中加入lty-Lenovo-Y430P的ip和名字
修改系统环境变量
此步骤仅需要在lty-Lenovo-Y430P中操作
在终端中输入
注意:等号两侧不可以有空格。上述命令只对当前终端有效!
如果有多个终端需要用到的cyberc3计算机的roscore,就应该对每个终端,都要输入上述环境语句,再输入rosrun等等命令。
为提升效率,可以将上述三句命令保存为一个.sh文件,保存在lty-Lenovo-Y430P计算机中,如cyberc3_comm.sh.只需要每打开一个终端,输入
|
|
或
即可达到相同效果。
在cyberc3中打开roscore
最后,只需要在cyberc3的终端下输入roscore,即可通信!
请不要在lty-Lenovo-Y430P中打开roscore.
Troubleshooting
仍然时而会无法正常通信,请尝试如下解决方案
确定连接在同一个网络,且网络通畅
尝试在终端下输入
|
|
观察双方网络是否连通
检查设置是否完成正确
包括是否缺少步骤,是否存在输入错误,等等。
仅在cyberc3中打开roscore
请不要在lty-Lenovo-Y430P中打开roscore.
重启
如果反复检查都没有问题,不妨试试重启
Enjoy it!
请避免话题(topic)内容量过大,否则易导致网络瘫痪。