ROS-NetworkSetup

转载 2018年04月17日 16:54:56

参考文献:ROS/NetworkSetup

https://www.jianshu.com/p/da4745463026
ROS是一个分布式的计算机运行系统。一个ROS可能会包括成百上千个节点,而且这些节点分布在不同的电脑上,并且节点可能需要在任何时间与任何一个其他节点进行通信。
所以,ROS有一些网络部署需求:

  • 1 每对设备所有端口之间都需要有完整的双向的连接
  • 2 每个设备都需要给自己声明一个其他设备能够识别的名字
    下面假设你可以在两台设备上运行ROS,并且主机名和IP如下:
  • marvin.example.com : 192.168.1.1
  • hal.example.com : 192.168.1.2
    需要注意的是,我们只需要在其中一台设备上运行一个master,这个前面有说过,就是只需要在一台设备上运行roscore指令。这里ssh hal就是在登录到hal执行的意思,本来就在这个设备终端就不需要登录了。

1 完全连接

首先,hal 和 marvin在所有端口上需要有完全双向的连接。

1.1 基本设置检查1:ping自己

我们可以通过ping来检查一下基本的连接设置。
在两台设备上分别ping自己:

ssh hal
ping hal

如果ping hal不成功,说明配置的不正确。下面的第二节讲怎么解决。

基本设置检查:ping另一个设备

从 marvin ping hal:

ssh hal
ping marvin

还要试一下从hal ping marvin。
如果没办法ping通,说明两个设备之间互不可见。这个时候可以试一下ping对方的ip,如果ip也ping不通,说明网络有问题,要先设置一下网络,如果可以,那就也到下面的第二节配置一下。

1.3 进一步检查:netcat

ping只是检查了ICMP包(ICMP是“Internet Control Message Protocol”(Internet控制报文协议)的缩写)可以再两台设备之间传输,但是这还不够。我们还需要确保两台设备所有端口都是可以通通信的。这是很难做到的一件事,因为端口多达65K个,我们没办法一个一个检查。
我们可以使用netcat选择任选一个端口去尝试通信,替代对所有端口进行一个完整的检查。要注意使用大于1024的端口,因为低于1024的端口需要管理员权限。netcat在某些地方执行时可能简称为nc。
首先尝试从hal 到 marvin的连接,在marvin上启动一个netcat监听:

ssh marvin
netcat -l 1234

然后从hal建立连接:

ssh hal
netcat marvin 1234

如果可以连接成功,你在一个端口输入一些字符,回车,另一个窗口就可以接收到。然后,再反过来测试一下,在另一台设备上监听,看能否正常通信。这里主机名也可以替换成ip,下一节我们就来解决一下不能使用主机名通信的问题。

2 主机名解析

当一个ROS节点发布一个主题时,它提供了一个主机名+端口的组合(也就是URI),其他节点可以连接这个URI来订阅这个主题。保证这个主机名能够在任何时候被其他节点连接是很重要的一件事。ROS库使用发布主题的主机的主机名作为连接,这个名字可以从命令行得到。

2.1 设置一个显式的主机名

如果一台设备广播的主机名对其他设备不可见,那就需要设置ROS_IP 和 ROS_HOSTNAME环境了。

2.1.1 示例

还是用marvin和hal这两个例子,现在我们加入第三台设备,就叫它artoo,使用一个DHCP地址,假设是10.0.0.1吧,其他设备是没办法把artoo解析成这个ip的。
在这种情况下,marvin和hal都没办法通过名字ping通artoo。所以他们也没办法连接artoo上面运行的节点。解决的方法就是,在artoo上面运行一个节点之前,在环境中配置好ROS_IP:

ssh 10.0.0.1  #我们没办法通过名字去ssh(这里说明一下,我进行这一步的时候,用的是 `ssh 用户名@IP`的形式,直接登录不行,这个以后再研究)
export ROS_IP=10.0.0.1

还有一个可能发生的问题,就是虽然一个设备的名字可以被解析了,但是这个设备不知道自己的名字。换句话说,artoo可以被解析成10.0.0.1,但是运行指令hostname返回的是localhost,这时候我们需要设置一下ROS_HOSTNAME:

ssh artoo
export ROS_HOSTNAME=10.0.0.1

其实这样配置完之后还是有问题,实际上要在一台电脑上,设置另一台电脑的IP和主机名的对应关系才行,相当于c语言的宏定义,这是我个人的理解,可以往下看。

2.2 单机配置

如果只想在单机上面运行,可以使用下面的配置:

$ export ROS_HOSTNAME=localhost
$ export ROS_MASTER_URI=http://localhost:11311

2.3 配置/etc/hosts

另一个选择就是吧需要的条目添加到/etc/hosts文件中,注意需要管理员权限才能编辑。这个文件会告诉电脑如何转换名字和IP。
当我们的电脑启动的时候,它需要在DNS解析之前,知道一些主机名和IP的对应关系。这个对应关系就保存在/etc/hosts文件里面,在没有名称服务器的时候,系统上的网络程序都会参考这个文件解析主机名和IP。
下面是个例子:

           IPAddress                     Hostname            Alias
           127.0.0.1            localhost        deep.openna.com
           208.164.186.1        deep.openna.com      deep
           208.164.186.2        mail.openna.com      mail
           208.164.186.3        web.openna.com       web
           

前两列不用解释,最后一列是别名,可以没有。配置完了之后,重启网络生效,实际上我发现不重启也会立即生效。

qking

我的主机叫qking,我增加了图片中第三行的内容,我就可以使用pi来进行上面哪个连接测试了,不过登录的时候没办法使用ssh pi,实际上是因为我不能使用ssh <IP>这种形式。

3 防火墙怎么办

如果设备有防火墙,或者其他障碍,我们需要创建一个虚拟网络来连接两个设备。这里建议使用openvpn(这一块的官方教程打不开,我也先放一下)。

4 调试网络问题

尝试使用 roswtf and rqt_graph进行调试,也可以到论坛上找相关的问题。

5 时间同步问题,TF可能提示时间在未来

实际上就是设备时间不同步,可以在一台设备上对另一台进行时间检查:

ntpdate -q other_computer_ip

例如:

ntpdate -q pi
server 192.168.1.139, stratum 3, offset -0.124400, delay 0.02599
10 Oct 14:12:26 ntpdate[5742]: no server suitable for synchronization found

如果有时间差,安装chrony(sudo apt-get install chrony),然后编辑它的配置文件(/etc/chrony/chrony.conf),在一台设备上,把另一台设备设置为服务器。例如,在PR2上面,电脑C2就是从C1获取时间的,因此C2的配置文件中有以下内容:

server c1 minpoll 0 maxpoll 5 maxdelay .05

然后设备会将自己的时间慢慢地调整到服务器时间。如果时间差别比较大的话,你可以命令他立刻同步时间:

/etc/init.d/chrony stop
ntpdate other_computer_ip
/etc/init.d/chrony start

但是大的时间跳跃可能会导致未知的问题,所以不是有需要的话,不建议采取这种方式。

下面这一点看不太懂,大概是两种没有参考时间的时间同步方式。

If you are using wifi and are not getting any synchronisation try to set maxdelay higher (should be bigger than the expected round-trip delay没有时间同步的WiFi网络看这里). For isolated networks look here孤立网络看这里.



作者:Savior2016
链接:https://www.jianshu.com/p/da4745463026
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ntpdate脚本

service ntpd stop ntpdate -b 172.16.55.254 service ntpd start 其实一直对系统时间的设置模模糊糊的,今天我们大家就来讨论一下这个ntpdat...
  • zhuying_linux
  • zhuying_linux
  • 2011-08-02 10:55:20
  • 3977

使用ntpdate更新系统时间

ntpd、ntpdate的区别 使用之前得弄清楚一个问题,ntpd与ntpdate在更新时间时有什么区别。ntpd不仅仅是时间同步服务器,他还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步...
  • suer0101
  • suer0101
  • 2012-08-15 14:50:41
  • 112162

解决CentOS7下用ntpdate同步时间问题

环境:最小化安装centos7.1 问题:使用ntpdate同步时间,一直不成功,报错误no server suitable for synchronization found。只是使用ntpdat...
  • qq_27754983
  • qq_27754983
  • 2017-04-06 11:26:47
  • 7719

使用ntpdate同步时间

1.安装ntpdate  yum install ntpdate 2.sudo ntpdate -u 133.100.11.8 //同步到日本的服务器时间 3.ntpdate –d 13...
  • qq_31820885
  • qq_31820885
  • 2017-09-20 10:35:56
  • 246

NTP客户端时间同步的脚本

http://xinggm.iteye.com/blog/940885 #!/bin/sh #ntpupdate.sh #set you ntpserver ip address NTPSE...
  • suer0101
  • suer0101
  • 2012-08-14 16:42:40
  • 3711

Linux下ntpdate时间同步

Linux下ntpdate时间同步Ntp服务器安装配置RedHat服务器可以下载rpm安装包,然后执行# rpm -ivh ntp-4.2.0.a.20040617-4.x86_64.rpm时间同步方...
  • mergerly
  • mergerly
  • 2011-01-07 11:31:00
  • 7128

客户端与服务端的时间一致性的解决

  • qq_36592808
  • qq_36592808
  • 2017-01-08 20:46:51
  • 397

Centos7配置ntp时间服务器

Centos7配置时间服务器,假如配置一个服务端,N个客户端: 服务端: 1、安装ntp服务 yum install ntp ntpdate -y 2、查找当前地区,最适合的时间服务器 ...
  • zzy5066
  • zzy5066
  • 2018-01-11 17:31:16
  • 96

ROS-NetworkSetup

参考文献:ROS/NetworkSetuphttps://www.jianshu.com/p/da4745463026ROS是一个分布式的计算机运行系统。一个ROS可能会包括成百上千个节点,而且这些节...
  • qq_32115101
  • qq_32115101
  • 2018-04-17 16:54:56
  • 11

Linux NTP配置详解 (Network Time Protocol)

Network Time Protocol (NTP) 也是RHCE新增的考试要求. 学习的时候也顺便复习了一下如何设置Linux的时间,现在拿出来和大家分享 设置NTP服务器不难但是NTP本身是一...
  • iloli
  • iloli
  • 2011-05-19 12:04:00
  • 154482
收藏助手
不良信息举报
您举报文章:ROS-NetworkSetup
举报原因:
原因补充:

(最多只允许输入30个字)