上一篇所提到的ROS系统之间的网络通讯,是通过将所有机器连接到一个ros master端口,实现不同机器之间消息的传递。这种方式有个潜在的缺陷,那就是整个网络中只能存在一个ros master,相当于只有一个服务器,所有机器发布和订阅的消息都必须经过该服务器,当数据量大时,可能会导致服务器负载过重(仅为猜测,未实际验证)。因此有必要探究一下能否实现两台机器之间分别运行自己的ros master,并且能够互相通信的方法。
从ROS wiki中找到了一下几种其他的通讯方案
rocon_multimaster
multimaster_fkie
foreign_relay
wifi_comm
multimaster
比较一下感觉最后一个方案最为便捷,只需要做一些简单的配置而不涉及代码的修改。从链接中下载multimaster程序包,放在catkin_ws下的src文件夹,编译程序包
cd ~/catkin_ws
rosmake multimaster
修改config.yaml的参数
local_pubs: [local_topics_to_register_at_foreign_master]
foreign_pubs: [foreign_topics_to_register_at_local_master]
local_services: [local_services_to_register_at_foreign_master]
foreign_services: [foreign_services_to_register_at_local_master]
将要发布的话题名称放在local_pubs中,不同的话题用“,”隔开,其他几个选项类似。
看一下master.launch里的内容
<launch>
<arg name="master" />
<node pkg="multimaster" type="master_sync.py" name="master_sync" output="screen">
<param name="foreign_master" value="http://$(arg master):11311" />
<rosparam command="load" file="$(find multimaster)/config.yaml" />
</node>
</launch>
可以知道外面只需要一个远程master的ip地址作为参数,可以直接在launch文件里修改,也可以在运行launch文件时输入。如果在/etc/hosts文件中已经添加了远程计算机的ip地址和主机名,这里的参数直接使用主机名即可。
运行master.launch
roslaunch multimaster master.launch master:=remote_host
这样,在两台计算机上分别运行master.launch后,就可以在命令行中看到远程计算机的ip与端口,发布和接收的消息,通讯就成功了。这个方案还有个好处是与第一种方案没有冲突,也就意味着我们可以选择某两台计算机作为服务器, 每个服务器又可以各自管理几台计算机,这样就可以降低第一种方案中一个服务器的压力。