多机器人集群网络通信协议分析

news2025/8/7 17:10:40

本文讨论的是多机器人网络通信各层的情况和协议。

每个机器人连接一个数据传输通信模块(以下简称为数传,也泛指市面上的图传或图数一体的通信模块),数传之间进行组网来传递信息。

根据ISO的划分,网络通信的OSI模型分为从低到高的7层。

参考:

ISO七层协议模型架构、各层的解析及其协议_肥嘟嘟的左卫门的博客-CSDN博客

计算机网络各层涉及协议(超级详细) - 知乎 (zhihu.com)

分布式之远程通信协议_一个想进阶的java菜鸟的博客-CSDN博客 

1、物理层(网线、网口、串口)

电气接口、线缆连接。如网口(RJ45)、RS232串口等。这一层只和硬件有关,传输的是0和1的bit流

数传一般提供串口,但有的数传也同时提供多个串口和网口。对于单片机飞控来说,连接和使用数传的串口是比较容易的。但是对于有linux系统的上位机(如树莓派)来说,使用数传上的网口会更加方便地连接到集群内其他个体。

2、数据链路层(数传、无线网卡、网桥)

该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。这一层中将bit流封装成frame帧,即规定了0和1的分包形式。

这一层常见的协议是IEEE 802局域网标准,其中最常见的有IEEE 802.3以太网(也就是常说的有线网),IEEE 802.11无线局域网(也就是常说的WLAN或者WiFi)。

无线数传可能使用的是IEEE 802.11这种WLAN协议,其中802.11n也俗称WiFi4(2.4GHz),802.11ac也俗称WiFi5(仅在5GHz频段工作),802.11ax也俗称WiFi6(速度更快)。但这三种协议传输距离都很近,为了进军IoT物联网市场,802家族还推出了802.11ah协议,俗称WiFi-HaLow(比如阿木实验室的homer数传就是采用的这种协议),其工作在Sub-1GHz频段,但传输距离也只有1km。

常见的无线传输协议还有Zigbee(IEEE 802.15.4),但是组网不灵活,带宽很低。

顺便提一下,如今同时满足传输距离远(10km以上)、带宽高(10Mb以上)、可组网(星型组网或mesh组网)的数传大都是由软件无线电(SDR)实现的,即用可编程的硬件(比如FPGA、DSP)通过软件编程而非电路(模拟或者数字电路)的形式来实现(上述?)通信协议。

3、网络层(路由器,IP)

对网络内的数据包进行路由选择。网络层处理的是数据包(packet),使用的是IP地址(区分不同的机器),作用是路由(为每个数据选择和建立一条通路),常见的设备是路由器、多层交换机。

网络层最常见的协议就是IP协议,其实现了子网内不同机器间的互连,但是实现细节并不需要我们关心,你只需要知道把每台机器设置固定IPv4的IP,并且使得它们的IP在一个网段就行。

如何判断两个IP地址是否在同一个网段?什么是子网掩码? - 知乎 (zhihu.com)

这里重点提一下路由。用过WiFi的都知道,一般需要有一个路由器作为AP,其他节点接入AP,所有消息都经过路由器来路由和转发。比如A机器和B机器通信,也一定是先通过路由器转了一手,因此延迟较大(100ms),而且依赖路由器这个中心节点。

现在一些星型组网的数传就是类似这种架构,需要一个地面端数传来路由,所有天空端数传的消息可能都是经过地面端数传来路由和转发的,延迟较大,而且所有节点必须保持在地面端中心节点的通信范围内,其优点是结构稳定可靠。

还有一种组网方式叫mesh组网,不需要一个专门的节点作为路由器,所有的节点都具有路由功能,自组织形成网络,自愈合。比如无线网卡的Ad-hoc模式,还有一些数传也具有mesh组网的功能。其优点是无中心节点,直接点对点传输延迟小(1ms);缺点是网络结构可能不太稳定,带宽也会比星型网络小一些。

ad-hoc可以参考:ubuntu Ad-Hoc组网通信_adhoc组网_集智飞行的博客-CSDN博客

4、传输层(TCP、UDP,端口)

从这层开始,就是纯软件部分了。传输层关注的是各个机器上的各个应用程序之间通信的问题,最常用的就是TCP和UDP协议。

每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信,处理的数据单位是数据段(segment)

TCP协议和UDP协议都需要知道应用程序的IP和端口。区别是TCP协议是面向连接的点对点连接,服务器和客户端应用程序必须都在线而且先建立连接,才能进行数据收发,而且还有数据重发的机制保证数据一定传输给对方。而UDP协议不需要建立连接,应用程序只负责向本机的某个端口发送数据或者从别机的某个端口读取数据,而不管有没有程序在接收或者发送,因此UDP协议除了点对点通信外,还支持多播(组播)、广播,即加入组播群的节点都能收到群内所有其他节点的消息。

显然,TCP是可靠的传输协议,缺点是略慢,只能点对点。UDP协议是不可靠的传输协议,支持多点传输。编程中使用socket套接字来进行TCP和UDP通信。

然而有一些消息队列MQ(message queue),比如ZeroMQ或者MQTT,将TCP的连接过程封装了一下,让用户使用起来也具有UDP那样的效果,比如不关心是否有客户端、服务器在连接,支持一对多传输等。我的swarm_ros_bridge就是采用了ZeroMQ对TCP的封装来实现多机器人应用程序之间灵活的通信:

集群多机ROS通信中间件:swarm_ros_bridge_ros 中间件_集智飞行的博客-CSDN博客

机器人集群多机间通信是采用UDP还是TCP好呢?

1. 从通信质量来看

如果不关心数据实时性,而只要求数据不能丢弃,那么TCP更可靠。如果只关心数据流的实时性,看重低延迟,那么UDP可能好一些(TCP其实也不慢)。

2. 从连接方式来看

如果事先不知道所有机器人的IP,只知道程序用的端口,那么应当用UDP的组播,即所有机器人都加入这个组播地址,往组播群里发消息,则其他个体都能收到。比如做一个多机地面站,接入飞机的IP可能事先并不确定,此时应当用UDP组播。

3. 从通信带宽占用来看

UDP组播/广播由于向群里所有其他个体都发送了消息,可能有些个体并不需要知道这些消息,这造成了带宽的浪费。相比之下,TCP点对点通信就减少了这种带宽的浪费。

但是,如果某个体和其余个体通信的内容都是一样的,比如要向N个其他节点广播自身的位置,那UDP组播更节省带宽。因为UDP组播情况下每条链路、每个设备都最多只会经过一次,因此占用的带宽不会随着广播域的增大而扩大。而TCP需要为每两两连接的个体发送一次相同的数据包。

比如下图,黄色方块代表星型组网中的路由器,所有消息都要经过它转发,那么TCP显然比UDP多发了一次相同的数据。

 

也许,为每个机器人设置一个不同的UDP组播群,需要它信息的邻居加入这个组播群,这是比广播或者TCP通信更好的方法?

对于数据量不大的情况,TCP点对点通信完全足以胜任。

参考:​​​​​​ UDP广播和TCP链接传送数据,哪个更节省带宽? - 知乎 (zhihu.com)

 UDP广播和TCP链接传送数据,哪个更节省带宽? - 知乎 (zhihu.com)

5、会话层

该层被弃用。

6、表示层

该层被弃用。

7、应用层(HTTP、DNS、ssh、mavlink)

这一层是纯软件部分,关注的是应用程序之间传输的报文的格式协议。常见的协议比如DNS协议(解析域名,运行在UDP协议之上,使用端口号53),HTTP协议(浏览器网页协议)。多机器人之间传递信息的应用层协议完全可以自己定义,比如自己规定报文中每帧的内容含义。也可以用一些通用的协议标准,比如mavlink(常用于无人机之间)。

我的swarm_ros_bridge其实传输的就是序列化(serialize)后的ROS消息,并且为每一个ROS消息/话题单独开了一个端口。可以理解为其应用层协议就是ROS message的定义方式。

有时候,传输层和应用层之间还会加一个中间层,比如DDS(Data Distribution Service)就是以数据为中心的中间件协议和API标准。DDS将应用层程序从操作系统,网络传输和低级数据格式的详细信息中抽象出来。以不同的编程语言提供了相同的概念和API,从而允许应用程序跨操作系统,语言和处理器体系结构交换信息。底层细节,如数据线格式、发现、连接、可靠性、协议、传输选择、QoS、安全性等都由中间件管理。

swarm_ros_bridge也属于中间层,都是为了简化应用层的开发,避免繁琐的直接对传输层协议的操作。本质上,中间层也属于应用层。

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

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

相关文章

速看|快速软件开发框架突破信息孤岛,高效实现数字化发展!

在企业办公自动化发展的过程中,各部门之间的信息链接存在着链接不及时、信息孤岛的现象。伴随着日益激烈的市场竞争,这样单枪匹马的作战方式已经让不少企业吃尽了苦头,借助快速软件开发框架,可以有效打破信息孤岛,让各…

Jetpack Compose 中适配不同的屏幕尺寸

窗口大小分类 Compose 将 Android 设备的屏幕尺寸分为三类&#xff1a; Compact: 小屏幕&#xff0c;一般就是手机设备&#xff0c;屏幕宽度 < 600dpMedium&#xff1a;中等屏幕&#xff0c;大号的板砖手机如折叠屏或平板的竖屏&#xff0c;600dp < 屏幕宽度 < 840d…

swagger关闭/v2/api-docs仍然可以访问漏洞

今天接到安全团队的说swagger有未授权访问漏洞&#xff0c;即使在swagger关闭的情况下http://127.0.0.1:8086/agcloud/v2/api-docs?group%E7%94%A8%E6%88%B7%E5%85%B3%E8%81%94%E4%BF%A1%E6%81%AF%E6%A8%A1%E5%9D%97仍然还能访问。 看了下原来是有写一个拦截器 registry.addI…

图表控件TeeChart for .NET系列教程六:将数据添加到系列中(使用系列)

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。 TeeChart for .NET最新…

BFD协议原理

BFD协议原理引入背景不使用BFD带来的问题OSPF感知慢VRRP产生次优路径BFD技术简介BFD会话建立方式和检测机制BFD会话建立过程BFD工作流程BFD的单臂回声BFD默认参数以及调整方法总结引入背景 随着网络应用的广泛部署&#xff0c;网络发生中断可能影响业务正常运行并造成重大损失…

Git开发常用指令及其使用场景

目录前言一、Git安装1.1 官网安装二、配置Git工具2.1 用户信息配置2.2 查看配置三、初始化仓库3.1 创建仓库四、常用命令4.1 git clone拉取远端仓库4.2 git分支操作4.2.1 查看分支4.2.2 分支操作4.3 撤回操作4.3.1 撤回删错的分支4.3.2 撤回提交4.3 拉取代码操作4.4 贮存操作五…

ChatGPT也有犯晕的时候

前面测试 ChatGPT 进行写代码、优化代码、解释代码、一般问答都表现的很好。偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f;代码看不懂&#xff1f;ChatGPT 帮你解释&#xff0c;详细到爆&…

详解Redis的主从同步原理

前言 Redis为了保证服务高可用&#xff0c;其中一种实现就是主从模式&#xff0c;即一个Redis服务端作为主节点&#xff0c;若干个Redis服务端作为主节点的从节点&#xff0c;从而实现即使某个服务端不可用时&#xff0c;也不会影响Redis服务的正常使用。本篇文章将对主从模式…

asp.net网站读取app.config配置内容

目录1、情况说明1.1 使用场景1.2 基本概念2、优化1、情况说明 1.1 使用场景 创建了一个网站&#xff08;项目A&#xff09;&#xff0c;又创建了一个访问数据的项目B。项目A因为是个网站&#xff0c;所有会有web.config文件。项目B是一个读取数据库的类库&#xff0c;会有一个…

小樽C++ 单章④ 字符数组与字符串

目录 一、字符与数组 1.求字符数组的长度 2.查找单词 二、字符串与数组 2.1 字符串倒序输出 2.2 字符串比较 2.3 大写字母输出 ​编辑 三、字符串常用函数 一、初始化字符串&#xff1a; 二、字符串操作&#xff1a;(增删改查) 三、截取与替换字符串 四、替换字符串…

从0开始学python -48

Python MySQL - mysql-connector 驱动 MySQL 是最流行的关系型数据库管理系统&#xff0c;如果你不熟悉 MySQL&#xff0c;可以先学习 MySQL 教程。 本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL&#xff0c; mysql-connector 是 MySQL 官方提供的驱动器。 我…

DoubleAccumulator 源码详解

DoubleAccumulator 简介 这个类是新增的并发统计工具&#xff0c;可以多线程安全计数。 他的构造方法有两个参数&#xff0c;分别是统计方法和初始值。所以具体的统计是加减乘除是由传入的操作方法决定的。 public DoubleAccumulator(DoubleBinaryOperator accumulatorFunct…

​力扣解法汇总1599. 经营摩天轮的最大利润

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱…

Kubernetes调度之Pod亲和性

Kubernetes调度中的Pod亲和性abstract.pngPod亲和性节点亲和性&#xff0c;是基于节点的标签对Pod进行调度。而Pod亲和性则可以实现基于已经在节点上运行Pod的标签来约束新Pod可以调度到的节点。具体地&#xff0c;如果X上已经运行了一个或多个满足规则Y的Pod&#xff0c;则这个…

在ubuntu上(docker虚拟环境)部署完laravel的环境后如何运行一个基础的laravel项目

先测试laravel有没有安装成功 laravel如果报laravel command not found&#xff0c;先测试是否安装成功 find / -name laravel出现结果&#xff1a; 说明已经安装成功只是没有配环境变量 要么进这些文件夹测试那个路径下有真的laravel可执行文件&#xff0c;要么每个分别配置…

MCP2515国产替代DP2515带有SPI 接口的独立CAN 控制器

DP2515是一款独立控制器局域网络&#xff08;Controller AreaNetwork&#xff0c; CAN&#xff09;协议控制器&#xff0c;完全支持CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。DP2515自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的…

图像处理--基于像素层面

python 图像锐化 图像锐化可以使图像的边缘更加清晰&#xff0c;增强图像的细节。常见的图像锐化算法有拉普拉斯算子、Sobel算子、Prewitt算子等。下面是使用拉普拉斯算子实现图像锐化的Python代码&#xff1a; import cv2 import numpy as npdef laplacian_sharpen(img, ksi…

MySQL日志文件

文章目录1.MySQL中的日志文件2.bin log的作用3.redo log的作用4.bin log和redo log的区别&#xff08;1&#xff09;存储的内容&#xff08;2&#xff09;功能&#xff08;3&#xff09;写入时间&#xff08;4&#xff09;写入方式5.两阶段提交6.undo log的作用1.MySQL中的日志…

springcloud3 fegin实现服务调用1

一 Fegin的作用 1.1 fegin的作用 fegin是一个声明式的web服务客户端&#xff0c;让编写web服务器客户端变得非常容易&#xff0c;只需创建一个接口并在接口中添加FeginClients注解即可。 Fegin的使用方式&#xff1a;使用fegin的注解定义接口&#xff0c;调用这个接口&#…

BI软件工具也有ChatGPT

ChatGPT最近大火&#xff0c;朋友圈、聊天群啊到处都在分享它、讨论它。我也凑了个热闹&#xff0c;先和它聊了一下孩子学习上的困惑&#xff0c;然后用它给孩子出了一套易错题型的练习题&#xff0c;缓解了我做为熊孩子家长的压力。ChatGET能做的可不止这些&#xff0c;还能写…