ros2_01
note01
ROS2和ROS最大的区别中间件
中间件:
- 介于某两个或者多个节点中间的组件;
- 提供多个节点中间通信;
ROS1:中间件是ROS组织自己基于TCP机制建立的,随着现在传感器的升级,数据量越来越大,原先的数据拷贝机制就不再适了
ROS2:
- 将进程间通信intra-process自己来做
- 其他部分的通信就使用来DDS实现
- ROS2将DDS服务接口进行了一层抽象,保证了上层应用层调用接口的统一性
- ROS2去掉mater节点
DDS
Data Distribution Service:一种用于分布式系统的通信中间件标准
key points:
- 发布-订阅模式:
- 数据生产者(Publisher)发布数据到主题(Topic)
- 数据消费者(Subscriber)订阅感兴趣的主题
- 发布者和订阅者之间是解耦的,不需要知道彼此的存在
- 数据为中心:
- DDS以数据为中心,而不是以节点为中心
- 数据通过主题进行标识,主题是数据的逻辑分类
- 实时性:
- DDS设计用于实时系统,支持低延迟和高吞吐量的数据传输
Domain
定义:一个逻辑隔离的通信空间,只有在同一个域中的节点才能互相通信;每个域有一个唯一的 Domain ID,用于标识不同的域
作用:
- 隔离通信:不同域中的节点无法互相通信,即使它们在同一个网络中
- 灵活性:可以通过 Domain ID 将系统划分为多个独立的通信空间
Fast DDS中的Domain 通过 DomainParticipant 来管理的
#include <fastdds/dds/domain/DomainParticipant.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>int main() {// 创建 DomainParticipanteprosima::fastdds::dds::DomainParticipant* participant =eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->create_participant(0);// 检查是否创建成功if (participant == nullptr) {std::cerr << "Failed to create DomainParticipant!" << std::endl;return -1;}std::cout << "DomainParticipant created successfully!" << std::endl;// 清理资源eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->delete_participant(participant);return 0;
}
DomainParticipantFactory:- 用于创建和管理
DomainParticipant - 通过
get_instance()获取单例对象
- 用于创建和管理
create_participant(domain_id):- 创建一个
DomainParticipant,参数domain_id指定域的 ID - 返回一个指向
DomainParticipant的指针
- 创建一个
delete_participant(participant):- 删除
DomainParticipant,释放资源
- 删除
Topic
Topic是数据的逻辑分离,每个 Topic 有一个名称和一个数据类型;
发布者(Publisher)将数据发布到 Topic,订阅者(Subscriber)从 Topic 中订阅数据
作用:
- 数据分类:通过 Topic 将数据分类,例如“温度数据”或“位置数据”
- 解耦:发布者和订阅者不需要知道彼此的存在,只需要知道 Topic 的名称和数据类型
#include <fastdds/dds/domain/DomainParticipant.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <fastdds/dds/topic/Topic.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>// 自定义数据类型
class HelloWorld {
public:std::string message;
};int main() {// 创建 DomainParticipanteprosima::fastdds::dds::DomainParticipant* participant =eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->create_participant(0);// 注册数据类型eprosima::fastdds::dds::TypeSupport type(new HelloWorldPubSubType());type.register_type(participant);// 创建 Topiceprosima::fastdds::dds::Topic* topic = participant->create_topic("HelloWorldTopic", // Topic 名称type.get_type_name(), // 数据类型名称eprosima::fastdds::dds::TOPIC_QOS_DEFAULT // QoS 配置);if (topic == nullptr) {std::cerr << "Failed to create Topic!" << std::endl;return -1;}std::cout << "Topic created successfully!" << std::endl;// 清理资源participant->delete_topic(topic);eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->delete_participant(participant);return 0;
}
- TypeSupport:
- 用于注册和管理数据类型
HelloWorldPubSubType是自动生成的数据类型支持
create_topic(name, type_name, qos):- 创建一个 Topic,参数包括 Topic 名称、数据类型名称和 QoS 配置
- 返回一个指向
Topic的指针
delete_topic(topic):- 删除 Topic,释放资源
Publisher 和 Subscriber
- Publisher:负责将数据发布到 Topic
- Subscriber:负责从 Topic 订阅数据
Topic实现:
- 观察者模式(Observer Pattern):
- Topic 是数据的逻辑分类,发布者(Publisher)和订阅者(Subscriber)通过 Topic 进行解耦
- 发布者将数据发布到 Topic,Topic 负责将数据分发给所有订阅了该 Topic 的订阅者
- 中介者模式(Mediator Pattern):
- Topic 充当发布者和订阅者之间的中介者,负责管理数据的传递
- 发布者和订阅者不需要直接交互,而是通过 Topic 进行通信
Publisher实现:
- Publisher 通过
DomainParticipant的工厂方法(如create_publisher)创建 - 代理模式(Proxy Pattern):
- Publisher 是数据发布的代理,负责将数据写入 DDS 中间件
- 实际的网络通信和数据传输由 DDS 中间件处理,Publisher 只是一个接口
- Publisher 内部维护了一个或多个
DataWriter,用于将数据写入 Topic
DataWriter
DataWriter是publisher一部分,负责将数据写入topic
- 数据写入:将应用程序生成的数据发布到 DDS 中间件
- QoS 管理:根据配置的 QoS 策略(如可靠性、持久性等)处理数据
- 生命周期管理:管理数据的生命周期,例如数据的创建、更新和删除
ROS2的DDS
DDS抽象:
- 节点:
- ROS 2 引入了 Node 的概念,封装了 DDS 中的
DomainParticipant - 只需要创建和管理 Node,而不需要直接操作
DomainParticipant
- ROS 2 引入了 Node 的概念,封装了 DDS 中的
- Publisher和Subscriber
- ROS 2 的
Publisher和Subscriber是对 DDS 中DataWriter和DataReader的封装 - 只需要指定 Topic 名称和数据类型,ROS 2 会自动处理底层的 DDS 对象
- ROS 2 的
- 消息Message
- ROS 2 使用 消息 作为数据传输的基本单位,消息类型通过
.msg文件定义
- ROS 2 使用 消息 作为数据传输的基本单位,消息类型通过
- 统一的API
- ROS 2 通过 RMW(ROS Middleware Interface) 抽象了底层 DDS 实现的差异
- 每种 DDS 实现(如 Fast DDS、Cyclone DDS)都有一个对应的 RMW 实现
- 通过环境变量选择使用的 DDS 实现
相关文章:
ros2_01
note01 ROS2和ROS最大的区别中间件 中间件: 介于某两个或者多个节点中间的组件;提供多个节点中间通信; ROS1:中间件是ROS组织自己基于TCP机制建立的,随着现在传感器的升级,数据量越来越大,原…...
C++中的高阶函数
C中的高阶函数 高阶函数是指可以接受其他函数作为参数或返回函数作为结果的函数。在C中,有几种方式可以实现高阶函数的功能: 1. 函数指针 #include <iostream>int add(int a, int b) { return a b; } int subtract(int a, int b) { return a -…...
计算机视觉与深度学习 | 钢筋捆数识别
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 钢筋捆数 1、初始结果2、处理效果不佳时的改进方法1、预处理增强2、后…...
L3-027 可怜的复杂度(纯暴力)
暴力解答,肯定超时,因为我刚开始把所有答案,存到了ans这个vector里面了,然后进行枚举情况,后面发现因为这个阶数很高的时候,就会直接炸内存,所以我直接选择了在dfs里面进行统计答案,…...
基于RV1126开发板的人脸姿态估计算法开发
1. 人脸姿态估计简介 人脸姿态估计是通过对一张人脸图像进行分析,获得脸部朝向的角度信息。姿态估计是多姿态问题中较为关键的步骤。一般可以用旋转矩阵、旋转向量、四元数或欧拉角表示。人脸的姿态变化通常包括上下俯仰(pitch)、左右旋转(yaw)以及平面内角度旋转(r…...
鲲鹏+昇腾部署集群管理软件GPUStack,两台服务器搭建双节点集群【实战详细踩坑篇】
前期说明 配置:2台鲲鹏32C2 2Atlas300I duo,之前看网上文档,目前GPUstack只支持910B芯片,想尝试一下能不能310P也部署试试,毕竟华为的集群软件要收费。 系统:openEuler22.03-LTS 驱动:24.1.rc…...
【C#】CAN通信的使用
在C#中实现CAN通信通常需要借助第三方库或硬件设备的驱动程序,因为C#本身并没有直接内置支持CAN通信的功能。以下是一个关于如何使用C#实现CAN通信的基本指南,包括所需的步骤和常用工具。 1. 硬件准备 要进行CAN通信,首先需要一个支持CAN协…...
火山引擎旗下的产品
用户问的是火山引擎旗下的产品,我需要详细列出各个类别下的产品。首先,我得确认火山引擎有哪些主要业务领域,比如云计算、大数据、人工智能这些。然后,每个领域下具体有哪些产品呢?比如云计算方面可能有云服务器、容器…...
Elasticsearch 故障转移及水平扩容
一、故障转移 Elasticsearch 的故障转移(Failover)机制是其高可用性的核心,通过分布式设计、自动检测和恢复策略确保集群在节点故障时持续服务。 1.1 故障转移的核心组件 组件作用Master 节点管理集群状态(分片分配、索引创建&…...
机器学习中 提到的张量是什么?
在机器学习中, 张量(Tensor) 是一个核心数学概念,用于表示和操作多维数据。以下是关于张量的详细解析: 一、数学定义与本质 张量在数学和物理学中的定义具有多重视角: 多维数组视角 传统数学和物理学中,张量被定义为多维数组,其分量在坐标变换时遵循协变或逆变规则。例…...
edge 更新到135后,Clash 打开后,正常网页也会自动跳转
发现了一个有意思的问题:edge 更新135后,以前正常使用的clash出现了打开deepseek也会自动跳转: Search Resultshttps://zurefy.com/zu1.php#gsc.tab0&gsc.qdeepseek ,也就是不需要梯子的网站打不开了,需要的一直正…...
prime 1 靶场笔记(渗透测试)
环境说明: 靶机prime1和kali都使用的是NAT模式,网段在192.168.144.0/24。 Download (Mirror): https://download.vulnhub.com/prime/Prime_Series_Level-1.rar 一.信息收集 1.主机探测: 使用nmap进行全面扫描扫描,找到目标地址及…...
实验一 字符串匹配实验
一、实验目的 1.熟悉汇编语言编程环境和DEBUG调试程序的使用。 2.掌握键盘输入字符串的方法和分支程序的设计。 二、实验内容 编程实现:从键盘分别输入两个字符串,然后进行比较,若两个字符串的长度…...
跨境电商中的几种支付方式——T/T、L/C、D/P、D/A、O/A
在进行跨境电商的B端系统设计时,需要考虑的关键方面之一是支付流程。它为交易的成功奠定了基础,并确保涉及的双方都受到保护。 在本文中,我们将深入探讨各种常见支付方式的复杂性,包括电汇 (T/T)、信用证 (L/C)、付款交单 (D/P)、…...
第16届蓝桥杯单片机模拟试题Ⅲ
试题 代码 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //sys.c extern unsigned char UI; //界面标志(0湿度界面、1参数界面、2时间界面) extern unsigned char time; //时间间隔(1s~10S) extern bit ssflag; //启动/停止标志…...
打造现代数据基础架构:MinIO对象存储完全指南
目录 打造现代数据基础架构:MinIO对象存储完全指南1. MinIO介绍1.1 什么是对象存储?1.2 MinIO核心特点1.3 MinIO使用场景 2. MinIO部署方案对比2.1 单节点单驱动器(SNSD/Standalone)2.2 单节点多驱动器(SNMD/Standalone Multi-Drive)2.3 多节点多驱动器(…...
OOM问题排查和解决
问题 java.lang.OutOfMemoryError: Java heap space 排查 排查手段 jmap命令 jmap -dump,formatb,file<file-path> <pid> 比如 jmap -dump:formatb,file./heap.hprof 44532 使用JVisualVM工具: JVisualVM是一个图形界面工具,它可以帮…...
OSI 七层模型与 TCP/IP 协议栈详解
OSI 七层模型与 TCP/IP 协议栈详解 网络协议模型是理解计算机网络和通信的基础,而 OSI 七层模型和 TCP/IP 协议栈是最常见的两种网络通信模型。虽然这两者有些不同,但它们都提供了一种分层的结构,帮助我们理解和设计网络通信。本文将详细介绍…...
「出海匠」借助CloudPilot AI实现AWS降本60%,支撑AI电商高速增长
🔎公司简介 「出海匠」(chuhaijiang.com)是「数绘星云」公司打造的社交内容电商服务平台,专注于为跨境生态参与者提供数据支持与智能化工作流。平台基于大数据与 AI 技术,帮助商家精准分析市场趋势、优化运营策略&…...
LeetCode[541]反转字符串Ⅱ
思路: 题目给我们加了几个规则,剩余长度小于2k,大于等于k就反转k个,小于k就全部反转,我们按照这个逻辑来就行。 第一就是大于等于k就反转k个,我们for循环肯定是i2k了,接下来就是判断是否大于等于…...
队列的各种操作实现(数据结构C语言多文件编写)
1.先创建queue.h声明文件(Linux命令:touch queue.h)。编写函数声明如下(打开文件 Linux 操作命令:vim queue.h): //头文件 #ifndef __QUEUE_H__ #define __QUEUE_H__ //队列 typedef struct queue{int* arr;int in;int out;int cap;int size; }queue_t;…...
# Unity动画控制核心:Animator状态机与C#脚本实战指南 (Day 29)
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
C++中extern关键字
C中extern关键字的完整用法总结 extern是C中管理链接性(linkage)的重要关键字,主要用于声明外部定义的变量或函数。以下是详细的用法分类和完整示例: 一、基本用法 1. 声明外部全局变量 // globals.cpp int g_globalVar 42; …...
【Python爬虫】简单案例介绍3
本文继续接着我的上一篇博客【Python爬虫】简单案例介绍2-CSDN博客 目录 3.3 代码开发 3.3 代码开发 编写代码的步骤: request请求科普中国网站地址url,解析得到类名为"list-block"的div标签。 for循环遍历这个div列表里的每个div࿰…...
计算机视觉与深度学习 | 视觉里程计(Visual Odometry, VO)学习思路总结
视觉里程计(Visual Odometry, VO)学习思路总结 视觉里程计(VO)是通过摄像头捕获的图像序列估计相机运动轨迹的技术,广泛应用于机器人、自动驾驶和增强现实等领域。以下是一个系统的学习路径,涵盖基础理论、核心算法、工具及实践建议:一、基础理论与数学准备 核心数学工具…...
android面试情景题详解:android如何处理断网、网络切换或低速网络情况下的业务连续性
在移动互联网时代,Android应用已经成为人们日常生活中不可或缺的一部分。从社交媒体到在线购物,从移动办公到娱乐消费,几乎所有的服务都依赖于网络连接。然而,网络环境并非总是稳定可靠。断网、网络切换(如从Wi-Fi切换…...
swift菜鸟教程6-10(运算符,条件,循环,字符串,字符)
一个朴实无华的目录 今日学习内容:1.Swift 运算符算术运算符比较运算符逻辑运算符位运算符赋值运算区间运算符其他运算符 2.Swift 条件语句3.Swift 循环4.Swift 字符串字符串属性 isEmpty字符串常量let 变量var字符串中插入值字符串连接字符串长度 String.count使用…...
质变科技发布自主数据分析MCP Server
2025年4月9日,质变科技正式发布Relyt AI MCP(Model Context Protocol),结合Relyt AI 在自主数据分析领域的前沿积累与MCP的开放连接能力,我们为用户带来了一个更智能、更灵活的数据交互生态系统。这一发布不仅拓展了Re…...
如何通过技术手段降低开发成本
通过技术手段降低开发成本的关键在于: 自动化工具的使用、优化开发流程、云计算资源的利用、开发技术栈的精简与创新、团队协作平台的高效管理。 其中,自动化工具的使用是最为有效的技术手段之一。自动化工具通过减少人工干预和重复性工作,大…...
Ubuntu上docker、docker-compose的安装
今天来实践下Ubuntu上面安装docker跟docker-compose,为后面安装dify、fastgpt做准备。 一、安装docker sudo apt-get updatesudo apt-get install docker.io 然后系统输入 docker --version 出现下图即为docker安装成功。 二、安装docker-compose 我先看下系统…...
