集群多机ROS通信中间件:swarm_ros_bridge

news2025/1/15 16:32:15

最近写了一个无线网络环境下(比如WIFI)多机ROS通信的项目swarm_ros_bridge:

https://gitee.com/shu-peixuan/swarm_ros_bridge

A lightweight middle interface that enables specified ROS message transmission among swarm robots through socket communication

本项目基于ZeroMQ,用于取代现有ROS1和ROS2多机通信配置,能够灵活地将任意本机ROS话题发送到其他机器人,或者读取其他机器人的话题。

目录

一、ROS多机通信现状

1、ROS1 自带的组网通信

2、ROS2自带的组网通信

3、自己写TCP/UDP的socket通信

二、基于ZeroMQ的通信中间件开发

三、swarm_ros_bridge


一、ROS多机通信现状

集群ROS机器人通过无线网络(WIFI、带网口的数传)进行多机通信,常用的应用层传输方法有:

1、ROS1 自带的组网通信

通过设置ROS_MASTER_URI使得所有机器人都连接到某一个主机的ROS master上,共享所有的ROS话题,底层是TCP协议和xmlRPC集中式节点发现机制)。缺点:

  • 设置繁琐:每个机器人都要在/etc/hosts里设置IP, ~/.bashrc里设置ROS_MASTER_URI, ROS_HOSTNAME。
  • 不灵活:必须主机的roscore先启动,其他机器人的ROS节点后启动。

参考:

ROS/Technical Overview - ROS Wiki

ROS机器人操作系统底层原理及代码剖析_robinvista的博客-CSDN博客_ros源码分析

2、ROS2自带的组网通信

ROS2默认采用分布式的fast DDS通信架构。由于取消了ROS master中心节点,改用分布式的节点发现机制,ROS2的多机通信不需要设置主从机,设置简便了许多:

export ROS_DOMAIN_ID=5

保证同一局域网下的各个机器人的ROS_DOMAIN_ID相同即可。缺点:

  • 不灵活:和ROS1一样,所有ROS话题都被传输,不能选择需要被传输的话题。
  • 不可靠:fast DDS 默认采用UDP通信协议,无线通信时不如TCP可靠(因为DDS一般是为本机多个进程间的数据交换开发的,而不是多机无线通信场景)。

参考:

ROS2之DDS问题汇集_zhangrelay的博客-CSDN博客_failed to find a free participant index for domain

 ROS2官方教程:ROS2中不同的DDS/RTPS vendors_P2Tree的博客-CSDN博客

 ZMQ vs eProsima Fast RTPS

3、自己写TCP/UDP的socket通信

采用sys/socket.h等库,自己写TCP或者UDP的socket通信代码,将ROS消息转换为TCP数据流发送到指定的机器人。其中TCP要求建立两者连接后才能收发数据,UDP则只负责发送数据和读取数据,而不管对方是否在线或接收到。缺点:

  • 代码复杂:直接操作socket套件字过于底层,代码工作量很大,你要为每一个连接创建一个socket套接字,并全程管理绑定、监听、连接、接收等。
  • ”面向连接“而非”面向数据“:socket通信是面向连接的,而非ROS1/ROS2那样面向数据的,这意味着你需要为每两个机器人之间的通信都写一段连接的代码,不具有集群的扩展性。
  • 启动顺序有限制:和ROS1一样,TCP协议要求服务器端先启动,客户端后启动。而且不具备断线重连的功能。

C++ Socket实现TCP与UDP网络编程_C 语言_脚本之家

TCP socket通信
UDP socket通信
UDP socket通信

 为了避免重复造轮子,我调研了一些现有的把ros话题消息转换成TCP/UDP数据流的项目:

rosbridge_suite - ROS Wiki : Rosbridge provides a JSON API to ROS functionality for non-ROS programs.它主要是面向网页或者其他应用端和ros通信用,不是多机通信用。

rosserial - ROS Wiki :rosserial is a protocol for wrapping standard ROS serialized messages and multiplexing multiple topics and services over a character device such as a serial port or network socket. 它是读取串口的ROS包,也支持TCP端口读取,但是主要针对简单的读取一个固定TCP端口消息。

udp_com : 一个通用的以ROS形式读取和发送udp消息。提供了create_socket_service和send_service两个service用来创建接收套接字和发送消息,但是只能用他指定的ROS话题类型。

ros_udp_bridge : 用poco net库里的socket创建ROS读取和发送话题,但只是读取一个特定话题的简单项目。

综上,现在并没有可以好用的针对集群无线通信的ROS包。

二、基于ZeroMQ的通信中间件开发

其实ROS1和ROS2里的话题机制就是一种通信中间件,“通信中间件”是介于通信架构“传输层”和”应用层“之间的一层,将传输层的socket通信连接等设置封装成一些简单的API供应用层调用,从而使得应用开发人员不需要关注繁琐的TCP/UDP socket设置。

通信的7层架构
中间件介于应用层和硬件层之间

 OSI 模型与TCP/IP、以太网、DDS - 知乎

 通讯协议篇(底层TCP/UDP;上层MQTT、HTTP、CoAP、DDS、AMQP、JMS) | 码农家园

ROS1是自己搭建了一套xmlRPC集中式机制来建立节点之间的TCP连接,ROS2则是直接用了fast DDS中的分布式fast RTPS机制。如果我们不用ROS1和ROS2自带的中间件,就意味着我们需要自己写一个通信中间件,来实现集群机器人之间的通信连接。

好在还有一些其他的通信中间件可供我们使用,其中比较著名的就是ZeroMQ:

ZeroMQ | Socket API

ØMQ中文翻译文档_我不掉头发的博客-CSDN博客

zmqpp: zmqpp Namespace Reference

zeroMQ是一个主要用于TCP通信的中间件,基于C但也提供C++、python等封装。它将socket通信连接全部封装好,而留出一些”面向数据“的API接口供我们调用。

ZeroMQ提供的接口延用了socket的名字,比如socket::bind(),socket::connect(),socket::send(), socket::receive(),但是没有socket::listen()和socket::accept(),因为它提供的socket不是面向连接而是面向数据的,为要传输的每一个数据创建一个套接字即可,而不需要关心底层的socket连接问题。因此它不要求服务器先启动、客户端后启动,而是会自动连接、断线重连。

ZeroMQ提供的几种socket模式很像ROS,比如
Request-reply :类似于ROS的service。
Pub-sub : 类似于ROS的topic。

Pipeline :类似于ROS的topic,但是其push/pull的模式会阻塞发送端,不会丢弃发送的数据。

将zeroMQ用于ROS消息传输的项目也有一些,比如:

zmqros : 2015年的项目,过于陈旧,功能不完善。

ros_zeromq_tutorial : 只是一个简单的zeromq使用示例,并没有转化成ros话题。

综上,现在并没有可以好用的zeroMQ来传输ROS消息的项目。

三、swarm_ros_bridge

swarm_ros_bridge: A lightweight middle interface that enables specified ROS message transmission among swarm robots through socket communication

针对以上问题,我基于ZeroMQ开发了一个轻量化的ROS包,可以将任意ROS话题发送到其他机器人实现多机通信。只需要将你需要发送或接收的ROS话题信息写在ros_topics.yaml文件里。

核心工作:

利用ROS1自带的serialization对ROS话题消息进行序列化和反序列化,然后利用zeroMQ的PUB/SUB模式将消息发送,并为每个ROS接收话题建立一个接收线程。

与ROS1多机器人无线通信相比,它具有以下优点:

  • 鲁棒:无需先启动基站ROS主站。支持每个机器人以随机顺序启动并自主连接。
  • 灵活:您可以选择发送/接收 ROS 话题,而不是像 ROS1 那样传输所有话题。
  • 易于使用:在一个配置文件中指定所有IP和ROS话题。

与ROS2 DDS通信相比,它具有以下优点:

  • 轻量化:是一个订阅和发送远程ROS主题的小型ROS桥接节点,因此很容易与其他ROS1节点对接。
  • 可靠:它使用基于TCP协议的zmq套接字通信,而ROS2基于DDS,其默认协议为UDP(无法实现)。事实上,DDS主要用于有线通信下的本机进程之间的数据交换,而不是远程无线通信。

未来改进:

  1. 动态RPC,包括动态节点发现、在线主题变更和地面站监控。
  2. 支持UDP协议,用于视频流等大量数据传输。

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

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

相关文章

国内出海企业常见的跨境网络问题分析及解决方案

经济全球化趋势发展得如火如荼,越来越多的中国企业走出国门,兴起包括跨境电商、虚拟商品、游戏出海等新贸易形式。但在业务开拓过程中,由于远距离传输的特殊性,出海企业经常面临网络传输慢、不稳定、延迟、掉线等网络问题&#xf…

0基础如何开始学习计算机知识?

一、计算机的基本操作 计算机中只有文件和文件夹 计算机中,只有两样东西,文件和文件夹。 文件夹:本身不存储数据内容。文件夹是用来组织和管理文件的。 文件: 所有的txt文本文档,音乐,视频,图…

2022年国外LEAD收入情况

欢迎关注勤于奋每天12点准时更新国外LEAD相关技术这个收入情况,最喜欢关心,最喜欢看的人应该是新手和观望的人最想知道的,LEAD收入只要操作了,赚钱肯定是没问题,我一直这样说,而且我公众号叫勤于奋&#xf…

【Spring(四)】万字详解bean的实例化

文章目录前言1.bean实例化1.1 bean的基础配置1.2 bean的实例化-构造方法1.3 bean的实例化-静态工厂1.4 bean的实例化-实例工厂与FactoryBean总结前言 在上篇文章,我们已经完成了入门案例的学习,在入门案例中,我们讲了三块东西,首先…

《Kotlin核心编程》笔记:函数和Lambda表达式

高阶函数和lambda表达式 函数式语言⼀个典型的特征就在于函数是头等公民——我们不仅可以像类⼀样在顶层直接定义⼀个函数,也可以在⼀个函数内部定义⼀个局部函数,如下所示:所谓的高阶函数,你可以把它理解成“ 以其他函数作为参数…

Debian10,docker单机安装ThingsBoard-3.3.2

1.编译项目源码 源代码编译ThingsBoard-3.3.2 2.环境准备 修改ssh登录配置 sudo vi /etc/ssh/sshd_config 打开密码登录和root用户登录3.安装docker 更新apt sudo apt update安装必备软件 sudo apt install apt-transport-https ca-certificates curl gnupg2 software-p…

SpringBoot异步方法(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-async-method.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建查找服务,异步查询…

Linux搭建Docker版FTP,命令与Dockerfile两种方式以及容器编码解决

Linux搭建Docker版FTP,命令与Dockerfile两种方式以及容器编码解决一、Linux搭建Docker版FTP二、修改 Docker 容器内部 locale 系统编码最终待实现效果,这个方式容器内部编码并未永久改变三、编写Dockerfile方式加载带UTF-8编码环境的镜像3.1Dockerfile构…

【LINUX权限】

目录:前言一、shell二、权限(一)文件权限(二)权限相关指令chmod(修改权限)su 、sudo(提权)root提权chown 、chgrpumask(掩码)file(三&…

性能测试工具 Lmbench 的使用方法以及解析运行结果

1. Lmbench 简介 Lmbench 是一款简易可以移植的内存测试工具,其主要功能有,带宽测评(读取缓存文件、拷贝内存、读/写内存、管道、TCP),延时测评(上下文切换、网络、文件系统的建立和删除、进程创建、信号处…

MYSQL中的14个实用的功能

1.group_concat 在我们平常的工作中,使用group by进行分组的场景,是非常多的。 比如想统计出用户表中,名称不同的用户的具体名称有哪些? 具体sql如下: select name from `user` group by name; 但如果想把name相同的code拼接在一起,放到另外一列中该怎么办呢? 答:…

Genesis一款基于Domino的app store应用超市

大家好,才是真的好。 众所周知,App Store是苹果iOS系统生态成功的关键因素。Domino作为一款企业应用平台,很多年前,就有人提出要创建Domino平台上的App Store。 其实比IOS早很多年前就有类似的应用管理,早在2000年的…

代码随想录之回溯第一课

要领:类型题目,用具体的一个例子来记忆,就够了,印象更加深刻。 一个题目,感觉理解不深刻,不透彻,不清晰,不熟练,就是不达标。 怎么做? 每天回顾复习看一次&am…

DD-1/50 12.5-50mA【接地继电器】

系列型号: DD-1/40接地继电器 DD-1/50接地继电器 DD-1/60接地继电器 一、 用途及工作原理 DD-1型接地继电器为瞬时动作的过电流继电器,用作小电流接地电力系统高电压三相交流发电机和电动机的接地零序过电流保护。继电器线圈接零序电流互感器(电缆式、…

电脑重装系统后分辨率不对应该怎么调

越来越多的小伙伴使用小白一键重装系统给自己的电脑安装上了win10系统,但是有部分小伙伴发现安装完win10系统之后,屏幕分辨率也无法进行调整,呈灰色状态。接下来小编就给大家详细的介绍一下小白一键重装系统分辨率不对怎么调的教程。 工具/原…

【Django】(一)基础知识

文章目录一.安装二.创建项目三.项目介绍四.APP的创建五.小案例六 模板和静态文件模板静态文件7.模板语法7.1 变量7.2列表7.3 字典7.4 过滤器7.5 if/else7.6 for标签7.7 ifequal和ifnotequal7.8注释7.9csrf_token8.模板继承8.1父模板8.2 子模板9.请求和响应10.数据库10.1安装第三…

【服务器搭建个人网站】附:接入的服务商 以及 安全评估报告该如何填写?

前言 哈喽,大家好,我是木易巷! 关于公安备案的一些详细的细节没有分享出来,在公安备案期间要填写很多东西,其中比较难填写的就是接入的服务商和安全评估报告的填写。 这一篇给大家总结:公安备案接入服务商和…

⭐️【linux】关于linux-gcc,你必须要知道的知识

🌲🌲目录🌲🌲 1️⃣什么是gcc 2️⃣gcc如何生成可执行文件 3️⃣简单使用gcc 4️⃣linux的库 1️⃣什么是gcc ❄️GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的…

Java 中 Map 集合的基本使用

一、HashMap 1.1 HashMap 基本使用 import java.util.*;/*** author: yunhu* date: 2022/7/14*/ public class Test {public static void main(String[] args) {Map<String, Integer> map new HashMap<>();map.put("Alice", 12);map.put("Bob&qu…

62.Python 类的3要素语法

62.类的3要素语法 文章目录62.类的3要素语法1. 定义类的语法2. pass语句的作用3.我们学的5个缩进语法4.类的属性5.类的方法6. 创建对象7.类在爬虫中的应用8. 总结1. 定义类的语法 定义类的语法如下&#xff1a; class 类名: 代码块 从语法上来看&#xff1a;类的…