原文地址:http://www.corvin.cn/635.html,转载主要方便随时查阅,如有版权要求,请及时联系。

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.

[转]在ROS下使用zeroconf配置多机通信的更多相关文章

  1. openvswitch vlan下的虚拟机与物理机通信

    1,安装openvswitch ,图形界面显示等用到的安装包. yum install libvirt openvswitch python-virtinst xauth tigervnc -y 2, ...

  2. ZED 相机 && ORB-SLAM2安装环境配置与ROS下的调试

    注:1. 对某些地方进行了更新(红色标注),以方便进行配置. 2. ZED ROS Wrapper官方github已经更新,根据描述新的Wrapper可能已经不适用与Ros Indigo了,如果大家想 ...

  3. ORB-SLAM2(2) ROS下配置和编译

    1配置USB相机 1.1网友参考: http://www.liuxiao.org/2016/07/ubuntu-orb-slam2-%E5%9C%A8-ros-%E4%B8%8A%E7%BC%96%E ...

  4. Ubuntu虚拟机+ROS+Android开发环境配置笔记

    Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...

  5. ROS入门笔记(二):ROS安装与环境配置及卸载(重点)

    ROS入门笔记(二):ROS安装与环境配置及卸载(重点) [TOC] 1 ROS安装步骤 1.1 ROS版本 ROS目前只支持在Linux系统上安装部署, 它的首选开发平台是Ubuntu. 发布时间 ...

  6. Linux下安装和配置JDK与Tomcat(升级版)

    在这个版本 Linux下安装和配置JDK与Tomcat(入门版) 的基础上优化升级 1.下载相关软件 apache-tomcat-6.0.37.tar.gz jdk-6u25-linux-i586-r ...

  7. Centos下安装和配置SVN

    1.安装SVN服务 #检查现有版本 rpm -qa subversion #如果存储旧版本,卸载旧版本SVN yum remove subversion #安装SVN yum install subv ...

  8. Win10下Android studio配置

    Win10下Android studio配置 一.安装Android Studio的准备工作 1.下载好JDK,去官网上找一个下载下来 2.安装JDK.并配置环境变量.安装过程:本人将使用的是jdk- ...

  9. LSD-SLAM深入学习(1)-基本介绍与ros下的安装

    前言 借鉴来自RGB-D数据处理的两种方法-基于特征与基于整体的,同样可以考虑整个图片的匹配,而不是只考虑特征点的…… 一般这种稠密的方法需要很大的计算量,DTAM: Dense tracking a ...

随机推荐

  1. centos6.5 更新python2.6.6至2.7.6

    1.查看当前Python版本    # python -V      Python 2.6.6  2.下载Python2.7.6源码    # wget http://python.org/ftp/p ...

  2. 调用个别f5 负载端口为80的vs时,返回值为空的问题

    现状: vs负载端口为80并添加XFF,pool包含2个member,member的monitor端口为80&9000. 故障现象: 应用同事描述说再完全复制了一个member并添加到pool ...

  3. Java复习整理 day01

    练习代码: 1 //这条语句说明这个Java文件在demo的包下 2 package demo1; 3 /** 4 * 5 * @author 王兴平 6 * 这个是第一个hello world 案例 ...

  4. postgres-网络传输安全-openssl

    网络传输安全 默认情况下pg服务端和客户端之间的数据传输是明文传输,有一定的安全隐患.pg中可以使用ssl进行安全的tcp/ip连接,以密文的形式进行数据的安全传输. 这个特性要求在客户端和服务器都安 ...

  5. 力扣643.子数组最大平均数I-C语言实现

    题目 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示例: 输入:[1,12,-5,-6,50,3], k = 4 输出:12.75 解释:最大平均数 (12-5- ...

  6. Scala集合库、模式匹配和样例类

    package com.yz8 import org.junit.Test class test { @Test def test: Unit = { val ints = List(1,5,7,6, ...

  7. Educational Codeforces Round 91 (Rated for Div. 2) C. Create The Teams

    题目链接:https://codeforces.com/contest/1380/problem/C 题意 给 $n$ 个数分组,要求每组的最小值乘以该组数的个数不小于 $x$ . 题解 从大到小依次 ...

  8. codeforces632D. Longest Subsequence (最小公倍数)

    You are given array a with n elements and the number m. Consider some subsequence of a and the value ...

  9. Chrome Switchs & Chrome Pref

    Chrome Switchs: https://chromium.googlesource.com/chromium/src/+/master/chrome/common/chrome_switche ...

  10. 升级到WLS2

    WLS2相对WSL1有重大改变,其中最重要的是subsystem linux可以说是真正意义上的linux发行版了,当然也提升了i/o性能. 1. 升级windows WSL 2 is only av ...