当前位置: 首页 > news >正文

【图像与点云融合教程(五)】海康相机 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需要调优的几个主要原因:

  1. 性能优化: DDS的性能对实时应用至关重要。通过调优,可以降低通信延迟,提高数据传输速率,增加系统的吞吐量,以满足实时系统对数据传输的实时性要求。

  2. 资源利用: 在分布式系统中,资源(如带宽、CPU、内存)是有限的。DDS调优可以帮助合理利用这些资源,减少资源浪费,提高系统的效率和稳定性。

  3. QoS配置: DDS提供了丰富的Quality of Service(QoS)选项,用于控制数据传输的各个方面,如数据可靠性、优先级、历史数据存储等。通过正确配置QoS参数,可以满足应用对数据传输的不同需求。

  4. 网络适应性: 在跨越不同网络环境的分布式系统中,DDS需要适应各种网络条件,如高延迟、不稳定连接等。调优可以帮助DDS在不同网络环境下保持稳定的通信,并减少数据丢失的可能性。

  5. 安全性: 对于一些安全性要求较高的应用,DDS需要配置加密和认证机制,以保护数据的机密性和完整性。

  6. 调试和故障排除: 调优也有助于发现和解决DDS在系统中可能出现的问题,提高系统的稳定性和可靠性。

综上所述,DDS调优是为了使DDS能够更好地适应特定的应用场景和硬件平台,提高系统的性能、实时性和可靠性,确保分布式系统能够顺利地进行数据通信和协作。

1. 具体操作

1.1 Cyclone DDS 调优参数设置

下面内容需要同时在边缘端和 PC 端进行设置。

首先,安装并配置环境变量:

sudo apt install ros-foxy-rmw-cyclone-cpp
echo 'export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp' &gt;&gt; ~/.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 文件,内容如下:

&lt;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"&gt;
&lt;Domain id="any"&gt;
&lt;Internal&gt;
&lt;MinimumSocketReceiveBufferSize&gt;1024MB&lt;/MinimumSocketReceiveBufferSize&gt;
&lt;/Internal&gt;
&lt;/Domain&gt;
&lt;/CycloneDDS&gt;

最后,在终端中临时加载上面参数文件:

CYCLONEDDS_URI=/path/to/config.xml

1.2 局域网配置

确保边缘计算设备和 PC 通过 Wi-Fi 或有线连接到同一个局域网,如果设备很多,都是通过同一个局域网,且想对设备进行分组进行分布式通信,可以设置下面参数,设置了相同编号的设备之间就可以进行通信了,不设置的话就是所有设备之间都可以进行通信:

echo 'export ROS_DOMAIN_ID=5' &gt;&gt; ~/.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 仓库链接&#xff1a;Hikvision Camera ROS2 package 0.1 问题背景 上一篇[博客](【图像与点云融合教程&#xff08;四&#xff09;】海康相机 ROS2 功能包 - 古月居 (guyuehome.com))介绍了我开源的海康相机 ROS2 功能包&#xff0c;在本地机器上可以实时订…...

正则截取字符窜数字,字母,符号部分

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生成跨语言翻译的精确提示 在跨语言交流中&#xff0c;为了确保翻译的准确性&#xff0c;生成精确的提示&#xff08;Prompt&#xff09;来指导ChatGPT翻译内容是至关重要的。无论是要处理复杂的技术术语、俚语&#xff0c;还是保持特定的语言风格&#xff0c;使用有…...

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…...

使用VBA宏合并多个Excel文件的Sheet页

使用VBA宏合并多个Excel文件的Sheet页 在日常的Excel数据处理工作中&#xff0c;我们经常需要将多个Excel文件中的工作表合并到一个Excel文件中。这种操作可以极大地提高数据处理效率&#xff0c;但如果文件数量较多&#xff0c;手动合并会非常繁琐。本文将介绍如何使用VBA宏来…...

Anolis8防火墙安全设置

一、账号安全 1、禁止root远程登录 首先创建一个普通用户&#xff0c;然后修改系统配置禁止root登录&#xff0c;因为root作为系统默认的超级管理员&#xff0c;权限过大&#xff0c;日常操作使用易导致安全风险。 1.1、首先要建立一个新的登录用户 useradd username #增…...

标题:自动化运维:现代IT运维的革新力量

标题&#xff1a;自动化运维&#xff1a;现代IT运维的革新力量 随着信息技术的飞速发展&#xff0c;企业对于IT系统的依赖日益加深&#xff0c;运维工作的重要性也愈发凸显。传统的运维模式&#xff0c;往往依赖于人工操作&#xff0c;效率低下且容易出错&#xff0c;难以满足…...

无人机之姿态融合算法篇

无人机的姿态融合算法是无人机飞行控制中的核心技术之一&#xff0c;它通过将来自不同传感器的数据进行融合&#xff0c;以实现更加精确、可靠的姿态检测。 一、传感器选择与数据预处理 无人机姿态融合算法通常依赖于多种传感器&#xff0c;包括加速度计、陀螺仪、磁力计等。这…...

Redis系列---数据管理

目录标题 数据类型String优点缺点底层结构使用场景实际使用 List优点缺点底层结构使用场景实际使用 Hash优点缺点底层结构使用场景实际使用 Set优点缺点底层结构使用场景实际使用 Zset优点缺点底层结构使用场景实际使用 HyperLogLog优点缺点底层结构使用场景实际使用 GEO优点缺…...

【Linux系统编程】第四十二弹---多线程编程全攻略:涵盖线程创建、异常处理、用途、进程对比及线程控制

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程创建 2、线程异常 3、线程用途 4、进程 VS 线程 5、线程控制 5.1、创建和等待线程 1、线程创建 线程能看到进程的大…...

Rust 力扣 - 2379. 得到 K 个黑块的最少涂色次数

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 本题可以转换为求长度为k的子数组中白色块的最少数量 我们遍历长度为k的窗口&#xff0c;我们只需要记录窗口内的白色块的数量即可&#xff0c;遍历过程中刷新白色块的数量的最小值 题解代码 impl Solution {…...

“单元测试”应该怎么写比较好

如何正确写单元测试 单元测试重要性写单元测试时存在的问题1、如何命名测试类&方法1.1、测试类命名规范1.2、测试方法命名规范 2、测试类的要求2.1测试行覆盖率100%2.2、单一职责2.3、可重复2.4、外部隔离&#xff0c;无任何外部依赖2.5、正确的使用断言2.6、不应该为了测试…...

腾讯开源首个文图生3D大模型Hunyuan3D-1.0

&#x1f989; AI新闻 &#x1f680; 腾讯开源首个文图生3D大模型Hunyuan3D-1.0 摘要&#xff1a;腾讯混元于11月5日开源了Hunyuan3D-1.0&#xff0c;这是首个同时支持文本生成和图像生成的3D开源大模型。该模型采用两阶段生成方法&#xff0c;可以在10秒内生成3D资产。第一阶…...

c语言简单编程练习10

1、typedef和#define的区别 在用作数据类型替换时的区别&#xff1a; #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要&#xff1b; #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个字节存储&#xff0c;实现存放&#xff0c;A[0][0]的起始地址为1000,计算&#xff1a; (10分) (1)数组最后一个元素A[5][7]的起始地址&#xff1b; (2)按行优先存放时&#xff0c;元素A[1][4]的起始地址&#xff1b; (3)按列优先存放时…...

DBAPI连接阿里云 maxcompute 报错

使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar &#xff0c;这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar&#xff0c;这个不是完整的&#xff0c;它还…...

Web3对社交媒体的影响:重新定义用户互动方式

随着互联网的发展和人们对隐私、安全、所有权的需求不断提高&#xff0c;Web3 的概念逐渐深入人心。Web3 的出现标志着一个去中心化、用户主导的网络时代的到来&#xff0c;这也将对社交媒体产生深远的影响。Web3 不仅推动社交媒体从中心化模式向用户主导的去中心化模式转变&am…...

【LeetCode】【算法】322. 零钱兑换

LeetCode 322. 零钱兑换 题目 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回-1。 你可以认为每…...

人工智能技术:未来生活的“魔法师”

想象一下&#xff0c;未来的某一天&#xff0c;你醒来时&#xff0c;智能助手已经为你准备好了早餐&#xff0c;你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐&#xff0c;而你的自动驾驶汽车已经在门口等你。这不是科幻小说&#xff0c;这是人工智能技术为我…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...