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

ROS2 Topic 传输机制:板内 vs 跨板

ROS2 Topic 传输机制板内 vs 跨板1. 两种传输方式2. 传输决策逻辑场景传输方式是否反序列化同进程同节点Intra-Process (Zero-Copy)❌ 不需要同进程不同节点Intra-Process❌ 不需要不同进程DDS (UDP/TCP/Shared Memory)✅ 需要不同板块DDS (网络)✅ 需要3. Intra-Process (板内) 传输原理核心特性使用IntraProcessBuffer直接传递消息指针无需反序列化消息以 ROS 消息对象形式传递Zero-Copy发布者直接将消息存入订阅者的缓冲区源码分析// intra_process_buffer.hpp// 板内传输直接传递 shared_ptr不经过序列化/反序列化// 添加消息到缓冲区共享方式virtualvoidadd_shared(MessageSharedPtr msg){buffer_-enqueue(std::move(shared_msg));// 直接存入指针}// 从缓冲区消费消息virtualMessageSharedPtrconsume_shared(){returnbuffer_-dequeue();// 直接取出指针无拷贝}传输流程Publisher::publish() ↓ IntraProcessManager::match_publishers_to_subscriptions() ↓ IntraProcessBuffer::add_shared(msg) // 直接存入订阅者缓冲区 ↓ 订阅者通过 wait() 收到通知直接取用消息对象关键代码位置rclcpp/experimental/intra_process_manager.hpp- 进程内通信管理器rclcpp/experimental/buffers/intra_process_buffer.hpp- 进程内缓冲区rclcpp/intra_process_setting.hpp- 进程内通信配置4. DDS 传输 (跨板) 原理需要反序列化的原因DDS 层使用 CDR (Common Data Representation) 序列化数据在网络上以字节流传输订阅端必须反序列化为 ROS 消息对象传输流程Publisher::publish() ↓ rmw_publish() // 序列化: ROS Msg → CDR bytes ↓ RMW (FastDDS/CycloneDDS) ↓ 网络传输 (UDP/TCP/Shmem) ↓ Subscription::take() // 反序列化: CDR bytes → ROS Msg ↓ 回调函数收到消息对象5. use_intra_process_comms 配置场景场景1: use_intra_process_comms true问题: 既有板内订阅又有跨板订阅Topic 默认用什么方式传输┌─────────────────────────────────────────────────────────────────────┐ │ use_intra_process_comms true │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Publisher │ │ │ │ │ ├──► 板内订阅A ──► Intra-Process (Zero-Copy, 无序列化) │ │ │ │ │ └──► 跨板订阅B ──► DDS (需序列化) │ │ │ └─────────────────────────────────────────────────────────────────────┘答案: 同时使用两种方式板内订阅→Intra-Process(Zero-Copy无序列化)跨板订阅→DDS(需要序列化)Publisher 会双重发布一份通过IntraProcessManager发给板内订阅者一份通过 DDS/RMW 发给跨板订阅者源码逻辑sub// IntraProcessManager 会检查匹配的订阅者// 如果存在跨进程的订阅者仍然会走 DDS 路径if(can_communicate(publisher,subscription)){// 板内通信IntraProcessBuffer}else{// 跨进程通信DDS}pubpublish(std::unique_ptrT,ROSMessageTypeDeletermsg){if(!intra_process_is_enabled_){this-do_inter_process_publish(*msg);return;}// If an interprocess subscription exist, then the unique_ptr is promoted// to a shared_ptr and published.// This allows doing the intraprocess publish first and then doing the// interprocess publish, resulting in lower publish-to-subscribe latency.// Its not possible to do that with an unique_ptr,// as do_intra_process_publish takes the ownership of the message.// When durability is set to TransientLocal (i.e. there is a buffer),// inter process publish should always take place to ensure// late joiners receive past data.boolinter_process_publish_neededget_subscription_count()get_intra_process_subscription_count()||buffer_;if(inter_process_publish_needed){autoshared_msgthis-do_intra_process_ros_message_publish_and_return_shared(std::move(msg));if(buffer_){buffer_-add_shared(shared_msg);}this-do_inter_process_publish(*shared_msg);}else{if(buffer_){autoshared_msgthis-do_intra_process_ros_message_publish_and_return_shared(std::move(msg));buffer_-add_shared(shared_msg);}else{this-do_intra_process_ros_message_publish(std::move(msg));}}}场景2: use_intra_process_comms false问题: 关闭后板内和板间都有订阅板内需要反序列化吗┌─────────────────────────────────────────────────────────────────────┐ │ use_intra_process_comms false │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ Publisher │ │ │ │ │ ├──► 板内订阅A ──► DDS (需序列化) ◄── 需要反序列化! │ │ │ │ │ └──► 跨板订阅B ──► DDS (需序列化) ◄── 需要反序列化 │ │ │ └─────────────────────────────────────────────────────────────────────┘答案: 需要反序列化关闭 Intra-Process 后所有订阅都走 DDS序列化ROS Msg → CDR bytes本地回环或网络传输反序列化CDR bytes → ROS Msg即使是同一个板内的订阅也需要完整的序列化/反序列化过程。6. 对比总结配置板内订阅跨板订阅序列化/反序列化use_intra_process_commstrueIntra-Process ✅DDS跨板需要use_intra_process_commsfalseDDSDDS都需要7. 性能影响场景延迟备注true 板内~1μsZero-Copy最优true 跨板~100μsDDS 序列化false 板内~100μs吃大亏!绕道 DDSfalse 跨板~100μs正常 DDS8. 如何启用 Intra-Process方式1: Node 级别默认启用rclcpp::NodeOptions options;options.use_intra_process_comms(true);// 默认 trueautonodestd::make_sharedrclcpp::Node(my_node,options);方式2: Publisher/Subscriber 级别控制// 显式启用autopubnode-create_publisherstd_msgs::msg::String(topic,rclcpp::QoS(10),rclcpp::IntraProcessSetting::Enable// 显式启用);// 显式禁用强制走 DDSautopub2node-create_publisherstd_msgs::msg::String(topic,rclcpp::QoS(10),rclcpp::IntraProcessSetting::Disable// 强制 DDS);IntraProcessSetting 枚举enumclassIntraProcessSetting{Enable,// 显式启用进程内通信Disable,// 显式禁用进程内通信NodeDefault// 跟随 Node 的默认设置};9. Zero-Copy 优化我们生成的优化文件optimized_message_pool.hpp进一步优化了消息传递// Zero-Copy 消息池classOptimizedMessagePool{public:// 预分配消息缓冲区// 指针直接复用// 减少内存分配/释放开销MessageT*allocate();// 从池中获取voiddeallocate(MessageT*msg);// 归还到池};10. 配置建议推荐配置// ✅ 推荐保持默认启用 intra-processrclcpp::NodeOptions options;options.use_intra_process_comms(true);// 默认就是 true何时禁用只有在下述情况才考虑禁用// 场景1明确知道只需要跨板通信不需要板内通信rclcpp::NodeOptions options;options.use_intra_process_comms(false);// 场景2调试时需要抓包分析 DDS 流量// 禁用后所有流量都走 DDS可以用 Wireshark 观察⚠️ 注意事项禁用use_intra_process_comms不会让板内订阅变快反而会强制走 DDS 路径增加不必要的序列化开销如果可能存在跨板订阅禁用会损失性能11. 总结板内订阅 (Intra-Process)Zero-Copy无需序列化/反序列化延迟极低 (~1μs)消息以shared_ptr形式直接传递跨板订阅 (DDS)需要 CDR 序列化/反序列化延迟较高 (~100μs)支持跨进程、跨机器通信use_intra_process_comms true:板内Zero-Copy无序列化跨板DDS 序列化同时支持两种路径use_intra_process_comms false:全部走 DDS板内也需要反序列化性能最差默认行为ROS2 默认启用 Intra-Process系统自动选择最优传输路径

相关文章:

ROS2 Topic 传输机制:板内 vs 跨板

ROS2 Topic 传输机制:板内 vs 跨板 1. 两种传输方式2. 传输决策逻辑场景传输方式是否反序列化同进程同节点Intra-Process (Zero-Copy)❌ 不需要同进程不同节点Intra-Process❌ 不需要不同进程DDS (UDP/TCP/Shared Memory)✅ 需要不同板块DDS (网络)✅ 需要3. Intra-…...

OpenClaw部署失败怎么办?云服务器常见问题汇总

很多开发者在部署OpenClaw时都会遇到各种问题,例如:安装失败、服务启动不了、端口无法访问等。OpenClaw部署失败到底该怎么解决?答案是:大部分部署问题其实都来自环境配置错误,例如Node.js版本不符合要求、服务器端口未…...

2026年丰县服务商TOP10榜单揭晓:谁才是口碑与效率双赢的行业标杆?

朋友们,最近丰县商家圈子里都在传一份榜单,说是2026年本地服务商TOP10。我特意去打听了一圈,发现这事儿挺有意思。有人说榜单是“虚名”,也有人说这是“风向标”。今天咱不吹不黑,就聊聊这份榜单背后,商家们…...

景区复购率低迷?全流程服务盘活留量|巨有科技

文旅行业复苏后,绝大多数景区都陷入了同一个运营怪圈:砸重金做营销、拓渠道抢新客,节假日客流爆满看似热闹,可游客离园之后,就彻底和景区断了联系,二次到访、多次复购的游客少之又少,老客留存率…...

电磁兼容性(EMC)设计与实践

现代工业自动化与智能制造领域,串口屏作为人机交互(HMI)的核心组件,其稳定性直接决定了设备的控制精度与用户体验。面对复杂的电磁环境,电磁兼容性(EMC)设计成为确保淘晶驰串口屏稳定运行的关键…...

通过fetch下载文件、音视频、图片

项目需要下载文件,后端接口返回的是文件的url地址,不是文件流 问题:直接通过a标签下载文件,若是接口返回音视频链接点击下载则是直接打开播放,不会下载 解决:使用 fetch 请求文件并将其下载到本地&#xff…...

谷歌浏览器更新后 localhost 127.0.0.1等本地服务器无法访问解决办法

今天2026-03-13谷歌更新版本后本地起前端服务谷歌浏览器所有本地服务均无法打开均报错为:ERR_CONNECTION_TIMED_OUT经过不段尝试 发现找到如下目录C:\Users\{xxxxxx}\AppData\Local\Google\Chrome\User Dataxxxx为win11用户名称 可自行替换找到根目录下Local State …...

基于SpringBoot+Vue的社区互助系统毕设项目(完整源码+论文+部署)

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css 开发工具:IDEA/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JDK版本&#…...

恳请大佬帮忙解惑!!!想用python写一个PDF图片转为excel表格的小工具

恳请大佬帮忙解惑,想用python写一个PDF图片转为excel表格的小工具,利用OCR来进行,但是效果不是很好,乱码比较多。恳求大佬帮忙!!!!...

扣子平台创建自己的插件

一、插件:里面有很多的工具 二、网页打开聚合数据(这是一个拥有很多工具的网站,可以通过API调用) 1、官网:https://www.juhe.cn/docs 2、注册、登录、认证 3、选择一个免费的工具,点击申请 4、申请完的工…...

硬盘二次开盘救回珍贵数据✨

临近春节假期,老客户的西数2T移动硬盘磁头坏了。由于我们公司春节提前放假了,客户着急忙慌的找其他小公司开盘恢复,直接判定盘片划伤无法恢复客户不甘心,等春节假期结束上班后找回我们,经检测硬盘其中有1张碟片严重划伤…...

基于Skynet增加RSA签名

一、背景 最近接入skynet做游戏的时候, 需要做一个自研 SDK 埋点对接,游戏服务器与 SDK 服务器通信需使用 RSA 签名规则: 游戏服务器调用 SDK:使用私钥签名(SHA1WithRSA) SDK 通知游戏服务器:使用公钥验签(SHA1WithRSA) 密钥编码:base64 所以写这个文档用于记录 二…...

【Java八股锁机制的认识】synchronized和reentrantlock区分,锁升级机制

synchronized和reentrantlock及其应用场景? synchronized 是什么 synchronized 是 Java 提供的 内置锁机制。 核心一句话:保证同一时间只有一个线程执行某段代码。例如 同时调用三个线程:线程A,线程B,线程C 有synchron…...

百考通AI文献综述:让研究起点更清晰

在学术研究的起步阶段,文献综述始终是奠定研究基础、厘清研究脉络的核心环节。它不仅需要广泛检索国内外文献,更要系统梳理研究进展、提炼核心观点、指出研究空白,对文献积累不足、时间精力有限的学子而言,常常陷入“文献难找、梳…...

题目2267:蓝桥杯2016年第七届真题-取球博弈

#include<iostream> #include<algorithm> using namespace std; int n[5], vis[1000][2][2];int dfs(int x, int f, int s) {if(vis[x][f%2][s%2] ! 2) {return vis[x][f%2][s%2];}if(x < n[1]) { // 不能取球了if((f%2 1) && (s%2 0)) return 1;els…...

混频器在雷达模块中的作用及原理……

混频器在雷达模块中的作用及原理…… 在超外差接收机里&#xff0c;正是混频器这个器件&#xff0c;把刚才聊的 RF&#xff08;射频&#xff09;和 IF&#xff08;中频&#xff09;联系在了一起。 如果说放大器是让信号变得更大&#xff0c;滤波器是让信号变得更纯&#xff0c;…...

百考通AI毕业论文智能生成,让学术创作高效又专业

又到毕业季&#xff0c;毕业论文成了无数学子的“心头大山”&#xff1a;选题迷茫、框架难搭、内容空洞、格式繁琐&#xff0c;从开题到定稿&#xff0c;每一步都充满挑战。熬夜赶稿、反复修改、焦虑失眠&#xff0c;成了很多毕业生的常态。百考通AI依托前沿人工智能技术&#…...

99个大模型在各个行业的应用的案例【2026最新】

精选99个标杆案例&#xff0c;划分为三大类别&#xff1a;45个"行业赋能"案例聚焦新型工业化、能源、医疗、政务等重点领域&#xff1b;46个"智能应用"案例覆盖天文、农业、化学等科学领域&#xff1b;8个"生态服务"案例包含智能数据标注、大模型…...

商务请客,没带“名牌酒”怎么开场?这3句话,比砸钱更显品位

在商务社交的江湖里&#xff0c;酒桌从来不是为了填饱肚子&#xff0c;而是一场关于尊重、资源与品位的无声博弈。过去&#xff0c;大家习惯了用“硬通货”来砸开信任的大门。但近两年&#xff0c;风向变了。随着商务环境回归理性&#xff0c;越来越多的“老江湖”发现&#xf…...

Hadoop 2.7.3 集群部署、配置与环境变量调优全流程总结

本次完成了基于 master/slave1/slave2 三节点的 Hadoop 分布式集群部署&#xff0c;核心涵盖集群基础配置、环境变量调优、问题排查与验证&#xff0c;最终实现集群全功能可用&#xff0c;以下是完整总结&#xff1a;一、核心部署与配置流程1. 基础环境准备&#xff08;前置步骤…...

SpringBoot如何调用节假日API

RestTemplate配置自行定义 工具类 Slf4j Component public class HolidayUtils {Resourceprivate RestTemplate restTemplate;private final static String KEY "http://tool.bitefu.net/jiari?d";public String getHoliday(long baselineDate) {DateTimeFormatter…...

Claude code学习记录

Claude代码学习过程记录技术文章大纲 参考文献&#xff1a;Claude Code首次使用指南&#xff1a;十分钟创建完整项目 | 果叔AI世界 学习准备阶段 下载git bush&#xff0c;提供类似linux的命令行环境&#xff0c;git安装路径&#xff1a;Git - Install 1.安装Node.js 访问官…...

解决brew安装慢问题

用 brew 安装软件慢&#xff0c;通常是因为默认的官方源服务器在国外。解决的核心思路就是将默认源替换为国内的镜像源。对于2025年的新版 Homebrew&#xff0c;有一个关键的新步骤需要留意。 &#x1f4a1; 核心原因 Homebrew 慢主要是因为它的核心仓库和软件包&#xff08;Bo…...

Ubuntu 22.04新建用户,并赋予管理权限

在Ubuntu系统中&#xff0c;有一种特殊的用户&#xff1a;超级用户&#xff08;root&#xff09;。 root用户&#xff0c;权限太大&#xff0c;可以对系统进行任意操作。例如&#xff1a;删除系统文件等危险操作。为了避免误操作导致系统崩溃或数据丢失&#xff0c;我们一般不使…...

别卷加班了!未来企业只拼这3点,玄同科技早已替你铺好赢路

凌晨三点的写字楼还亮着半栋灯&#xff0c;HR在疯狂筛简历&#xff0c;财务在熬夜做报表&#xff0c;市场部在反复修改方案——你以为这是“努力”&#xff0c;其实是在被时代淘汰。OpenAI的CEO Sam Altman早就点破了未来商业的真相&#xff1a;“以后会有一个人的独角兽”。不…...

云南省2026上半年软考报名时间已出!

报名时间&#xff1a;2026年3月16日9:00-4月10日17:00报名方式&#xff1a;报考人员登录云南省计算机技术与软件专业技术资格考试网站&#xff0c;点击“考试报名”快速入口&#xff0c;选择“云南”按提示进行注册登录&#xff0c;进行网上报名。报名要求&#xff1a;报考人员…...

BUUCTF Misc base64隐写+我有一只马里奥+黑客帝国

题目31 base64隐写 Flag&#xff1a;flag {6aseb4_f33!} 下载附件结果是个tar文件&#xff0c;拖到随波分析一下发现内部含有zip压缩包&#xff0c;放到kali虚拟机里面进行foremost分离&#xff0c;成功得到一张照片和一个文档。 但是扫出来就是一个微信下载的网址&#xff0…...

计算机网络————IP地址分类以及网络地址的计算[通俗易懂]

大家好&#xff0c;又见面了&#xff0c;我是你们的朋友全栈君。 一&#xff0c;IP地址分类 1.二进制与十进制的关系 2&#xff0c;IP地址的地址结构及分类 IP地址结构&#xff1a;网络号主机号 网络号&#xff1a;中主机中指明中的所在物理网络的编号 主机号&#xff1a;…...

关于字符串String类常用方法总结【简洁版】

1.字符串构造 // 使用字符串常量进行赋值String s1 "hello bit"; System.out.println(s1);// 直接new String对象String s2 new String("hello bit"); System.out.println(s1);// 使用字符数组进行构造char[] array { h, e, l, l, o, b, i, t};String s…...

2026年广东省职业院校技能大赛(高职组)移动应用设计与开发赛项样题(二)

2026年广东省职业院校技能大赛&#xff08;高职组&#xff09;移动应用设计与开发赛项样题&#xff08;二&#xff09; 文章目录2026年广东省职业院校技能大赛&#xff08;高职组&#xff09;移动应用设计与开发赛项样题&#xff08;二&#xff09;任务一 产品原型设计任务 1&a…...