在ROS下使用zeroconf配置多机通信
0x00 为何需要配置ROS多机通信
众所周知ROS是分布式系统,因此可以将机器人需要处理的复杂、计算量大的任务分解在多台机器上分开运行,这样就可以降低主系统出现异常的风险,因此我们就需要配置网络保证各ROS主机之间可以互相通信。另外我们在开发时也经常在本地计算机上来监视远程ROS主系统的运行状态也需要配置多机通信,在这里我们使用zeroconf来配置多机通信,zeroconf的全称是Zero Configuration Networking(零配置网络),是一种用于自动生成可用IP地址的网络技术,不需要额外的手动配置和专属的配置服务器。其目标是让非专业用户也能便捷的连接各种网络设备,例如计算机,打印机等。整个搭建网络的过程都是通过程式自动化实现。如果没有zeroconf,用户必须手动配置一些服务,例如DHCP、DNS,计算机网络的其他设置等。这些对非技术用户和新用户们来说是很难的事情。
当然现在使用的ROS1.0还不是真正的分布式系统,因为仍然是需要一个master主节点来协调各分节点的通信。在不久将来的ROS2.0更高程度上实现了去中心化,使用DDS(Data Distribution Service)即数据分发服务, 目前已经广泛应用于国防、民航、工业控制等领域, 成为分布式实时系统中数据发布/订阅的标准解决方案,更多关于DDS的介绍可以参考后面的参考资料提供的维基百科DDS的网址。
0x01 安装软件包并配置zeroconf
(1)保证多机时间同步
在ROS网络中,由于tf转换和很多消息类型都被标上了时间戳,机器之间的时间同步就非常重要了,一种使各计算机保持时间同步状态的方法就是在各计算机上安装chrony和ntpdate软件包,该软件包会保持计算机的时钟与网络上时间服务器的时钟一致,我们使各计算机的时间与时间服务器时间同步来达到各计算机时间同步的目的,使用如下命令来安装chrony和ntpdate:
sudo apt-get install -y chrony ntpdate
在这里我使用本地装有indigo的台式计算机和树莓派装有kinetic的系统作为演示,当然你选择两个笔记本电脑也是可以的,下面是安装过程:
当安装好软件后就可以来进行时间同步了,时间同步命令如下:
sudo ntpdate -u cn.ntp.org.cn
(2)使用Zeroconf配置ROS主机间通信
在经常使用的Linux系统上,如ubuntu系统使用avahi来实现zeroconf,avahi 是Zeroconf规范的开源实现,其包含了一整套多播DNS(multicastDNS)/DNS-SD网络服务的实现。Avahi允许程序在不需要进行手动网络配置的情况下,在一个本地网络中发布和获知各种服务和主机。例如,当某用户把他的计算机接入到某个局域网时,如果他的机器运行有Avahi服务,则Avahi程式自动广播,从而发现网络中可用的打印机、共享文件和可相互聊天的其他用户。这有点象他正在接收局域网中的各种网络广告一样。Linux下系统实际启动的进程名,是avahi-daemon,通过以下命令可以查看当前系统上是否启动了avahi-daemon守护进程:
ps aux|grep avahi
可以发现两个ROS主机都已经默认启动了avahi-daemon守护进程,那么接下来就可以来配置了:
- 获取主机名称并测试主机间连通性
使用hostname来得到主机名称,那么相应的zeroconf主机名就是在该主机名称后面加上“.local”即可:
-
设置ROS_MASTER_URI和ROS_HOSTNAME变量
在ROS网络中,指定其中一台设备作为ROS master主机,那么该主机将负责运行roscore进程,其他设备必须配置ROS_MASTER_URI环境变量来指向该master主机。对于所有的设备都必须要设置的是ROS_HOSTNAME变量,这个ROS_HOSTNAME变量就是我们上面得到的zeroconf主机名。
接下来我们分别修改台式机和树莓派的home目录下的.bashrc文件,在其中增加如下框中配置,在这里我们把树莓派作为ROS master主机,所以ROS_MASTER_URI指向的是自己robot.local。我们又设置了台式机的ROS_MASTER_URI也指向robot.local,这就说明我们需要把台式机作为ROS的一个从节点设备,当然如果想修改台式机为master主机,树莓派为从节点设备的话只需要将各自的ROS_MASTER_URI中的robot.local修改为台式机的zeroconf主机名workspace.local即可。
0x02 测试ROS主从机之间的通信
当配置好ROS的ROS_HOSTNAME和ROS_MASTER_URI后,我们需要重新打开一个新终端才能使上述的配置生效。接下来我们就可以在master主机上启动roscore来测试主从机的ROS通信是否正常了,在台式机上使用rostopic list来看是否能获取到话题列表,如果能获取到说明ROS的主从机通信正常:
接下来测试使用台式机来遥控master主机上的turtlesim,查看话题能否正常订阅和发布:
- 在树莓派上启动roscore后,还需要启动turtlesim一个仿真小乌龟的节点:
rosrun turtlesim turtlesim_node
- 在台式机上运行键盘遥控小乌龟移动的节点:
rosrun turtlesim turtle_teleop_key
还可以启动rqt_plot来同步查看小乌龟的一些数据,直接使用rqt_plot启动即可,我们在rqt_plot中可视化turtle1/pose中各数据,当然我们在本地台式机上打开rviz进行调试也是可以的,经常有小伙伴尝试在树莓派上打开rivz来进行调试,经常无法在树莓派上正常启动,因为rviz特别消耗系统资源,这样我们就可以在本地台式机上进行调试了,具体的测试效果如下所示:
- 接下来我们使用ssh来进行连接ROS主机就比较方便了,即使我们不知道对方的IP地址也可以连接了,只需要直接连接该主机的zeroconf主机名即可:
0x03 注意事项
[1].需要注意该配置过程是基于ROS主从机在同一个路由器下,即必须要求在同一个IP地址段内,如果想通过互联网将在两个不同地址段的ROS主机通信就比较复杂了(即一台ROS主机在公司,你的ROS从机在家里,想通过在家里直接调试公司里的ROS机器人),不在本教程讨论范围内。
0x04 参考资料
[1].更多关于Zeroconf的介绍可以在官网地址查询[OL]. http://www.zeroconf.org/
[2].维基百科上关于数据分发服务DDS的介绍[OL]. https://en.wikipedia.org/wiki/Data_Distribution_Service
[3].R.帕特里克-戈贝尔 著 J.罗哈斯 刘柯汕 彭也益 刘振东 李家能 黄玲玲 译. ROS入门实例[M]. 广州:中山大学出版社. 2016. 13-17.
0x05 问题反馈
大家在按照教程操作过程中有任何问题,可以关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题即可,我基本上每天都会处理公众号中的留言!当然如果你要是顺便给ROS小课堂打个赏,我也会感激不尽的,打赏30块还会邀请进ROS小课堂的微信群与更多志同道合的小伙伴一起学习和交流!