赞
踩
参考文献:ROS/NetworkSetup
https://www.jianshu.com/p/da4745463026
ROS是一个分布式的计算机运行系统。一个ROS可能会包括成百上千个节点,而且这些节点分布在不同的电脑上,并且节点可能需要在任何时间与任何一个其他节点进行通信。
所以,ROS有一些网络部署需求:
master
,这个前面有说过,就是只需要在一台设备上运行roscore
指令。这里ssh hal
就是在登录到hal执行的意思,本来就在这个设备终端就不需要登录了。首先,hal 和 marvin在所有端口上需要有完全双向的连接。
我们可以通过ping来检查一下基本的连接设置。
在两台设备上分别ping自己:
- ssh hal
- ping hal
如果ping hal不成功,说明配置的不正确。下面的第二节讲怎么解决。
从 marvin ping hal:
- ssh hal
- ping marvin
还要试一下从hal ping marvin。
如果没办法ping通,说明两个设备之间互不可见。这个时候可以试一下ping对方的ip,如果ip也ping不通,说明网络有问题,要先设置一下网络,如果可以,那就也到下面的第二节配置一下。
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,下一节我们就来解决一下不能使用主机名通信的问题。
当一个ROS节点发布一个主题时,它提供了一个主机名+端口的组合(也就是URI),其他节点可以连接这个URI来订阅这个主题。保证这个主机名能够在任何时候被其他节点连接是很重要的一件事。ROS库使用发布主题的主机的主机名作为连接,这个名字可以从命令行得到。
如果一台设备广播的主机名对其他设备不可见,那就需要设置ROS_IP 和 ROS_HOSTNAME环境了。
还是用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语言的宏定义,这是我个人的理解,可以往下看。
如果只想在单机上面运行,可以使用下面的配置:
- $ export ROS_HOSTNAME=localhost
- $ export ROS_MASTER_URI=http://localhost:11311
另一个选择就是吧需要的条目添加到/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
,我增加了图片中第三行的内容,我就可以使用pi
来进行上面哪个连接测试了,不过登录的时候没办法使用ssh pi
,实际上是因为我不能使用ssh <IP>
这种形式。
如果设备有防火墙,或者其他障碍,我们需要创建一个虚拟网络来连接两个设备。这里建议使用openvpn(这一块的官方教程打不开,我也先放一下)。
尝试使用 roswtf and rqt_graph进行调试,也可以到论坛上找相关的问题。
实际上就是设备时间不同步,可以在一台设备上对另一台进行时间检查:
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孤立网络看这里.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。