ROS多机通信

在充分的单机学习测试之后,往往要进行真实机器人的测试,那么就要接触到多机通信的问题。ROS采用的分布式网络通信,只要正确的设置ROS_MASTER_URIROS_IP两个环境变量,就可以成功实现ROS的多机通信,有时我们也称之为主从机设置,但是在这里初学者往往因为没有深入理解ROS通信机制而产生问题,ROS Wiki的说明也比较笼统,但是需要先行阅读,后面我们详细说明在多机通信产生问题时如何处理。

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

ROS消息通信机制

我们简单梳理一下,在消息通信时,什么时候会用到ROS_MASTER_URIROS_IP这两个环境变量。

  • Talker启动,通过ROS_MASTER_URI连接到ROS Master,注册发布者的信息,包含所要发布的话题名称(bar)和消息类型;ROS Master会将该发布者的注册信息存储到发布者注册列表中,等待接收者。

  • Listener启动,通过ROS_MASTER_URI连接到ROS Master,将其订阅的话题名bar和消息类型在ROS Master上注册(实际上也包括自己的地址和端口信息)。

  • ROS Master根据Listener所需的订阅话题在发布者注册列表寻找与之匹配的话题,并返回Talker的XML-RPC地址信息,即foo:1234。Listener根据alker的XML-RPC地址向Talker请求TCP的连接地址,Talker的地址就是图中所示的foo:2345。其中foo就是在执行talker时的环境变量ROS_IP的。

因此,如果需要正确接收到Talker发布的消息,必须在Talker和Listener上都正确设置ROS_MASTER_URI,同时必须正确设置Talker的ROS_IP,一般情况下,都是双向互通,所以listener的ROS_IP也要正确设置。

最常见问题:可以看到消息列表,但是无法接收消息内容

  • https://answers.ros.org/question/349095/ros-on-multiple-machine-not-working-properly/#349098

如何进行多机通信

这是最困扰大家的一个问题,我们用robot和 ROS2GO 来代表机器人上的电脑和远程操控的电脑。那么首先大家能够在robot和ros2go上能够相互ping通(相互ping通,保证是在同网段),也可以使用ssh成功从ros2go端登录到robot。

多机通信大家一般都会知道在 ROS2GO 端将 ROS_MASTER_URI 设置为robot的ip,这样就可以成功的使用rostopic list看到话题列表。不过rostopic echo /foobar是看不到任何消息的(很大概率,也有例外,后面我们说明)。这个最主要的问题就是没有在robot上设置ROS_IP这个环境变量。

类似的,如果 ROS2GO 端的 ROS_IP 没有设置正确,可能发生在RViz中能够看到传感器的数据,但是发布2D Nav Goal而机器人完全没反应的状况。总结一下,如果能看到话题列表而没有话题内容,就是因为通讯是没问题的可以在ROS Master上注册,但是上报地址错了导致后面无法进行点对点通信。

安全可靠

全部用 IP 地址进行设置,ROS_MASTER_URIROS_IP都可以在.bashrc文件中设置。我们假设robot的IP地址为192.168.1.100,ros2go的ip地址为192.168.1.111,roscore在robot上启动(一般我们都是在robot上启动roscore)。

那么在robot上

export ROS_MASTER_URI=http://192.168.1.100:11311
export ROS_IP=192.168.1.100

在 ROS2GO 上

export ROS_MASTER_URI=http://192.168.1.100:11311
export ROS_IP=192.168.1.111

这样的设置是一定可以互通的。因为本地回环的存在,在robot上可以设置为

export ROS_MASTER_URI=http://localhost:11311
export ROS_IP=192.168.1.100

方便快捷

为了方便大家使用,我们不建议频繁在从机端的修改.bashrc文件,可以将ROS_MASTER_URI和ROS_IP的ip地址设置在外置脚本.ros_master.sh中。

touch .ros_master.sh && chmod +x .ros_master.sh

使用如下命令写入外置脚本.ros_master.sh中。

echo '## set $ROS_MASTER_URI and $ROS_IP for Multi Machine Communicate
export ROS_MASTER_URI=http://192.168.1.100:11311
IP=$(ip addr show wlan0 | grep -w inet | awk '{print $2}' | awk -F / '{print $1}')
export ROS\_IP=${IP}' >> ~/.ros_master.sh

使用方法

source ~/.ros_master.sh

如果需要修改ROS_MASTER_URI,只需要修改.ros_master.sh此脚本的export ROS_MASTER_URI=http://192.168.1.100:11311192.168.1.100为正确IP即可。

用正则截取相应设备IP

用IP进行设置确实不会出问题,但是只要更换网络或者设备的IP发生变化等,多机通信就失效了需要重新设置。在Linux系统中我们有多种方式可以获得当前的IP地址。以下都是设置ROS_IP的方式。

最简单的情况下,仅有ipv4地址时,可以如下设置

export ROS_IP=`hostname -I`

但是有ipv6的地址时,需要截取

export ROS_IP=`hostname -I | cut -d " " -f 1`

不过有多个ipv4地址的情况下,比如使用NVidia Jetson系列板卡,会虚拟出一个usb网络,那么不能够保证截取到正确的ipv4地址。
非常确定的要截取某个网络下的ipv4地址时,可以使用如下命令

IP=$(ip addr show wlan0 | grep -w inet | awk '{print $2}' | awk -F / '{print $1}')
export ROS\_IP=${IP}

这样可以截取wlan0网络下的ipv4地址,已经非常灵活通用。但是在网络未准备好的情况下,截取的内容是空,这时候启动roscore或者其他节点时会报如下错误:

invalid ROS_IP (an empty string)

这样虽然在启动roscore时会用hostname信息替代,但是节点启动时上报的ROS_IP信息为空,会导致节点间无法通信。需要将ROS_IP的设置注释掉,或者保证ROS_IP能拿到正确的地址。

设置hostname

当我们不设置ROS_IP的时候,实际上节点上传到ROS Master的地址是本机的hostname。使用rosnode info查看可以看到节点的地址类似于 http://ros2go:33333/

  • 为什么我们没有设置ROS_IP时,节点之间还是可以成功通信呢?

  • 原因是系统启动时会上报自己的hostname给路由器,路由器的dns可以在局域网内成功解析hostname,对应到正确的IP地址从而使得ROS实现多机通信。但是因为多种因素,路由器dns解析的成功率非常不靠谱。

最简单的hostname设置

路由器可以正确解析hostname,那么可以按照官方教程,仅设置/etc/hostname文件(实际上这个文件一般也都设置好了),写入hostname即可。如果可以起作用,那么我们不用设置ROS_IP,就可以实现多机通信。这种情况最大的问题就是不可靠,也是产生问题的根源。

强制解析

设置/etc/hosts文件,在文件中加入强制hostname和IP地址的对应关系。这样设置的问题和纯IP设置类似,在网络条件发生变化的时候还是要修改。好处是hostname可以有意义,比IP地址好记的多。

使用ROS2GO和Tianbot官方的设备时,我们已经将比较优化的设置写入了.bashrc,大家可以根据需要去掉注释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/758467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统——Mysql数据库操作

目录 一、数据库基本操作 1.查看数据库结构 1.1查看数据库信息——Show databases 1.2查看数据库中的表信息——Show tables Show tables in 数据库名 use 数据库名 show tables 1.3显示数据表的结构(字段)——Describe(Desc&#x…

HarmonyOS(鸿蒙)ArkUI组件

方舟开发框架(简称ArkUI)为HarmonyOS应用的UI开发提供了完整的基础设施,包括简洁的UI语法、丰富的UI功能(组件、布局、动画以及交互事件),以及实时界面预览工具等,可以支持开发者进行可视化界面…

8.【Linux】线程

进程与线程比较 具体参考 小林coding 线程的上下文切换 当两个线程是属于同一个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的栈、寄存器等不共享的数据。 当两个线程不属于同一个进程&…

iOS常见崩溃简介

1. 崩溃 多指在移动设备(如iOS、Android设备)中或不可移动设备(如:Windows、Linux等设备), 在打开或使用应用程序时出现的突然退出中断的情况(类似于Windows的应用程序崩溃)。 多表现为&#…

网络原理(3)——TCP协议

目录 一、连接管理 二、三次握手 1、何为三次握手? 2、三次握手有何意义? 三、四次挥手 三次握手和四次挥手的相似之处和不同之处 (1)相似之处 (2)不同之处 四、TCP的状态 建立连接: 断开…

【链表】算法例题

目录 八、 链表 57. 环形链表 ① 58. 两数相加 ② √ 59. 合并两个有序链表 ① √- 60. 随机链表的复制 ② 61. 反转链表II ② 62. K个一组翻转链表 ③ 63. 删除链表的倒数第N个结点 ② √- 64. 删除排序链表中的重复元素II ② √- 65. 旋转链表 ② √- 66. 分隔链…

安科瑞精密配电柜助力数据中心节能降耗

彭姝麟 Acrelpsl 1.趋势分析 能源支出作为数据中心运营的主要成本之一。清华大学能源互联网创新研究院常务副院长高文胜曾在公开场合指出,随着我国数据中心能源消耗的逐年攀升,电费支出约占数据中心年运营成本的95%。加之“双碳”战略的出台&#xff0c…

SkyWalking上报Java应用数据

重要 本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。 通过SkyWalking为应用埋点并上报链路数据至可观测链路 OpenTelemetry 版后,可观测链路 OpenTelemetry 版即可开始监控应用,您可以…

cyclictest 交叉编译报错---rt_numa.h:18:10: fatal error: numa.h: 没有那个文件或目录

cyclictest 主要是用于测试系统延时,进而判断系统的实时性 使用版本 rt-tests-2.6.tar.gz numactl v2.0.16 问题 编译时,需要先编译 numactl ,不然会有以下报错: arm-linux-gnueabihf-gcc -D VERSION2.6 -c src/cyclictest/c…

软考 网工 每日学习打卡 2024/3/19

学习内容 第8章 网络安全 本章主要讲解网络安全方面的基础知识和应用技术。针对考试应该掌握诸如数据加密、报文认 证、数字签名等基本理论,在此基础上深入理解网络安全协议的工作原理,并能够针对具体的 网络系统设计和实现简单的安全解决方案。 本章共有…

Day22初识集合

Day22初识集合 一、集合 1、概念: 集合是指将多个元素组合在一起的数据结构。在编程中,集合用于存储和操作一组相关的数据对象。与数组相比,集合具有更灵活、动态和高级的功能。 2、常见的集合类: List(列表&#x…

sentry-cli - error: Failed to load .sentryclirc file from project path

Xcode 15.2 warning sentry-cli - error: Failed to load .sentryclirc file from project path (/Users/zhuhongwei/Desktop/pandabill/.sentryclirc)推荐一下刚上线的 App 熊猫小账本,里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App,用于…

1、鸿蒙学习-为应用/服务进行签名

针对应用/服务的签名,DevEco Studio为开发者提供了自动签名方案,帮助开发者高效进行调试。也可选择手动方式对应用/服务进行签名,如果使用了需要ACL的权限,需采用手动方式进行签名。 自动签名 说明 使用自动签名前,请…

闭包机制的底层实现原理

说明:此次分享不涉及ES6的let,const,块级作用域,这些其实都是对本次分享内容的扩展。 闭包的重要性 JS的内功心法,闭包是JavaScript中非常重要的核心概念,关系着JS里很多核心的机制,理解了它,很多问题都会迎刃而解,不理解闭包用JS永远像隔着一层窗户纸。 前端发展日新…

【MySQL】学习和总结使用列子查询查询员工工资信息

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-5odctDvQ0AHJJc1C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

中国(京津冀)太阳能光伏推进大会暨展览会

中国(京津冀)太阳能光伏推进大会暨展览会是一个旨在促进太阳能光伏产业的发展的重要活动。该活动旨在加大对太阳能光伏的投资和支持,推动太阳能光伏技术的创新和应用,促进太阳能光伏产业的规模化发展。 此次大会暨展览会将为太阳能光伏行业相关企业提供一…

【Linux】Linux基本开发工具(yum) (vi/vim)的使用

本文章内容: 学习yum工具,进行软件安装掌握vim编辑器使用 Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成…

es 聚合操作(一)

前言 Elasticsearch除搜索以外,提供了针对ES 数据进行统计分析的功能。聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 衣服品牌的受欢迎程度这些衣服的平均价格、最高价格、最低价格这些衣服的每天、每月销量如何 使用…

产品推荐 | 基于Xilinx Zynq UltraScale+打造的仙女座 Andromeda FPGA核心板

1、产品概述 仙女座Andromeda XZU65片上系统(SoC)核心板通过结合高端Xilinx Zynq UltraScale™ MPSoC系列芯片和高速DDR4 ECC SDRAM、eMMC flash、双QSPI flash、双Gigabit Ethernet PHY、USB 3.0形成了一个完整的、功能强大的嵌入式处理系统。得益于大…