news 2026/6/10 15:48:30

ros2(jazzy)多节点运行在同一个进程范例(对标ros1的nodelet)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ros2(jazzy)多节点运行在同一个进程范例(对标ros1的nodelet)

以下是一个完整的ROS2 节点动态组合(Composable Nodes)开发案例,涵盖编译时组合运行时组合两种方式,并包含参数传递命名空间重映射等高级功能。


案例目标

  • 实现一个Talker(发布者)Listener(订阅者)节点,并动态组合到单个进程中。
  • 支持编译时组合(硬编码)和运行时组合(通过component_container动态加载)。
  • 演示参数传递命名空间重映射

1. 创建 ROS2 包

mkdir-p ~/ros2_ws/srccd~/ros2_ws/src ros2 pkg create composition_demo --build-type ament_cmake --dependencies rclcpp rclcpp_components

2. 编写 Talker 和 Listener 组件

(1) Talker 组件 (talker_component.cpp)

#include"rclcpp/rclcpp.hpp"#include"rclcpp_components/register_node_macro.hpp"#include"std_msgs/msg/string.hpp"classTalker:publicrclcpp::Node{public:Talker(constrclcpp::NodeOptions&options):Node("talker",options){publisher_=this->create_publisher<std_msgs::msg::String>("chatter",10);timer_=this->create_wall_timer(std::chrono::milliseconds(500),std::bind(&Talker::publish_message,this));}private:voidpublish_message(){automsg=std_msgs::msg::String();msg.data="Hello, ROS2 Composition!";publisher_->publish(msg);RCLCPP_INFO(this->get_logger(),"Published: '%s'",msg.data.c_str());}rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;rclcpp::TimerBase::SharedPtr timer_;};RCLCPP_COMPONENTS_REGISTER_NODE(Talker)// 注册为组件

(2) Listener 组件 (listener_component.cpp)

#include"rclcpp/rclcpp.hpp"#include"rclcpp_components/register_node_macro.hpp"#include"std_msgs/msg/string.hpp"classListener:publicrclcpp::Node{public:Listener(constrclcpp::NodeOptions&options):Node("listener",options){subscription_=this->create_subscription<std_msgs::msg::String>("chatter",10,std::bind(&Listener::listen_message,this,std::placeholders::_1));}private:voidlisten_message(conststd_msgs::msg::String::SharedPtr msg){RCLCPP_INFO(this->get_logger(),"Received: '%s'",msg->data.c_str());}rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;};RCLCPP_COMPONENTS_REGISTER_NODE(Listener)// 注册为组件

3. 编译时组合(Hardcoded Composition)

(1) 创建manual_composition.cpp

#include"rclcpp/rclcpp.hpp"#include"talker_component.hpp"#include"listener_component.hpp"intmain(intargc,char**argv){rclcpp::init(argc,argv);// 创建多线程执行器rclcpp::executors::MultiThreadedExecutor executor;// 手动创建 Talker 和 Listener 节点autotalker=std::make_shared<Talker>(rclcpp::NodeOptions());autolistener=std::make_shared<Listener>(rclcpp::NodeOptions());// 添加到执行器executor.add_node(talker);executor.add_node(listener);// 运行执行器executor.spin();rclcpp::shutdown();return0;}

(2) 修改CMakeLists.txt

cmake_minimum_required(VERSION 3.8) project(composition_demo) find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_components REQUIRED) find_package(std_msgs REQUIRED) # 组件库 add_library(talker_component SHARED src/talker_component.cpp) ament_target_dependencies(talker_component rclcpp rclcpp_components std_msgs) target_compile_definitions(talker_component PRIVATE "COMPOSITION_BUILDING_DLL") add_library(listener_component SHARED src/listener_component.cpp) ament_target_dependencies(listener_component rclcpp rclcpp_components std_msgs) target_compile_definitions(listener_component PRIVATE "COMPOSITION_BUILDING_DLL") # 编译时组合 add_executable(manual_composition src/manual_composition.cpp) ament_target_dependencies(manual_composition rclcpp rclcpp_components std_msgs) target_link_libraries(manual_composition talker_component listener_component) # 安装 install(TARGETS talker_component listener_component manual_composition DESTINATION lib/${PROJECT_NAME} ) ament_package()

(3) 编译并运行

cd~/ros2_ws colcon build --packages-select composition_demosourceinstall/setup.bash ros2 run composition_demo manual_composition

输出

[INFO] [talker]: Published: 'Hello, ROS2 Composition!' [INFO] [listener]: Received: 'Hello, ROS2 Composition!'

4. 运行时组合(Dynamic Composition)

(1) 启动component_container

ros2 run rclcpp_components component_container

(2) 动态加载 Talker 和 Listener

# 加载 Talkerros2 component load /ComponentManager composition_demo composition_demo::Talker# 加载 Listenerros2 component load /ComponentManager composition_demo composition_demo::Listener

输出

[INFO] [talker]: Published: 'Hello, ROS2 Composition!' [INFO] [listener]: Received: 'Hello, ROS2 Composition!'

(3) 查看已加载组件

ros2 component list

输出

/ComponentManager 1 /talker 2 /listener

(4) 卸载组件

ros2 component unload /ComponentManager12

输出

Unloaded component 1 from '/ComponentManager' container Unloaded component 2 from '/ComponentManager' container

5. 高级功能

(1) 参数传递

ros2 component load /ComponentManager composition_demo composition_demo::Talker -p use_sim_time:=true

(2) 命名空间重映射

ros2 component load /ComponentManager composition_demo composition_demo::Listener --node-namespace /my_ns

(3) 使用dlopen动态加载

ros2 run composition_demo dlopen_composition\$(ros2 pkg prefix composition_demo)/lib/libtalker_component.so\$(ros2 pkg prefix composition_demo)/lib/liblistener_component.so

6. 总结

方式特点适用场景
编译时组合硬编码,所有节点在同一个进程固定节点组合,高性能
运行时组合动态加载,灵活管理需要动态调整节点
dlopen组合直接加载.so文件无 ROS 接口依赖
Launch 文件组合自动化启动复杂系统部署

完整代码:GitHub - ROS2 Composition Demo


通过这个案例,你可以:

  1. 理解 ROS2 组件化开发(Composable Nodes)。
  2. 掌握编译时和运行时组合的方式。
  3. 学会参数传递和命名空间重映射
  4. 应用于多传感器融合、自主导航等复杂系统
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:56:42

Hunyuan HY-MT1.5多语言支持:33语种切换部署实操

Hunyuan HY-MT1.5多语言支持&#xff1a;33语种切换部署实操 随着全球化进程加速&#xff0c;高质量、低延迟的多语言翻译需求日益增长。传统云翻译服务虽性能稳定&#xff0c;但在隐私保护、实时性和边缘场景中面临挑战。腾讯开源的混元翻译大模型 HY-MT1.5 系列应运而生&…

作者头像 李华
网站建设 2026/6/9 23:53:51

腾讯开源HY-MT1.5:模型量化压缩技术解析

腾讯开源HY-MT1.5&#xff1a;模型量化压缩技术解析 1. 技术背景与问题提出 近年来&#xff0c;随着大语言模型在自然语言处理任务中的广泛应用&#xff0c;翻译模型的性能不断提升。然而&#xff0c;高精度往往伴随着巨大的参数量和计算开销&#xff0c;导致模型难以在资源受…

作者头像 李华
网站建设 2026/6/10 10:50:49

HY-MT1.5术语库API开发:动态术语管理系统

HY-MT1.5术语库API开发&#xff1a;动态术语管理系统 1. 引言&#xff1a;腾讯开源的混元翻译大模型HY-MT1.5 随着全球化进程加速&#xff0c;高质量、多语言互译能力成为企业出海、内容本地化和跨文化交流的核心需求。传统翻译模型在面对专业术语一致性、混合语言场景和上下…

作者头像 李华
网站建设 2026/6/10 10:54:57

sbit与寄存器直接操作对比:硬件编程核心要点

从点亮一个LED说起&#xff1a;sbit与寄存器操作的底层博弈你有没有试过&#xff0c;只是想控制一个LED灯的亮灭&#xff0c;结果系统却莫名其妙复位了&#xff1f;或者写好了定时器中断&#xff0c;却发现它像“打了鸡血”一样反复触发&#xff0c;根本停不下来&#xff1f;这…

作者头像 李华
网站建设 2026/6/10 0:52:25

腾讯HY-MT1.5实战:多语言客服系统搭建教程

腾讯HY-MT1.5实战&#xff1a;多语言客服系统搭建教程 在当今全球化业务快速发展的背景下&#xff0c;跨语言沟通已成为企业服务不可或缺的一环。尤其是在电商、金融、旅游等行业&#xff0c;客户支持需要覆盖多种语言&#xff0c;传统人工翻译成本高、响应慢&#xff0c;而通…

作者头像 李华
网站建设 2026/6/10 10:55:02

基于NX的低功耗模式HAL层支持开发

从寄存器到API&#xff1a;在NX平台上打造可复用的低功耗HAL层你有没有遇到过这样的场景&#xff1f;一个原本设计为“电池供电、十年寿命”的物联网终端&#xff0c;实测续航却只有三个月。排查一圈后发现&#xff0c;问题不在硬件电路&#xff0c;也不在传感器选型——而是MC…

作者头像 李华