在多台PC上进行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的程度(完全自主或用户验证)



 

 

zhangrelay CSDN认证博客专家 不合格高校讲师
LoveRobot,Go!!!!人工智能和机器人粉,从事机器人工程专业本科教学和科研工作,研究方向包括多机器人仿真技术,控制与协作,机器人系统软硬件开发等。
已标记关键词 清除标记
相关推荐
Exbot易科机器人实验维护书籍,提供学习镜像包括indigo和kinetic等,努力为ROS爱好者和开发人员提供力所能及的服务。 本书第2版概括性地介绍了ROS系统的各种工具。ROS是一个先进的机器人操作系统框架,现今已有数百个研究团体和公司将其应用在机器人行业中。对于机器人技术的非专业人士来说,它也相对容易上手。在本书中,你将了解如何安装ROS,如何开始使用ROS的基本工具,以及最终如何应用先进的计算机视觉和导航工具。 在阅读本书的过程中无需使用任何特殊的设备。书中每一章都附带了一系列的源代码示例和教程,你可以在自己的计算机上运行。这是你唯一需要做的事情。 当然,我们还会告诉你如何使用硬件,这样你可以将你的算法应用到现实环境中。我们在选择设备时特意选择一些业余用户负担得起的设备,同时涵盖了在机器人研究中最典型的传感器或执行器。 最后,由于ROS系统的存在使得整个机器人具备在虚拟环境中工作的能力。你将学习如何创建自己的机器人并结合功能强大的导航功能包集。此外如果使用Gazebo仿真环境,你将能够在虚拟环境中运行一切。第2版在最后增加了一章,讲如何使用“Move it!”包控制机械臂执行抓取任务。读完本书后,你会发现已经可以使用ROS机器人进行工作了,并理解其背后的原理。 主要内容 第1章介绍安装ROS系统最简单的方法,以及如何在不同平台上安装ROS,本书使用的版本是ROS Hydro。这一章还会说明如何从Debian软件包安装或从源代码进行编译安装,以及在虚拟机和ARM CPU中安装。 第2章涉及ROS框架及相关的概念和工具。该章介绍节点、主题和服务,以及如何使用它们,还将通过一系列示例说明如何调试一个节点或利用可视化方法直观地查看通过主题发布的消息。 第3章进一步展示ROS强大的调试工具,以及通过对节点主题的图形化将节点间的通信数据可视化。ROS提供了一个日志记录API来轻松地诊断节点的问题。事实上,在使用过程中,我们会看到一些功能强大的图形化工具(如rqt_console和rqt_graph),以及可视化接口(如rqt_plot和rviz)。最后介绍如何使用rosbag和rqt_bag记录并回放消息。 第4章介绍ROS系统与真实世界如何连接。这一章介绍在ROS下使用的一些常见传感器和执行器,如激光雷达、伺服电动机、摄像头、RGB-D传感器、GPS等。此外,还会解释如何使用嵌入式系统与微控制器(例如非常流行的Arduino开发板)。 第5章介绍ROS对摄像头和计算机视觉任务的支持。首先使用FireWire和USB摄像头驱动程序将摄像头连接到计算机并采集图像。然后,你就可以使用ROS的标定工具标定你的摄像头。我们会详细介绍和说明什么是图像管道,学习如何使用集成了OpenCV的多个机器视觉API。最后,安装并使用一个视觉里程计软件。 第6章将展示如何在ROS节点中使用点云库。该章从基本功能入手,如读或写PCL数据片段以及发布或订阅这些消息所必需的转换。然后,将在不同节点间创建一个管道来处理3D数据,以及使用PCL进行缩减采样、过滤和搜索特征点。 第7章介绍在ROS系统中实现机器人的第一步是创建一个机器人模型,包括在Gazebo仿真环境中如何从头开始对一个机器人进行建模和仿真,并使其在仿真环境中运行。你也可以仿真摄像头和激光测距传感器,为后续学习如何使用ROS的导航功能包集和其他工具奠定基础。 第8章是两章关于ROS导航功能包集中的第1章。该章介绍如何对你的机器人进行使用导航功能包集所需的初始化配置。然后用几个例子对导航功能包集进行说明。 第9章延续第8章的内容,介绍如何使用导航功能包集使机器人有效地自主导航。该章介绍使用ROS的Gazebo仿真环境和rviz创建一个虚拟环境,在其中构建地图、定位机器人并用障碍回避做路径规划。 第10章讨论ROS中移动机器人机械臂的一个工具包。该章包含安装这个包所需要的文档,以及使用MoveIt!操作机械臂进行抓取、放置,简单的运动规划等任务的演示示例。 预备知识 我们写作本书的目的是让每位读者都可以完成本书的学习运行示例代码。基本上,你只需要在计算机上安装一个Linux发行版。虽然每个Linux发行版应该都能使用,但还是建议你使用Ubuntu 12.04 LTS。这样你可以根据第1章的内容安装ROS Hydro。 对于ROS的这一版本,你将需要Ubuntu 14.04之前的版本,因为之后的版本已经不再支持Hydro了。 对于硬件要求,一般来说,任何台式计算机或笔记电脑都满足。但是,最好使用独立显卡来运行Gazebo仿真环境。此外,如果有足够的外围接口将会更好,因为这样你可以连接几个传感器和执行器,包括摄像头和Arduino开发板。 你还需要Git(git-core Debian软件包),以便从本书提供的源代码中复制库。同样,你需要具备Bash命令行、GNU/Linux工具的基本知识和一些C/C++编程技巧。 目标读者 本书的目标读者包括所有机器人开发人员,可以是初学者也可以是专业人员。它涵盖了整个机器人系统的各个方面,展示了ROS系统如何帮助完成使机器人真正自主化的任务。对于听说过却从未使用过ROS机器人专业学生或科研人员来说,本书将是非常有益的。ROS初学者能从本书中学习ROS软件框架的很多先进理念和工具。不仅如此,经常使用ROS的用户也可能从某些章节中学习到一些新东西。当然,只有前3章是纯粹为初学者准备的,所以那些已经使用过ROS的人可以跳过这部分直接阅读后面的章节。
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页