当前位置:   article > 正文

在多台PC上进行ROS通讯(在多台远程机器人或电脑上运行ROS)-学习笔记_ros怎么订阅其他电脑的话题

ros怎么订阅其他电脑的话题

首先,致谢易科(ExBot)ROSWiki中文社区

主要有两种类型:局域网和因特网。(2019年4月更新)

局域网

 

广域网

 

通过网页快速了解Linux(Ubuntu

和ROS机器人操作系统,请参考实验楼在线系统如下:

初级教程可参考:https://www.shiyanlou.com/courses/854 邀请码:U23ERF8H

中级教程可参考:https://www.shiyanlou.com/courses/938 邀请码:U9SVZMKH


重要参考文献:

 

Running ROS across multiple machines

http://wiki.ros.org/ROS/Tutorials/MultipleMachines

ARM端和PC端ROS通讯

http://www.roswiki.com/read.php?tid=312&fid=9


首先,配置主PC机(master):

修改IP地址等,

$ hostname  //可以查看主机名

$ hostname rosxx  //临时修改主机名

$ sudo gedit /etc/hosts

在文件中添加PC(listener)地址,如:

192.168.3.201  ros1  //pc1 hostname

192.168.3.202  ros2  //pc2 hostname

具体如下图所示:

然后,修改bashrc

$ gedit ~/.bashrc

在最下端添加:

export ROS_HOSTNAME=RelayBot-CSLG
export ROS_MASTER_URI=http://192.168.3.200:11311

如下图所示:

添加完成后,注销重新登陆一下。

 

PC-ros1:

ros1类似,具体如下图所示:

 

PC-ros2:

在ros2配置与ros1类似,不详细上图,配置完成后。

在主PC启动roscore,然后启动openni2,在ros2下,启动rqt_image_view,就可以看到camera视频,

如下图所示。

在主PC或ros1,ros2都可以用rostopic list。

ros2笔记本上有usb摄像头,这里注意格式mjpeg还是yuyv等,在ros2启动usb_cam

在主PC可以看到,如下图所示的结果:

 

也可以由主机启动节点,控制ros1,ros2的Arduino底盘运动等,这里需要注意所有PC上的node不能重名,

可以远程键盘控制小车运动等。


参考原文:http://wiki.ros.org/ROS/Tutorials/MultipleRemoteMachines

在多台REMOTE机器上运行ROS

描述:本教程扩展了之前的教程(跨多台机器运行ROS),以包括对远程ROS网络的讨论。该教程侧重于多台计算机通过同一本地网络连接的情况,即它们都共享相同的公共IP地址(参见下面的图2)。这将讨论扩展到远程联网的机器,即通过单独的互联网热点相互连接的机器,或者每台机器都有自己的公共IP地址(见图3)。


概观

本教程介绍了ROS范围之外的问题,例如Internet协议,网络,调制解调器设置,ISP问题等。本节简要介绍这些问题及其重要性的快速回顾。

 

ROS网络

正如之前的教程中所讨论的,ROS是为分布式计算而设计的,其中许多连接组件(机器人,计算机,移动设备等)如此处所示联网。

rosnet.png

图1:ROS网络

由于所有这些组件共享相同的调制解调器(或热点),它们形成本调制解调器的本地网络,因此该网络被称为本地 ROS网络,其中所有连接的组件具有相同的公共IP地址,这是调制解调器的IP地址。在调制解调器处阻止每个远程查询(从Internet)到该网络的任何组件。这是Internet和安全协议的基本特性,可保护本地组件免受黑客攻击和其他威胁。

localip.png

图2:本地ROS网络

在本地ROS网络中,每个组件都使用其唯一的本地IP地址进行标识(参见图2)。这些是用于在多个本地计算机上运行ROS的IP地址,如上一个教程中所述

 

远程ROS网络

在许多机器人应用中,例如室外机器人,需要机器人覆盖大面积区域并与操作员分开。例子包括农业机器人,搜救机器人等。在这些情况下,机器人和操作员可能不共享相同的调制解调器(或互联网热点),而是分别连接到互联网,然后彼此远程连接。此设置称为远程 ROS网络。

remoteip.png

图2:远程ROS网络

图2还显示了远程ROS网络的挑战。我们不能再使用本地IP地址(如上一个教程中所建议的)来识别组件,因为每个组件都驻留在单独的本地网络中。此外,我们也不能使用他们的公共IP地址,因为这些IP地址是指他们的调制解调器而不是他们的组件。

例如,如果图2中的笔记本电脑试图使用机器人的公共IP地址联系机器人,则无法这样做,因为该IP地址是指机器人的调制解调器而不是机器人本身,反之亦然。

因此,需要将该连接从调制解调器转发到其内部组件,从而促进ROS 的要求,从而建立成功的远程ROS网络。这带来了对PortForwarding的需求

 

PortForwarding(PF)

已经有许多方法来建立远程ROS网络,其中一些包括云机器人,第三方Web解决方案,Android和/或组合。可以在此处找到对这些努力的广泛回顾。本教程重点介绍如何使用PortForwarding作为启用远程ROS网络的工具。PortForwarding比其他方法有其优点和局限性。这些总结如下:

 

PortForwarding的优点

基于云的解决方案通过云传输ROS消息的内容来促进远程ROS网络。这需要双向数据转换,或者rosmsg-webformat-rosmsg桥接每个 rosmsg通过云传输。

一个简单的调用者/监听器应用程序包含很少的rosmsgs,因此它可能需要很少的桥梁,但复杂的户外机器人应用程序可能包含数百甚至数千个rosmsgs,每个rosmsgs都需要通过云传输单个

  • cloudVsPF.png

图4:用于远程ROS网络的PortForwarding与基于云的解决方案

此外,如果对系统进行任何更改或修改(引入新的传感器,修改机器人硬件等),也需要新的桥接器

端口转发提供了另一种方法,如图4所示,它打开了一个远程ROS-to-ROS连接,可以远程传输应用程序中的所有rosmsgs,无需任何转换或桥接。PF还支持任何未来的系统更改或更新。

 

PortForwarding的挑战(以及如何克服它们)

不幸的是,Portforwarding的使用有其局限性,但可以管理这些限制:

  1. 如下所示,PF需要事先了解网络组件的所有公共IP地址。如果这些IP地址动态变化(由ISP设置),则这还有问题。但是,本教程提供了一个管理此问题的解决方案。
  2. 实现PF是多层次的过程,涉及ISP,调制解调器/路由器设置,操作系统配置,ROS本身内的设置以及顺序的设置。这使得设置和故障排除成为一项挑战,尤其对初学者而言。
  3. 并非所有ISP都允许或支持PF的使用,那些可能需要许可/特殊访问权限的ISP。

下一节将详细介绍配置,故障排除和克服为远程ROS网络实施PortForwarding所面临的挑战所需的步骤。

 

配置/故障排除步骤

按给定顺序处理以下步骤非常重要:ISP =>调制解调器=>操作系统=> ROS =>动态IP。后续步骤中的某些设置取决于先前步骤的成功实施。对于某些人来说,以下步骤可能听起来微不足道/多余,但为了获得最佳效果,建议您按照此处的建议执行操作。以下部分显示配置/故障排除步骤的概要/摘要。有关屏幕截图和说明的详细逐行步骤,请参阅随附的文章。(此后,这将被称为“论文”)

 

第1步:ISP设置

配置步骤:

  1. 与您的提供商/网络管理员确认您的网络支持/允许/启用了PF。
  2. 可选(但建议):获取调制解调器的固定公共IP地址。

验证步骤(验证您的网络上是否允许PF 

  1. 除了您的提供商/管理员确认允许/启用PF之外,此处无需验证。
  2. 验证后,继续执行步骤2

 

第2步:调制解调器/路由器设置

在此阶段,您的ISP启用/允许Portforwarding,接下来我们需要配置调制解调器,以便允许远程查询转发到您的机器人(或ROS网络中的其他组件,见图1和图3)

配置步骤:

  1. 在您的浏览器/应用程序上,登录您的调制解调器,导航到防火墙设置=>启用端口转发,DMZ和其他过滤设置

  2. 可选(但建议):设置本地IP地址和端口范围(有关详细信息,请参阅“纸张”)

  3. 对该远程网络的每台机器的每个调制解调器重复此步骤(参见图3)

routerpf.png

图5:PortForwarding的调制解调器配置

验证步骤(验证您的调制解调器/路由器是否成功允许PF):

  1. 首先确保您的连接已启动,打开浏览器并连接到互联网
  2. 选择1024到65000之间的端口号
  3. 在所选端口上托管netcat聊天会话(nc -l portNumber)
  4. 在浏览器上,打开PortChecker网站并检查所选portNumber的状态

  5. 如果状态为OPEN,则表示此步骤已完成,并且您已在调制解调器上成功启用PF
  6. 验证后,即可继续执行步骤3

 

第3步:操作系统(Linux)设置

在此阶段,您的ISP已允许/启用Portforwarding,并且您的调制解调器/路由器已正确配置为将查询转发到您的计算机。接下来,我们需要配置您的系统,以便根据ROS 网络要求识别远程ROS网络的所有成员并与之交互(参见图1和图3)。对远程ROS网络的每个成员(机器人,笔记本电脑等)进行以下步骤。

现在,让我们假设所有公共/本地IP地址都是固定的。固定的公共IP可以由ISP授予,固定的本地IP在调制解调器的主页中定义/保留。动态IP将在稍后介绍。

配置步骤:

  1. hosts文件中,定义ROS网络中所有组件的所有公共/本地IP地址和主机名。

  2. 可选(但建议):定义尽可能多的定义,无论是本地/远程网络,还是固定/移动调制解调器等(参见图6)

hosts_actual2.png

图6:多个网络配置的主机定义

验证步骤(验证主机是否为PF正确定义):

要验证主机名和IP地址是否已正确配置,我们将使用三个测试; Ping测试,SSH测试和netcat测试。选择这些测试来验证ROS网络要求是否满足,即:1)每个成员可以通过其IP 公共地址(Ping)识别网络中的所有其他成员,2)每个成员可以访问网络中的其他成员( SSH),以及3)每个成员可以充当网络中的服务器和/或客户端(netcat)。

  • Ping测试

  • 在家庭计算机之一的网络成员之一打开终端
  • 运行:ping otherMemberHostName,如hosts文件中所定义,(例如:ping turtlebot)
  • 如果Ping测试OK,则从另一侧运行相同的测试
  • 如果所有成员都可以,那么继续进行SSH测试。
  • SSH测试

  • 在家庭计算机之一的网络成员之一打开终端
  • 从本机到机器人的SSH,使用其主机名或IP地址(在hosts文件中定义)
  • 如果SSH测试正常,则从另一侧运行相同的测试
  • 如果所有成员都可以,那么继续进行netcat测试。
  • netcat测试

  • 在家庭计算机之一的网络成员之一打开终端
  • 从家用计算机启动netcat会话(选择一个portNumber,然后运行:nc -l portNumber)
  • 在笔记本电脑上,在同一端口上启动netcat会话,并交换一些快速消息
  • 如果消息双方成功读取和接收,则netcat测试OK。
  • 从机器人的计算机重复进程(在那里主持会话),并验证它也没问题
  • 如果验证的所有成员都可以作为主机和/或客户端,则继续执行步骤4。

 

第4步:ROS设置

在此阶段,您的ISP已启用/允许PF,您的调制解调器/路由器已正确配置,并且您的网络的每个成员都已配置为通过PortForwarding远程识别并与网络的所有其他成员进行交互。接下来,我们需要在每台机器中配置ROS以方便远程ROS nework。之前的教程从这一点开始。配置步骤:

  1. 在网络的ROSmaster成员中,打开终端...

  2. 运行此命令:export ROS_MASTER_URI = ROSmaster_local_IP:11311(将ROSmaster_local_IP替换为ROSmaster机器的本地 IP地址)

  3. 在网络的所有其他组件中,打开终端......
  4. 运行此命令:export ROS_MASTER_URI = ROSmaster_public_IP:11311(将ROSmaster_public_IP替换为ROSmaster计算机的公共 IP地址)

现在,远程网络中的每台机器都知道哪台机器是ROSmaster,这是ROS网络要求的另一个要求。

验证步骤:

再一次,将进行三次测试以验证所有配置是否正确,并且再一次,这些测试将在远程ROS网络的每个成员上运行。

  • 最小网络测试(验证ROSmaster是否被大家认可)

  • 至于每个成员都可以识别ROSmaster,在确保所有先前的STEPS成功后,转到ROSmaster机器,并运行:roscore

  • 这将启动一个ROS会话,应该被远程ROS网络的所有成员识别。
  • 在网络的任何成员中,打开终端并运行:rostopic列表

  • 如果一切正常,那么您应该从ROSmaster启动的会话中看到ROS主题列表。由于网络连接,可能会导致命令结果延迟
  • 重复远程网络的所有成员
  • 如果正常,请继续进行Talker / Listener测试。
  • 讲话者/听者测试(验证所有成员可以充当服务器/客户端)

  • 会话仍在运行时,从网络的任何成员启动Talker。
  • 在网络的任何其他成员中,启动监听器,并查看是否成功发送/接收了消息
  • 重复测试,但反转Talker和Listener
  • 对所有网络成员重复,
  • 如果所有成员都可以,那么继续进行机器人交互测试。
  • 机器人交互测试(用实际机器人验证)

如果到目前为止一切正常,那么恭喜,远程ROS网络正在通过PortForwarding运行!接下来,您需要通过使用真实机器人进行测试来进一步验证它。以Turtlebot的互动为例。

  • 在机器人的机器上,启动机器人(或者你可以从你的家用电脑ssh到它,然后把它拿出来)
  • 从家用计算机启动可视化,键盘遥控器和其他组件。
  • 使用家用计算机的键盘,远程操作机器人。
  • 如果一切顺利,机器人应该通过远程网络接收命令并相应地移动
  • 此外,机器人应该通过远程网络返回其可视化(甚至其生命片段)。

 

第4步:管理动态更改的IP

某些ISP可能无法向订户提供固定的公共IP。相反,它们会为其IP提供一系列值,例如173.17.XXX.XXX,其中XXX的范围可以从000到255.这显然会使上面讨论的设置和配置步骤复杂化,因为步骤2到4需要每次更改IP地址时都会重新访问。解决方案是通过使用环境脚本和云解决方案(具有讽刺意味!)自动执行此步骤,如图7所示。

auto_graph2.png

图7:自动更新IP以克服动态IP地址

当前的IP定义(类似于hosts文件中的定义)将存储在云存储设施中,例如Dropbox或其他。每个成员都可以访问该文件,并可以读取/写入该文件。ROSmaster中的环境脚本将检查当前的IP值并通过网络自动更新配置。自治程度可由用户定义。


配置步骤(自动更新IP地址)

实际的脚本和进一步的讨论可以在论文(及其随附的Github页面)中找到,以下是自动更新算法和逻辑。

  1. 启动ROSmaster计算机后,将运行主脚本,执行以下操作:
    1. 检查计算机的当前公共IP地址
    2. 将IP地址与存储在云中hosts文件中的值进行比较。

    3. 如果值相同,则退出(不需要更改/更新)
    4. 如果值不同,则更新PF设置
      1. 更新主机

      2. 更新ROSmaster_Public_IP和ROSmaster_Local_IP
      3. 在存储设施的文件中更改值后,将通知网络中的所有成员。
      4. 这会触发所有成员计算机中的环境scipts以相应地更新值。

可以通过tweeking脚本(以及注释/取消注释某些特定行)来定义Autonomy的程度(完全自主或用户验证)



 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/657120
推荐阅读
相关标签
  

闽ICP备14008679号