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

ROS 2 Composition简明教程

在传统的ROS 2开发中每个节点作为单独的OS进程运行。启动五个节点意味着五个独立的进程每个进程都有自己的内存空间——它们之间的每条消息都要跨越进程边界。这种方式安全且相互隔离但代价也不小序列化、反序列化和进程间通信IPC都会增加延迟和CPU开销。ROS 2 Composition通过在名为组件容器Component Container的单个进程中加载多个节点来解决这个问题。加载到同一容器中的节点通过进程内消息传递intra-process messaging进行通信——这意味着数据以指针形式传递而不是序列化和复制。最终结果是位于同一进程中的节点之间实现了近乎零延迟的通信。传统方式多进程 [Node A] --序列化→ IPC --反序列化→ [Node B] 组合方式单进程 [Component A] --指针→ [Component B]1、为什么你应该关注进程内通信消除了序列化和复制的开销。对于高频数据流如相机图像、激光雷达点云这种优化可能是关键路径。还有强大的运行时灵活性优势你可以动态地加载和卸载组件而无需重新编译或重启整个系统。这对于正常运行时间至关重要的生产级机器人系统来说非常宝贵。1.1 ROS 2组件的剖析ROS 2组件本质上是一个继承自rclcpp::Node的类并使用rclcpp_components宏注册为插件。就这么简单。没有特殊的基类也没有复杂的接口。组件容器rclcpp_components::ComponentManager通过pluginlib在运行时发现和加载这些插件。1.2 何时应该使用Composition使用Composition的场景节点紧密耦合且交换高频数据相机、激光雷达、IMU节点间延迟是硬性要求你需要运行时灵活性来加载/卸载行为你正在构建具有资源限制的生产系统避免使用Composition的场景节点需要严格的进程隔离一个节点崩溃不应导致其他节点崩溃你正在原型开发简单性比性能更重要节点来自不同的团队/包所有权不明确2、动手实践Hello World发布者组件我们将创建一个包其中包含一个简单的HelloWorldPublisher组件每秒发布一次问候消息。第1步创建包ros2 pkg create --build-type ament_cmake hello_world_composition \ --dependencies rclcpp rclcpp_components std_msgs第2步编写组件创建src/hello_world_publisher.cpp#include rclcpp/rclcpp.hpp #include std_msgs/msg/string.hpp #include rclcpp_components/register_node_macro.hpp namespace hello_world_composition { class HelloWorldPublisher : public rclcpp::Node { public: // 构造函数必须接受rclcpp::NodeOptions explicit HelloWorldPublisher(const rclcpp::NodeOptions options) : Node(hello_world_publisher, options), count_(0) { publisher_ this-create_publisherstd_msgs::msg::String(hello_topic, 10); timer_ this-create_wall_timer( std::chrono::seconds(1), [this]() { auto message std_msgs::msg::String(); message.data Hello, World! Count: std::to_string(count_); RCLCPP_INFO(this-get_logger(), Publishing: %s, message.data.c_str()); publisher_-publish(message); } ); RCLCPP_INFO(this-get_logger(), HelloWorldPublisher component initialized!); } private: rclcpp::Publisherstd_msgs::msg::String::SharedPtr publisher_; rclcpp::TimerBase::SharedPtr timer_; size_t count_; }; } // namespace hello_world_composition // 这个宏将类注册为ROS 2插件 RCLCPP_COMPONENTS_REGISTER_NODE(hello_world_composition::HelloWorldPublisher)核心要点RCLCPP_COMPONENTS_REGISTER_NODE宏使其成为一个组件。它将类注册到pluginlib系统使用容器查找和加载时所需的完全限定名称。NodeOptions构造函数是强制的——这是容器向节点传递配置的方式。第3步配置CMakeLists.txtcmake_minimum_required(VERSION 3.8) project(hello_world_composition) find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_components REQUIRED) find_package(std_msgs REQUIRED) # 将组件构建为共享库不是可执行文件 add_library(hello_world_publisher SHARED src/hello_world_publisher.cpp ) target_include_directories(hello_world_publisher PUBLIC $BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include $INSTALL_INTERFACE:include ) ament_target_dependencies(hello_world_publisher rclcpp rclcpp_components std_msgs ) # 注册组件以便容器可以发现它 rclcpp_components_register_nodes(hello_world_publisher hello_world_composition::HelloWorldPublisher ) install(TARGETS hello_world_publisher ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin ) ament_package()**为什么是共享库**组件容器使用dlopen()动态加载在运行时加载你的组件。这需要.so共享库而不是独立的可执行文件。第4步配置package.xml?xml version1.0? package format3 namehello_world_composition/name version0.0.1/version descriptionHello World ROS 2 Composition Example/description maintainer emailyouexample.comYour Name/maintainer licenseApache-2.0/license buildtool_dependament_cmake/buildtool_depend dependrclcpp/depend dependrclcpp_components/depend dependstd_msgs/depend export build_typeament_cmake/build_type /export /package第5步构建cd ~/your_ws colcon build --packages-select hello_world_composition source install/setup.bash3、运行组件方法1手动CLI—— 最适合开发在终端1中启动一个空的组件容器ros2 run rclcpp_components component_container在终端2中将组件加载到该容器中ros2 component load /ComponentManager \ hello_world_composition \ hello_world_composition::HelloWorldPublisher你应该立即在终端1中看到发布者开始记录日志。检查主题ros2 topic echo /hello_topic方法2启动文件—— 最适合生产创建launch/composition.launch.pyfrom launch import LaunchDescription from launch_ros.actions import ComposableNodeContainer from launch_ros.descriptions import ComposableNode def generate_launch_description(): container ComposableNodeContainer( namehello_container, namespace, packagerclcpp_components, executablecomponent_container, composable_node_descriptions[ ComposableNode( packagehello_world_composition, pluginhello_world_composition::HelloWorldPublisher, namehello_world_publisher, ), ], outputscreen, ) return LaunchDescription([container])然后运行ros2 launch hello_world_composition composition.launch.py4、检查运行中的容器Composition的最佳特性之一是运行时内省runtime introspection。当你的容器正在运行时# 列出所有已加载的组件 ros2 component list # 输出 # /ComponentManager # 1 /hello_world_publisher # 卸载组件通过ID ros2 component unload /ComponentManager 1你可以将多个组件加载到同一个容器中ros2 component load /ComponentManager my_pkg my_pkg::MySubscriber ros2 component load /ComponentManager my_pkg my_pkg::MyProcessor5、更大的图景ROS 2 Composition是生产级机器人的基础架构模式。在实际系统中你可能会有component_container_mt多线程容器 ├── CameraPublisher发布/image_raw ├── ImagePreprocessor订阅/image_raw发布/image_processed └── MLInferenceNode订阅/image_processed发布/detections这三个节点在进程内通信图像数据以指针形式传递。整个从相机到推理的管道运行时几乎没有IPC开销——这在多进程架构中根本不可能实现。6、结束语ROS 2 Composition不仅仅是一种优化——它是一种设计模式迫使你思考节点边界、数据所有权和系统架构。一旦你开始以组件的方式思考你会发现你的系统变得更加模块化、性能更高也更容易理解。原文链接ROS 2 Composition简明教程 - 汇智网

相关文章:

ROS 2 Composition简明教程

在传统的ROS 2开发中,每个节点作为单独的OS进程运行。启动五个节点意味着五个独立的进程,每个进程都有自己的内存空间——它们之间的每条消息都要跨越进程边界。这种方式安全且相互隔离,但代价也不小:序列化、反序列化和进程间通信…...

PotPlayer字幕翻译插件:3分钟配置,免费解锁全球视频内容

PotPlayer字幕翻译插件:3分钟配置,免费解锁全球视频内容 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为…...

Windows系统使用nvm实现多版本切换Node.js详细教程

一、什么是nvm-windows? nvm(Node Version Manager)是一个用于管理多个Node.js版本的工具。在Windows系统中,我们使用的是nvm-windows,它允许你在同一台电脑上安装、切换和管理多个Node.js版本,避免版本冲…...

大模型多租户配额管理(细粒度配额语义建模+RBAC+Quota Budgeting三位一体架构首次公开)

第一章:大模型工程化限流与配额管理 2026奇点智能技术大会(https://ml-summit.org) 在大规模语言模型服务化部署中,限流与配额管理是保障系统稳定性、公平性与成本可控性的核心机制。未加约束的并发请求易引发GPU显存溢出、推理延迟激增甚至服务雪崩&am…...

我不是狐狸,我是那Harness Engineering炙

Julia(julialang.org)由Stefan Karpinski、Jeff Bezanson等在2009年创建,目标是融合Python的易用性、C的高性能、R的统计能力、Matlab的科学计算生态。 其核心设计哲学是: 高性能:编译型语言(JIT&#xff0…...

gitru:一个由 Rust 打造的零依赖 Git 提交信息校验工具挡

一、项目背景与核心价值 1. 解决的核心痛点 Navicat的数据库连接密码并非明文存储,而是通过AES算法加密后写入.ncx格式的XML配置文件中。一旦用户忘记密码,常规方式只能重新配置连接,效率极低。本项目只作为学习研究使用,不做其他…...

网钛CMS:经典PHP内容管理系统的源码解析与博客搭建指南

在当今数字化浪潮中,内容管理系统(CMS)已成为网站建设的核心工具。对于追求高效、灵活且功能强大的博客站长而言,选择一款合适的CMS至关重要。网钛CMS作为一款经典的PHP内容管理系统,凭借其开源特性、丰富的功能模块和…...

终极指南:3分钟完成AI文本生成平台一键安装

终极指南:3分钟完成AI文本生成平台一键安装 【免费下载链接】one-click-installers Simplified installers for oobabooga/text-generation-webui. 项目地址: https://gitcode.com/gh_mirrors/on/one-click-installers 还在为复杂的AI环境配置而头疼吗&#…...

MeteorSeed下

这个代码的核心功能是:基于输入词的长度动态选择反义词示例,并调用大模型生成反义词,体现了 “动态少样本提示(Dynamic Few-Shot Prompting)” 与 “上下文长度感知的示例选择” 的能力。 from langchain.prompts impo…...

Python的asyncio事件循环与不同事件循环策略的性能影响分析

Python的asyncio事件循环与不同事件循环策略的性能影响分析 Python的asyncio模块为异步编程提供了强大的支持,其核心是事件循环机制。事件循环负责调度和执行异步任务,而不同的循环策略可能对性能产生显著影响。随着高并发应用需求的增长,理…...

统计学实战指南——指数在商业决策中的应用

1. 为什么商业决策需要指数分析? 每次看到超市里商品价格标签更换时,你可能不知道背后藏着大学问。去年我们服务的一家连锁超市就遇到个典型问题:他们发现牛奶销售额下降了15%,但单看进货价和售价都没变化。后来用价格指数分析才发…...

GB/T28181设备接入WVP平台保姆级教程:从海康到大华的配置避坑指南

GB/T28181设备接入WVP平台实战指南:海康/大华/宇视全品牌配置解析 第一次接触GB/T28181协议时,我盯着设备ID和SIP服务器配置页面发呆了半小时——这些看似简单的字段背后藏着太多细节陷阱。本文将用真实项目经验,带你拆解不同品牌设备在WVP平…...

终极指南:如何让macOS原生支持所有视频格式预览

终极指南:如何让macOS原生支持所有视频格式预览 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcode.com/…...

终极方案:如何在Windows上解锁Apple触控板的完整手势体验

终极方案:如何在Windows上解锁Apple触控板的完整手势体验 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchpad…...

DanmakuFactory:终极弹幕格式转换工具,轻松实现专业级视频互动

DanmakuFactory:终极弹幕格式转换工具,轻松实现专业级视频互动 【免费下载链接】DanmakuFactory 支持特殊弹幕的xml转ass格式转换工具 项目地址: https://gitcode.com/gh_mirrors/da/DanmakuFactory 你是否曾经遇到过这样的困扰:在B站…...

用一节干电池给STM32F103供电?手把手教你搞定体重秤的低功耗升压电路(附ME2108模块选型)

单节干电池驱动STM32F103的实战指南:从升压电路设计到低功耗优化 在电子设计领域,最令人着迷的挑战之一就是如何用最有限的能源实现最复杂的功能。想象一下,仅凭一节普通的AA干电池(1.5V)就能驱动一个完整的STM32F103微…...

前端使用AI试水报告扇

1 实用案例 1.1 表格样式生成 本示例用于生成包含富文本样式与单元格背景色的Word表格文档。 模板内容: 渲染代码: # python-docx-template/blob/master/tests/comments.py from docxtpl import DocxTemplate, RichText # data: python-docx-template/bl…...

佳能最新清零软件ServiceTool_v6.200 ,TS3380,G1800,G2810,G3810,G4810,MG3680,IX6700,代码5B00,P07,E08,1700,5b04,有效

下载:点这里下载 备用:https://pan.baidu.com/s/1WrPFvdV8sq-qI3_NgO2EvA?pwd0000 常见型号如下: G系列 G1000、G1100、G1200、G1400、G1500、G1800、G1900、G1010、G1110、G1120、G1410、G1420、G1411、G1510、G1520、G1810、G1820、G191…...

G3810,TS3380,G1800,G2810,G4810,MG3680,IX6780,MP288,TS8380打印机废墨垫清零软件,错误代码5B00,P07,E08,1700,5b04,亲测有效。

下载:点这里下载 备用:https://pan.baidu.com/s/1WrPFvdV8sq-qI3_NgO2EvA?pwd0000 常见型号如下: G系列 G1000、G1100、G1200、G1400、G1500、G1800、G1900、G1010、G1110、G1120、G1410、G1420、G1411、G1510、G1520、G1810、G1820、G191…...

STM32G474定时器PWM实战:从输出控制到输入捕获全解析

1. STM32G474定时器PWM基础概念 PWM(脉冲宽度调制)是嵌入式系统中最常用的信号控制技术之一。简单来说,PWM就是通过快速开关数字信号来模拟模拟量输出的方法。想象一下你用手指快速开关电灯开关,开关速度足够快时,灯泡…...

XHS-Downloader:小红书无水印内容采集的终极解决方案

XHS-Downloader:小红书无水印内容采集的终极解决方案 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&…...

如何利用XTDrone仿真平台快速验证无人机算法:问题驱动实战指南

如何利用XTDrone仿真平台快速验证无人机算法:问题驱动实战指南 【免费下载链接】XTDrone UAV Simulation Platform based on PX4, ROS and Gazebo 项目地址: https://gitcode.com/gh_mirrors/xt/XTDrone 你是否在无人机算法研究中遇到了这样的困境&#xff1…...

人流量统计测试视频获取方式

1 打开国外摄像头网站 https://riat-.blog.csdn.net/article/details/156447639?spm1011.2415.3001.5331 2 使用ubuntu自带录屏软件 Ctrl shift alt R 就可以开始录屏 停止录屏:打开屏幕右下角,停止录屏...

ofa_image-caption_coco_distilled_en实战案例:用URL/本地图批量生成英文描述的高效方案

ofa_image-caption_coco_distilled_en实战案例:用URL/本地图批量生成英文描述的高效方案 1. 项目概述:让图片自动"说话"的智能工具 你有没有遇到过这样的情况:手头有大量图片需要添加描述,但一张张手动编写既费时又费…...

如何用三月七小助手实现崩坏星穹铁道全自动游戏:终极高效教程

如何用三月七小助手实现崩坏星穹铁道全自动游戏:终极高效教程 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 还在为《崩坏:星穹铁道》中繁琐…...

【2026年网易互娱暑期实习/春招- 4月12日-第一题- 照明】(题目+思路+JavaC++Python解析+在线测试)

题目内容 给定一个 nnn 行 mmm 列的网格地图,每个格子是以下字符之一: ‘#’:障碍物; ‘.’:空地; ‘/’、’ \ :镜子; ‘LL...

无需高配电脑!Stable Diffusion 3.5 FP8镜像低显存运行方案

无需高配电脑!Stable Diffusion 3.5 FP8镜像低显存运行方案 1. 为什么选择FP8量化版本? Stable Diffusion 3.5作为Stability AI最新推出的文本到图像生成模型,在图像质量、语义理解和文字渲染方面都有显著提升。但原版模型对硬件要求较高&a…...

MinerU智能文档服务一文详解:如何用自然语言指令替代传统OCR工具

MinerU智能文档服务一文详解:如何用自然语言指令替代传统OCR工具 你是不是还在为处理PDF报告、扫描文件或者截图里的文字而头疼?是不是觉得传统的OCR工具用起来特别麻烦——先要上传文件,然后等它识别,最后还得手动整理格式&…...

深入解析倍福ADS协议:Notification模式在工业数据实时监控中的应用实践

1. 工业数据监控的痛点与ADS协议的价值 在现代化工厂的生产线上,每分钟都有成千上万的数据点需要采集和分析。我曾经参与过一个汽车焊接车间的改造项目,产线上200多个传感器每50毫秒就要上报一次数据。最初采用传统的轮询方式采集,结果发现网…...

使用Spring AI Alibaba构建智能体Agent拔

背景 在软件开发的漫长旅途中,"构建"这个词往往让人又爱又恨。爱的是,一键点击,代码变成产品,那是程序员最迷人的时刻;恨的是,维护那一堆乱糟糟的构建脚本,简直是噩梦。 在很多项目中…...