【图像与点云融合教程(五)】海康相机 ROS2 多机分布式实时通信功能包
0. 前言
Github 仓库链接:Hikvision Camera ROS2 package
0.1 问题背景
上一篇[博客](【图像与点云融合教程(四)】海康相机 ROS2 功能包 - 古月居 (guyuehome.com))介绍了我开源的海康相机 ROS2 功能包,在本地机器上可以实时订阅和发布图像消息,但是在通过局域网进行多机通信的测试时,PC 端收不到边缘端发布的图像消息,不过可以通过 ros2 topic list 查看到图像话题是存在的。
经过查询资料,这主要是由于 DDS 的不同实现的实时性和可靠性存在不同。
0.2 ROS2 下的 DDS 的不同实现
以下是一个简单的表格,介绍ROS 2中四种不同的DDS实现:Fast DDS、OpenSplice DDS、Connext DDS和Eclipse Cyclone DDS。
| DDS实现 | 介绍 | 优点 | 缺点 |
|---|---|---|---|
| Fast DDS | - 前身为Fast RTPS,是ROS 2中默认的DDS实现。 | - 高性能和可靠性。<br>- 支持大规模的分布式系统。<br>- 配置灵活,易于集成。<br>- 开源免费。 | - 部分功能可能仍在演进中。<br>- 可能需要一些时间来适应配置和优化。<br>- 社区相对较小。 |
| OpenSplice DDS | - 另一个受欢迎的DDS实现,已与ROS 2集成。 | - 成熟稳定,可靠性较高。<br>- 支持多种平台。<br>- 支持实时性和安全性。<br>- 良好的工具和支持。 | - 闭源商业软件,可能需要购买许可证。<br>- 社区支持相对较少。<br>- 文档可能不如其他实现全面。 |
| Connext DDS | - 来自RTI的商业DDS实现,广泛应用于实时系统。 | - 高度可靠,性能优秀。<br>- 支持广泛的平台和编程语言。<br>- 强调实时性和安全性。<br>- 良好的支持和文档。 | - 商业软件,需要购买许可证。<br>- 可能对资源占用较高。<br>- 开源版本功能有限。 |
| Eclipse Cyclone DDS | - 开源且高效的DDS实现,可用作Fast DDS的替代方案。 | - 开源免费,社区活跃。<br>- 性能良好,轻量级实现。<br>- 支持多种平台和语言。 | - 可能缺乏一些高级功能和工具。<br>- 文档相对较少。<br>- 社区支持较其他实现略少。 |
0.3 如何挖掘 DDS 的性能
在这里我选择的是 Eclipse Cyclone DDS 这个 DDS 实现,但想要实现我想要的效果,还需要对其进行调优,参数设置得不好的话,最终效果会很差。下面具体介绍一下为什么要对 DDS 进行调优。
DDS需要调优的主要原因是确保它能够满足应用程序的性能和可靠性要求。由于不同的应用场景和硬件平台有着不同的特点和约束,因此需要进行调优以使DDS能够最大程度地发挥优势。
以下是为什么DDS需要调优的几个主要原因:
-
性能优化: DDS的性能对实时应用至关重要。通过调优,可以降低通信延迟,提高数据传输速率,增加系统的吞吐量,以满足实时系统对数据传输的实时性要求。
-
资源利用: 在分布式系统中,资源(如带宽、CPU、内存)是有限的。DDS调优可以帮助合理利用这些资源,减少资源浪费,提高系统的效率和稳定性。
-
QoS配置: DDS提供了丰富的Quality of Service(QoS)选项,用于控制数据传输的各个方面,如数据可靠性、优先级、历史数据存储等。通过正确配置QoS参数,可以满足应用对数据传输的不同需求。
-
网络适应性: 在跨越不同网络环境的分布式系统中,DDS需要适应各种网络条件,如高延迟、不稳定连接等。调优可以帮助DDS在不同网络环境下保持稳定的通信,并减少数据丢失的可能性。
-
安全性: 对于一些安全性要求较高的应用,DDS需要配置加密和认证机制,以保护数据的机密性和完整性。
-
调试和故障排除: 调优也有助于发现和解决DDS在系统中可能出现的问题,提高系统的稳定性和可靠性。
综上所述,DDS调优是为了使DDS能够更好地适应特定的应用场景和硬件平台,提高系统的性能、实时性和可靠性,确保分布式系统能够顺利地进行数据通信和协作。
1. 具体操作
1.1 Cyclone DDS 调优参数设置
下面内容需要同时在边缘端和 PC 端进行设置。
首先,安装并配置环境变量:
sudo apt install ros-foxy-rmw-cyclone-cpp
echo 'export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp' >> ~/.bashrc
接着,在终端中直接设置下面三个参数:
sudo sysctl net.ipv4.ipfrag_time=3
sudo sysctl -w net.core.rmem_max=2147483648
sudo sysctl net.ipv4.ipfrag_high_thresh=2147483648
然后,创建一个 config.xml 文件,内容如下:
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
<Domain id="any">
<Internal>
<MinimumSocketReceiveBufferSize>1024MB</MinimumSocketReceiveBufferSize>
</Internal>
</Domain>
</CycloneDDS>
最后,在终端中临时加载上面参数文件:
CYCLONEDDS_URI=/path/to/config.xml
1.2 局域网配置
确保边缘计算设备和 PC 通过 Wi-Fi 或有线连接到同一个局域网,如果设备很多,都是通过同一个局域网,且想对设备进行分组进行分布式通信,可以设置下面参数,设置了相同编号的设备之间就可以进行通信了,不设置的话就是所有设备之间都可以进行通信:
echo 'export ROS_DOMAIN_ID=5' >> ~/.bashrc
1.3 测试
克隆 Github 上的功能包代码,怎么创建工作空间和编译这里就不再赘述了,ROS2 新手移步上一篇博客学习。
将海康相机连接在边缘设备上,执行测试程序:
# 边缘端执行发布
ros2 run hk_camera hk_camera_compressed_pub_test_reliable
# PC 端执行订阅
ros2 run hk_camera hk_camera_compressed_sub_test_reliable
PC 端订阅图像效果如下,虽然相机最高帧率可达到 40Hz,但是这里我的边缘设备最高发布速率只能达到 20 fps,在 PC 端可以实现实时接收图像:

边缘端图像发布大概 8MiB/s:

PC 端接收的速率也大概是 8MiB/s:

点击海康相机 ROS2 多机分布式实时通信功能包------古月居可查看全文
相关文章:
【图像与点云融合教程(五)】海康相机 ROS2 多机分布式实时通信功能包
0. 前言 Github 仓库链接:Hikvision Camera ROS2 package 0.1 问题背景 上一篇[博客](【图像与点云融合教程(四)】海康相机 ROS2 功能包 - 古月居 (guyuehome.com))介绍了我开源的海康相机 ROS2 功能包,在本地机器上可以实时订…...
正则截取字符窜数字,字母,符号部分
Testvoid test20() {String str "BJRabG11325F9**0**";// 提取字母部分String letterPart str.replaceAll("[^a-zA-Z]", "");String noLetterPart str.replaceAll("[a-zA-Z]", "");System.out.println("字母部分&am…...
【ChatGPT】让ChatGPT生成跨语言翻译的精确提示
让ChatGPT生成跨语言翻译的精确提示 在跨语言交流中,为了确保翻译的准确性,生成精确的提示(Prompt)来指导ChatGPT翻译内容是至关重要的。无论是要处理复杂的技术术语、俚语,还是保持特定的语言风格,使用有…...
Vue3父传子
1. App.vue - 父组件 咱们先来看左边的 App.vue,它扮演的是“父亲”角色——你可以想象它是一位热心的老爸,手里拿着一条消息,正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关,一开…...
使用VBA宏合并多个Excel文件的Sheet页
使用VBA宏合并多个Excel文件的Sheet页 在日常的Excel数据处理工作中,我们经常需要将多个Excel文件中的工作表合并到一个Excel文件中。这种操作可以极大地提高数据处理效率,但如果文件数量较多,手动合并会非常繁琐。本文将介绍如何使用VBA宏来…...
Anolis8防火墙安全设置
一、账号安全 1、禁止root远程登录 首先创建一个普通用户,然后修改系统配置禁止root登录,因为root作为系统默认的超级管理员,权限过大,日常操作使用易导致安全风险。 1.1、首先要建立一个新的登录用户 useradd username #增…...
标题:自动化运维:现代IT运维的革新力量
标题:自动化运维:现代IT运维的革新力量 随着信息技术的飞速发展,企业对于IT系统的依赖日益加深,运维工作的重要性也愈发凸显。传统的运维模式,往往依赖于人工操作,效率低下且容易出错,难以满足…...
无人机之姿态融合算法篇
无人机的姿态融合算法是无人机飞行控制中的核心技术之一,它通过将来自不同传感器的数据进行融合,以实现更加精确、可靠的姿态检测。 一、传感器选择与数据预处理 无人机姿态融合算法通常依赖于多种传感器,包括加速度计、陀螺仪、磁力计等。这…...
Redis系列---数据管理
目录标题 数据类型String优点缺点底层结构使用场景实际使用 List优点缺点底层结构使用场景实际使用 Hash优点缺点底层结构使用场景实际使用 Set优点缺点底层结构使用场景实际使用 Zset优点缺点底层结构使用场景实际使用 HyperLogLog优点缺点底层结构使用场景实际使用 GEO优点缺…...
【Linux系统编程】第四十二弹---多线程编程全攻略:涵盖线程创建、异常处理、用途、进程对比及线程控制
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程创建 2、线程异常 3、线程用途 4、进程 VS 线程 5、线程控制 5.1、创建和等待线程 1、线程创建 线程能看到进程的大…...
Rust 力扣 - 2379. 得到 K 个黑块的最少涂色次数
文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 本题可以转换为求长度为k的子数组中白色块的最少数量 我们遍历长度为k的窗口,我们只需要记录窗口内的白色块的数量即可,遍历过程中刷新白色块的数量的最小值 题解代码 impl Solution {…...
“单元测试”应该怎么写比较好
如何正确写单元测试 单元测试重要性写单元测试时存在的问题1、如何命名测试类&方法1.1、测试类命名规范1.2、测试方法命名规范 2、测试类的要求2.1测试行覆盖率100%2.2、单一职责2.3、可重复2.4、外部隔离,无任何外部依赖2.5、正确的使用断言2.6、不应该为了测试…...
腾讯开源首个文图生3D大模型Hunyuan3D-1.0
🦉 AI新闻 🚀 腾讯开源首个文图生3D大模型Hunyuan3D-1.0 摘要:腾讯混元于11月5日开源了Hunyuan3D-1.0,这是首个同时支持文本生成和图像生成的3D开源大模型。该模型采用两阶段生成方法,可以在10秒内生成3D资产。第一阶…...
c语言简单编程练习10
1、typedef和#define的区别 在用作数据类型替换时的区别: #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要; #define B char *int main(int argc, char *argv[]) {A a,b;B c,d;printf("a_size%ld\n"…...
时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多步时间序列预测
时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测 目录 时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多…...
数据结构[2016]
一、设有二维数组A[6][8],每个元素占6个字节存储,实现存放,A[0][0]的起始地址为1000,计算: (10分) (1)数组最后一个元素A[5][7]的起始地址; (2)按行优先存放时,元素A[1][4]的起始地址; (3)按列优先存放时…...
DBAPI连接阿里云 maxcompute 报错
使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar ,这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar,这个不是完整的,它还…...
Web3对社交媒体的影响:重新定义用户互动方式
随着互联网的发展和人们对隐私、安全、所有权的需求不断提高,Web3 的概念逐渐深入人心。Web3 的出现标志着一个去中心化、用户主导的网络时代的到来,这也将对社交媒体产生深远的影响。Web3 不仅推动社交媒体从中心化模式向用户主导的去中心化模式转变&am…...
【LeetCode】【算法】322. 零钱兑换
LeetCode 322. 零钱兑换 题目 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1。 你可以认为每…...
人工智能技术:未来生活的“魔法师”
想象一下,未来的某一天,你醒来时,智能助手已经为你准备好了早餐,你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐,而你的自动驾驶汽车已经在门口等你。这不是科幻小说,这是人工智能技术为我…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
