2026/2/8 9:37:58
网站建设
项目流程
2003系统做网站,为什么浙江建设厅网站,建设银行官方网站广州,wordpress漏洞以下是一个完整的 ROS2 节点动态组合#xff08;Composable Nodes#xff09; 开发案例#xff0c;涵盖 编译时组合 和 运行时组合 两种方式#xff0c;并包含 参数传递 和 命名空间重映射 等高级功能。 案例目标
实现一个 Talker#xff08;发布者#xff09; 和 Liste…以下是一个完整的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_components2. 编写 Talker 和 Listener 组件(1) Talker 组件 (talker_component.cpp)#includerclcpp/rclcpp.hpp#includerclcpp_components/register_node_macro.hpp#includestd_msgs/msg/string.hppclassTalker:publicrclcpp::Node{public:Talker(constrclcpp::NodeOptionsoptions):Node(talker,options){publisher_this-create_publisherstd_msgs::msg::String(chatter,10);timer_this-create_wall_timer(std::chrono::milliseconds(500),std::bind(Talker::publish_message,this));}private:voidpublish_message(){automsgstd_msgs::msg::String();msg.dataHello, ROS2 Composition!;publisher_-publish(msg);RCLCPP_INFO(this-get_logger(),Published: %s,msg.data.c_str());}rclcpp::Publisherstd_msgs::msg::String::SharedPtr publisher_;rclcpp::TimerBase::SharedPtr timer_;};RCLCPP_COMPONENTS_REGISTER_NODE(Talker)// 注册为组件(2) Listener 组件 (listener_component.cpp)#includerclcpp/rclcpp.hpp#includerclcpp_components/register_node_macro.hpp#includestd_msgs/msg/string.hppclassListener:publicrclcpp::Node{public:Listener(constrclcpp::NodeOptionsoptions):Node(listener,options){subscription_this-create_subscriptionstd_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::Subscriptionstd_msgs::msg::String::SharedPtr subscription_;};RCLCPP_COMPONENTS_REGISTER_NODE(Listener)// 注册为组件3. 编译时组合Hardcoded Composition(1) 创建manual_composition.cpp#includerclcpp/rclcpp.hpp#includetalker_component.hpp#includelistener_component.hppintmain(intargc,char**argv){rclcpp::init(argc,argv);// 创建多线程执行器rclcpp::executors::MultiThreadedExecutor executor;// 手动创建 Talker 和 Listener 节点autotalkerstd::make_sharedTalker(rclcpp::NodeOptions());autolistenerstd::make_sharedListener(rclcpp::NodeOptions());// 添加到执行器executor.add_node(talker);executor.add_node(listener);// 运行执行器executor.spin();rclcpp::shutdown();return0;}(2) 修改CMakeLists.txtcmake_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_containerros2 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 container5. 高级功能(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.so6. 总结方式特点适用场景编译时组合硬编码所有节点在同一个进程固定节点组合高性能运行时组合动态加载灵活管理需要动态调整节点dlopen组合直接加载.so文件无 ROS 接口依赖Launch 文件组合自动化启动复杂系统部署完整代码GitHub - ROS2 Composition Demo通过这个案例你可以理解 ROS2 组件化开发Composable Nodes。掌握编译时和运行时组合的方式。学会参数传递和命名空间重映射。应用于多传感器融合、自主导航等复杂系统。