# plugin **Repository Path**: WJ0213/plugin ## Basic Information - **Project Name**: plugin - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-29 - **Last Updated**: 2025-12-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ROS 2 pluginlib 示例工程 该工作空间包含两个 ROS 2 `ament_cmake` 包,演示如何用 pluginlib 定义/导出插件,并在运行节点中动态加载、销毁和切换插件。 ## 工程结构 - `src/test_plugin`:插件包,定义抽象接口 `TestPluginBase`,实现 `TestPluginImpl`(返回 `x*2`)和 `Test2PluginImpl`(返回 `x+10`),并通过 `plugin.xml` 导出。 - `src/run_plugin`:运行包,节点 `run_plugin_node` 通过 `pluginlib::ClassLoader` 每 2 秒销毁并切换一次插件,打印初始化日志和计算结果。 ## 环境依赖 - 已安装 ROS 2(rclcpp、pluginlib,可在任意发行版使用)。 - `colcon`、`ament_cmake`、C++17 编译链。 ## 快速构建与运行 ```bash # 1) 进入工作空间 cd /home/wangjing/box_ws # 2) 加载 ROS 2 环境 source /opt/ros//setup.bash # 3) 编译 colcon build --symlink-install --packages-select test_plugin run_plugin # 4) 加载本地安装空间 source install/setup.bash # 5) 运行插件切换示例 ros2 run run_plugin run_plugin_node ``` 终端会看到两个插件交替初始化与计算的日志,例如: ``` Create TestPluginImpl Plugin result: 10 Destroy current plugin Create Test2PluginImpl Plugin result: 15 ``` ## 创建过程(如何从零生成) 以下命令说明了本工程的生成方式,便于复现或在其他项目中借鉴。 ```bash # 创建工作空间 mkdir -p box_ws/src && cd box_ws # 生成插件包骨架 ros2 pkg create test_plugin --build-type ament_cmake --dependencies rclcpp pluginlib # 生成运行包骨架 ros2 pkg create run_plugin --build-type ament_cmake --dependencies rclcpp pluginlib test_plugin ``` 随后按如下思路补充代码: - 在 `test_plugin` 中添加接口头文件 `include/test_plugin/test_plugin_base.hpp`,实现 `src/test_plugin.cpp` 与 `src/test2_plugin.cpp` 两个类,并在 `plugin.xml` 中声明;`CMakeLists.txt` 中用 `add_library(...)` 生成 `test_plugin_lib`,`pluginlib_export_plugin_description_file` 导出插件清单,并安装 `plugin.xml` 与头文件。 - 在 `run_plugin` 中添加 `src/run_plugin.cpp`,使用 `pluginlib::ClassLoader` 通过类名字符串加载插件;在 `CMakeLists.txt` 中 `add_executable(run_plugin_node ...)` 并链接 `pluginlib`、`rclcpp`、`test_plugin`,安装可执行文件到 `lib/run_plugin`。 ## 代码要点 - 插件切换:`run_plugin/src/run_plugin.cpp` 的定时器每 2 秒执行一次 `switchPlugin()`,先 `reset()` 当前插件以触发析构,再根据标志位创建下一插件实例。 - 插件声明:`test_plugin/plugin.xml` 将实现类名(如 `test_plugins/TestPluginImpl`)映射到具体类型,供 loader 通过字符串查找。 - 接口稳定性:`TestPluginBase` 仅定义必要的纯虚函数,避免接口变更导致插件与主程序 ABI 不兼容。 ## 常见问题 - 找不到插件:确认已执行 `source install/setup.bash`,并确保 `plugin.xml` 随库安装(工程的 `CMakeLists.txt` 已处理)。 - 运行时报错 `ClassLoader`:检查 `plugin.xml` 中的 `name` 是否与 `run_plugin` 里 `createSharedInstance` 调用的字符串一致。 - 构建失败:确认已安装 ROS 2 对应的开发包与编译工具链。