ROS下的双机通信

本文旨在解决两台计算机都装有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),将看到如下形式

1
userName:computer_name:~$

查阅计算机的内网ip地址,在终端下输入命令

1
ifconfig

在详细信息中查阅。

本文在lty-Lenovo-Y430P中输入该命令,得到结果如下图。

ifconfig结果

因为两台电脑都在同一局域网内。所以用内网的ip地址即可通信。对cyberc3执行相同操作,记录ip地址

分别为:

lty-Lenovo-Y430P的ip地址是192.168.0.116

cyberc3的ip地址是192.168.0.10

修改host

在终端下输入

1
sudo gedit /etc/hosts

输入密码后,将在记事本中打开hosts文件,在文末填加对方计算机的地址和名字,保存并关闭。

例如,lty-Lenovo-Y430P的hosts文件将会变为如下图所示

host文件

类似的,也要在cyberc3的hosts中加入lty-Lenovo-Y430P的ip和名字

修改系统环境变量

此步骤仅需要在lty-Lenovo-Y430P中操作

在终端中输入

1
2
3
export ROS_MASTER_URI=http://cyberc3:11311 #要和cyberc3的roscore终端中的ROS_MASTER_URI的port一致,默认为11311。http不可省略
export ROS_IP=192.168.0.116  #本机的ip地址,为了方便其他计算机与本机通信
export ROS_HOSTNAME=lty-Lenovo-Y430P #本机名字,作用与ROS_IP类似

注意:等号两侧不可以有空格。上述命令只对当前终端有效!

如果有多个终端需要用到的cyberc3计算机的roscore,就应该对每个终端,都要输入上述环境语句,再输入rosrun等等命令。

为提升效率,可以将上述三句命令保存为一个.sh文件,保存在lty-Lenovo-Y430P计算机中,如cyberc3_comm.sh.只需要每打开一个终端,输入

1
source cyberc3_comm.sh


1
. cyberc3_comm.sh

即可达到相同效果。

在cyberc3中打开roscore

最后,只需要在cyberc3的终端下输入roscore,即可通信!

请不要在lty-Lenovo-Y430P中打开roscore.

Troubleshooting

仍然时而会无法正常通信,请尝试如下解决方案

确定连接在同一个网络,且网络通畅

尝试在终端下输入

1
ping 对方ip

观察双方网络是否连通

检查设置是否完成正确

包括是否缺少步骤,是否存在输入错误,等等。

仅在cyberc3中打开roscore

请不要在lty-Lenovo-Y430P中打开roscore.

重启

如果反复检查都没有问题,不妨试试重启

Enjoy it!

请避免话题(topic)内容量过大,否则易导致网络瘫痪。