多机器人集群网络通信协议分析
本文讨论的是多机器人网络通信各层的情况和协议。
每个机器人连接一个数据传输通信模块(以下简称为数传,也泛指市面上的图传或图数一体的通信模块),数传之间进行组网来传递信息。
根据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也属于中间层,都是为了简化应用层的开发,避免繁琐的直接对传输层协议的操作。本质上,中间层也属于应用层。
相关文章:

多机器人集群网络通信协议分析
本文讨论的是多机器人网络通信各层的情况和协议。 每个机器人连接一个数据传输通信模块(以下简称为数传,也泛指市面上的图传或图数一体的通信模块),数传之间进行组网来传递信息。 根据ISO的划分,网络通信的OSI模型分…...
【PyTorch】手把手带你快速搭建PyTorch神经网络
手把手带你快速搭建PyTorch神经网络1. 定义一个Class2. 使用上面定义的Class3. 执行正向传播过程4. 总结顺序相关资料话不多说,直接上代码1. 定义一个Class 如果要做一个神经网络模型,首先要定义一个Class,继承nn.Module,也就是i…...

【完整代码】用HTML/CSS制作一个美观的个人简介网页
【完整代码】用HTML/CSS制作一个美观的个人简介网页整体结构完整代码用HTML/CSS制作一个美观的个人简介网页——学习周记1HELLO!大家好,由于《用HTML/CSS制作一个美观的个人简介网页》这篇笔记有幸被很多伙伴关注,于是特意去找了之前写的完整…...

Java分布式事务(九)
文章目录🔥XA强一致性分布式事务实战_Atomikos介绍🔥XA强一致性分布式事务实战_业务说明🔥XA强一致性分布式事务实战_项目搭建🔥XA强一致性分布式事务实战_多数据源实现🔥XA强一致性分布式事务实战_业务层实现…...

基于深度学习的动物识别系统(YOLOv5清新界面版,Python代码)
摘要:动物识别系统用于识别和统计常见动物数量,通过深度学习技术检测日常几种动物图像识别,支持图片、视频和摄像头画面等形式。在介绍算法原理的同时,给出Python的实现代码、训练数据集以及PyQt的UI界面。动物识别系统主要用于常…...
K8S集群之-ETCD集群监控
### 生产ETCD集群监控核心指标 etcd服务存活状态 up{job~"kubernetes-etcd.*"}0 说明:up0代表服务挂掉 etcd是否有脱离情况 etcd_server_has_leader{job~"kubernetes-etcd.*"}0 说明:每个instance,该值应该都…...

一文弄懂熵、交叉熵和kl散度(相对熵)
一个系统中事件发生的概率越大,也就是其确定性越大,则其包含的信息量越少,可以认为一个事件的信息量就是该事件发生难度的度量,事件所包含的信息量越大则其发生的难度越大。并且相互独立的事件,信息量具有可加性。相互…...

10从零开始学Java之开发Java必备软件Intellij idea的安装配置与使用
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者前言壹哥在前面的文章中,带大家下载、安装、配置了Eclipse这个更好用的IDE开发工具,并教会了大家如何在Ecli…...

04 - 进程参数编程
---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录1. 问题1.1 再论execve(...)1.2 main函数(默认进程入口)1.3 进程空间概要图1.4 编程实验:进程参数剖析1…...

【python进阶】你真的懂元组吗?不仅是“不可变的列表”
📚引言 🙋♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅,…...
《C++ Primer Plus》(第6版)第13章编程练习
《C Primer Plus》(第6版)第13章编程练习《C Primer Plus》(第6版)第13章编程练习1. Cd类2. 使用动态内存分配重做练习13. baseDMA、lacksDMA、hasDMA类4. Port类和VintagePort类《C Primer Plus》(第6版)第…...

【多线程】多线程案例
✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:we can not judge the value of a moment until it becomes a memory. 目 录🍝一. 单例模式🍤1. 饿汉模式实现🦪2. 懒汉模…...

【IoT】嵌入式驱动开发:IIC子系统
IIC有三种接口实现方式 三种时序对比: 图1 IIC子系统组成 图2 图3 IIC操作流程 设备端 1.i2c_get_adapter 2.i2c_new_device(相当于register设备) 3.I2c_put_adapter 驱动端 1.填充i2c_driver 2.i2c_add_driver(相当于register驱动) 3.在probe中建立访问方式 client相…...

DJ2-4 进程同步(第一节课)
目录 2.4.1 进程同步的基本概念 1. 两种形式的制约关系 2. 临界资源(critical resource) 3. 生产者-消费者问题 4. 临界区(critical section) 5. 同步机制应遵循的规则 2.4.2 硬件同步机制 1. 关中断 2. Test-and-Set …...
AI独立开发者:一周涨粉8万赚2W美元;推特#HustleGPT GPT-4创业挑战;即刻#AIHackathon创业者在行动 | ShowMeAI周刊
👀日报&周刊合辑 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 这是ShowMeAI周刊的第7期。聚焦AI领域本周热点,及其在各圈层泛起的涟漪;拆解AI独立开发者的盈利案例,关注中美AIG…...

不要迷信 QUIC
很多人都在强调 QUIC 能解决 HoL blocking 问题,不好意思,我又要泼冷水了。假设大家都懂 QUIC,不再介绍 QUIC 的细节,直接说问题。 和 TCP 一样,QUIC 也是一个基于连接的,保序的可靠传输协议,T…...
【28】Verilog进阶 - RAM的实现
VL53 单端口RAM 1 思路 简简单单,读取存储器单元值操作即可 2 功能猜想版 说明: 下面注释就是我对模块端口信号 自己猜测的理解。 因为题目并没有说清楚,甚至连参考波形都没有给出。 唉,这就完全是让人猜测呢,如果一点学术背景的人来刷题,指定不容易!! 好在,我有较为…...

【MySQL】聚合查询
目录 1、前言 2、插入查询结果 3、聚合查询 3.1 聚合函数 3.1.1 count 3.1.2 sum 3.1.3 avg 3.1.4 max 和 min 4、GROUP BY 子句 5、HAVING 关键字 1、前言 前面的内容已经把基础的增删改查介绍的差不多了,也介绍了表的相关约束, 从本期开始…...

初时STM32单片机
目录 一、单片机基本认知 二、STM系列单片机命名规则 三、标准库与HAL库区别 四、通用输入输出端口GPIO 五、推挽输出与开漏输出 六、复位和时钟控制(RCC) 七、时钟控制 八、中断和事件 九、定时器介绍 一、单片机基本认知 单片机和PC电脑相比…...

debian部署docker(傻瓜式)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 debian10部署dockerdebian10部署docker(傻瓜式)一、准备工作二、**使用 APT 安装,注意要先配置apt网络源**1.配置网络源2.官方下载三、安装…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...