当前位置:   article > 正文

ROS-NetworkSetup_ros/networksetup

ros/networksetup

参考文献: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自己:

  1. ssh hal
  2. ping hal

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

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

从 marvin ping hal:

  1. ssh hal
  2. 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监听:

  1. ssh marvin
  2. netcat -l 1234

然后从hal建立连接:

  1. ssh hal
  2. 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:

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

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

  1. ssh artoo
  2. export ROS_HOSTNAME=10.0.0.1

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

2.2 单机配置

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

  1. $ export ROS_HOSTNAME=localhost
  2. $ export ROS_MASTER_URI=http://localhost:11311

2.3 配置/etc/hosts

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

  1. IPAddress Hostname Alias
  2. 127.0.0.1 localhost deep.openna.com
  3. 208.164.186.1 deep.openna.com deep
  4. 208.164.186.2 mail.openna.com mail
  5. 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

例如:

  1. ntpdate -q pi
  2. server 192.168.1.139, stratum 3, offset -0.124400, delay 0.02599
  3. 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

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

  1. /etc/init.d/chrony stop
  2. ntpdate other_computer_ip
  3. /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
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/244811
推荐阅读
相关标签
  

闽ICP备14008679号