ros——插件编写

本文介绍了如何使用pluginlib库在ROS中创建和管理插件。首先,需要创建基类,然后定义插件类并实现功能。接着,通过pluginlib的宏注册插件,构建插件库,并配置XML文件以便于ROS工具链识别。最后,通过编译和导出插件,确保它们能在ROS环境中正确运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pluginlib:是一个c++库, 用来从一个ROS功能包中加载和卸载插件(plugin)。插件是指从运行时库中动态加载的类。通过使用Pluginlib,不必将某个应用程序显式地链接到包含某个类的库,Pluginlib可以随时打开包含类的库,而不需要应用程序事先知道包含类定义的库或者头文件。

目录

1准备

2创建基类

3创建插件类

4注册插件

5构建插件库

6使插件可用于ROS工具链


使用

1准备

创建功能包,导入依赖:roscpp,pluginlib。

在 VSCode中需要配置 .vascode/c_cpp_properties.json文件中关于 includepath 选项的设置。

{
    "configurations": [
        {
            "browse": {
                "databaseFilename": "",
                "limitSymbolsToIncludedHeaders": true
            },
            "includePath": [
                "/opt/ros/noetic/include/**",
                "/usr/include/**",
                "/.../yyy工作空间/功能包/include/**" //配置 head 文件的路径 ,如果使用VScode就这样配置,复制头文件的路径过来就可以
            ],
            "name": "ROS",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

2创建基类

基类可以自己编写。也可以继承已经有的基类,已经有的基类就不用再写一个基类了

#ifndef XXX_POLYGON_BASE_H_
#define XXX_POLYGON_BASE_H_

namespace polygon_base
{
  class RegularPolygon
  {
    public:
      virtual void initialize(double side_length) = 0;//功能函数设置
      virtual double area() = 0;
      virtual ~RegularPolygon(){}

    protected:
      RegularPolygon(){}//必须包含无参构造,plug要求
  };
};
#endif

3创建插件类

创建自己插件类头文件

#ifndef XXX_POLYGON_PLUGINS_H_
#define XXX_POLYGON_PLUGINS_H_
#include “xxx/polygon_base.h"
#include <cmath>

namespace polygon_plugins
{
  class Triangle : public polygon_base::RegularPolygon //命名空间下的基类
  {
    public:
      Triangle(){}

      void initialize(double side_length)  //使用父类的函数
      {
        side_length_ = side_length;
      }

      double area()
      {
        return 0.5 * side_length_ * getHeight();
      }

      double getHeight()
      {
        return sqrt((side_length_ * side_length_) - ((side_length_ / 2) * (side_length_ / 2)));
      }

    private:
      double side_length_;
  };

  class Square : public polygon_base::RegularPolygon
  {
    public:
      Square(){}

      void initialize(double side_length)
      {
        side_length_ = side_length;
      }

      double area()
      {
        return side_length_ * side_length_;
      }

    private:
      double side_length_;

  };
};
#endif

4注册插件

关联基类和衍生插件

在 src 目录下新建 polygon_plugins.cpp 文件,内容如下:

//pluginlib 宏,可以注册插件类
#include <pluginlib/class_list_macros.h>//包含头文件如果不对,可以”“和<>更换试试
#include <xxx/polygon_base.h>
#include <xxx/polygon_plugins.h>

//参数1:衍生类 参数2:基类
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Triangle, polygon_base::RegularPolygon)//plug宏使用
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Square, polygon_base::RegularPolygon)//编写几个类就写几个

 

5构建插件库

配置cmklist

include_directories(include)
add_library(自定义名字 src/polygon_plugins.cpp)

调用 catkin_make 编译,编译完成后,在工作空间/devel/lib目录下,会生成相关的 .so 文件 

6使插件可用于ROS工具链

配置xml

功能包下新建文件:polygon_plugins.xml,内容如下:

<!-- 定位动态链接库 -->
<library path="lib/libpolygon_plugins">//自己再lib下申辰的文件
  <!-- type="插件类" base_class_type="基类" -->//名字是自己前面取得类名
  <class type="polygon_plugins::Triangle" base_class_type="polygon_base::RegularPolygon">
    <!-- 描述信息 -->
    <description>This is a triangle plugin.</description>
  </class>
  <class type="polygon_plugins::Square" base_class_type="polygon_base::RegularPolygon">
    <description>This is a square plugin.</description>
  </class>
</library>

导出插件

package.xml文件中设置内容如下:

<export>
  <xxx plugin="${prefix}/polygon_plugins.xml" />
</export>

标签<xxx />的名称应与基类所属的功能包名称一致,plugin属性值为上一步中创建的xml文件。

编译后,可以调用rospack plugins --attrib=plugin xxx命令查看配置是否正常,如无异常,会返回 .xml 文件的完整路径,这意味着插件已经正确的集成到了ROS工具链。

### ROS 2 中 Gazebo 插件的使用教程 #### 安装方法 为了确保ROS 2 和 Gazebo 的环境已正确配置,在安装任何特定于项目的Gazebo插件之前,应先确认基础环境无误[^1]。对于那些正在考虑从旧版本迁移到较新版本(如Gazebo Classic到Gazebo11),需要注意的是迁移过程中涉及到更新依赖关系以及确保所有接口和插件都能适配新的Gazebo版本[^3]。 针对具体插件比如`gym_ped_sim`——这是一个用于行人模拟的社会合规导航插件,其源码托管在一个公开仓库中[^4]。要安装此类第三方插件,一般流程如下: 1. **获取源代码** - 可通过Git克隆指定仓库来获得最新版源码。 2. **编译与安装** - 将下载下来的库加入工作空间,并按照标准CMake或catkin工具链进行构建。 - 如果该插件有特殊的编译需求,则需遵循官方文档指导完成额外步骤。 ```bash # 获取源代码 git clone https://gitcode.com/gh_mirrors/gy/gym_ped_sim.git ~/ws/src/ cd ~/ws/ # 编译与安装 colcon build --symlink-install source install/setup.bash ``` #### 使用教程 当准备就绪后,可以通过命令行启动带有预设机器人的Gazebo仿真场景,这里以`demo_gazebo_world.launch.py`为例说明如何加载带ROS 2控制器支持的世界文件[^2]。 ```bash ros2 launch gazebo_ros2_control demo_gazebo_world.launch.py ``` 此操作会打开一个包含可由ROS 2节点控制实体的新实例化虚拟世界。对于像`gym_ped_sim`这样的特殊用途插件来说,可能还需要进一步调整参数设置或是编写自定义脚本来实现预期功能。 #### 示例代码 下面给出一段简单的Python客户端程序片段作为例子,展示怎样订阅来自装备了上述提到的行人行为模拟器的主题消息流。 ```python import rclpy from sensor_msgs.msg import LaserScan def laser_callback(msg): """处理激光雷达扫描数据""" ranges = msg.ranges print(f"Received {len(ranges)} range measurements") def main(args=None): rclpy.init(args=args) node = rclpy.create_node('laser_subscriber') subscription = node.create_subscription( LaserScan, '/scan', laser_callback, 10) try: while rclpy.ok(): rclpy.spin_once(node) except KeyboardInterrupt: pass node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 这段代码创建了一个名为`laser_subscriber`的ROS 2节点,它监听着`/scan`话题上的LaserScan类型的消息,并打印接收到的距离测量数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值