以网络营销为导向的网站建设应注意什么问题,做网站顾客提现金额后台,门户网站建设 总结,中文域名网站标识目录 一、前言二、概念三、作用四实际用例4.1需求4.2流程4.3准备4.4创建基类4.5创建插件4.6注册插件4.7构建插件库4.8使插件可用于ROS工具链4.8.1配置xml4.8.2导出插件 4.9使用插件4.10执行 一、前言
pluginlib直译是插件库#xff0c;所谓插件字面意思就是可插拔的组件… 目录 一、前言二、概念三、作用四实际用例4.1需求4.2流程4.3准备4.4创建基类4.5创建插件4.6注册插件4.7构建插件库4.8使插件可用于ROS工具链4.8.1配置xml4.8.2导出插件 4.9使用插件4.10执行 一、前言
pluginlib直译是插件库所谓插件字面意思就是可插拔的组件比如:以计算机为例可以通过USB接口自由插拔的键盘、鼠标、U盘…都可以看作是插件实现其基本原理就是通过规范化的USB接口协议实现计算机与USB设备的自由组合。同理在软件编程中插件是一种遵循一定规范的应用程序接口编写出来的程序插件程序依赖于某个应用程序且应用程序可以与不同的插件程序自由组合。在ROS中也会经常使用到插件场景如下: 1.导航插件:在导航中涉及到路径规划模块路径规划算法有多种也可以自实现导航应用时可能需要测试不同算法的优劣以选择更合适的实现这种场景下ROS中就是通过插件的方式来实现不同算法的灵活切换的。
2.rviz插件:在rviz中已经提供了丰富的功能实现但是即便如此特定场景下开发者可能需要实现某些定制化功能并集成到rviz中这一集成过程也是基于插件的。
二、概念
pluginlib是一个c库 用来从一个ROS功能包中加载和卸载插件(plugin)。插件是指从运行时库中动态加载的类。通过使用Pluginlib不必将某个应用程序显式地链接到包含某个类的库Pluginlib可以随时打开包含类的库而不需要应用程序事先知道包含类定义的库或者头文件。
三、作用
结构清晰 低耦合易修改可维护性强 可移植性强更具复用性 结构容易调整插件可以自由增减
四实际用例
4.1需求
以插件的方式实现正多边形的相关计算。
4.2流程
1.准备 2.创建基类 3.创建插件类 4.注册插件; 5.构建插件库; 6.使插件可用于ROS工具链; 6.1配置xml 6.2导出插件 7.使用插件; 8.执行
4.3准备
创建功能包xxx导入依赖: roscpp pluginlib。
在 VSCode中需要配置 .vascode/c_cpp_properties.json文件中关于 includepath 选项的设置。
{configurations: [{browse: {databaseFilename: ,limitSymbolsToIncludedHeaders: true},includePath: [/opt/ros/noetic/include/**,/usr/include/**,/.../yyy工作空间/功能包/include/** //配置 head 文件的路径 ],name: ROS,intelliSenseMode: gcc-x64,compilerPath: /usr/bin/gcc,cStandard: c11,cppStandard: c17}],version: 4
}
4.4创建基类
在 xxx/include/xxx下新建C头文件: polygon_base.h所有的插件类都需要继承此基类内容如下:
#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(){}};
};
#endif
注基类必须提供无参构造函数所以关于多边形的边长没有通过构造函数而是通过单独编写的initialize函数传参。
4.5创建插件
在 xxx/include/xxx下新建C头文件:polygon_plugins.h内容如下:
#ifndef XXX_POLYGON_PLUGINS_H_
#define XXX_POLYGON_PLUGINS_H_
#include xxx/polygon_base.h
#include cmathnamespace 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.6注册插件
在 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)
PLUGINLIB_EXPORT_CLASS(polygon_plugins::Square, polygon_base::RegularPolygon)
该文件会将两个衍生类注册为插件。
4.7构建插件库
在 CMakeLists.txt 文件中设置内容如下:
include_directories(include)
add_library(polygon_plugins src/polygon_plugins.cpp)
至此可以调用 catkin_make 编译编译完成后在工作空间/devel/lib目录下会生成相关的 .so 文件。
4.8使插件可用于ROS工具链
4.8.1配置xml
功能包下新建文件:polygon_plugins.xml,内容如下:
!-- 插件库的相对路径 --
library pathlib/libpolygon_plugins!-- type插件类 base_class_type基类 --class typepolygon_plugins::Triangle base_class_typepolygon_base::RegularPolygon!-- 描述信息 --descriptionThis is a triangle plugin./description/classclass typepolygon_plugins::Square base_class_typepolygon_base::RegularPolygondescriptionThis is a square plugin./description/class
/library
4.8.2导出插件
package.xml文件中设置内容如下:
exportxxx plugin${prefix}/polygon_plugins.xml /
/export
标签的名称应与基类所属的功能包名称一致plugin属性值为上一步中创建的xml文件。
编译后可以调用rospack plugins --attribplugin xxx命令查看配置是否正常如无异常会返回 .xml 文件的完整路径这意味着插件已经正确的集成到了ROS工具链。
4.9使用插件
src 下新建c文件:polygon_loader.cpp内容如下:
//类加载器相关的头文件
#include pluginlib/class_loader.h
#include xxx/polygon_base.hint main(int argc, char** argv)
{//类加载器 -- 参数1:基类功能包名称 参数2:基类全限定名称pluginlib::ClassLoaderpolygon_base::RegularPolygon poly_loader(xxx, polygon_base::RegularPolygon);try{//创建插件类实例 -- 参数:插件类全限定名称boost::shared_ptrpolygon_base::RegularPolygon triangle poly_loader.createInstance(polygon_plugins::Triangle);triangle-initialize(10.0);boost::shared_ptrpolygon_base::RegularPolygon square poly_loader.createInstance(polygon_plugins::Square);square-initialize(10.0);ROS_INFO(Triangle area: %.2f, triangle-area());ROS_INFO(Square area: %.2f, square-area());}catch(pluginlib::PluginlibException ex){ROS_ERROR(The plugin failed to load for some reason. Error: %s, ex.what());}return 0;
}
4.10执行
修改CMakeLists.txt文件内容如下:
add_executable(polygon_loader src/polygon_loader.cpp)
target_link_libraries(polygon_loader ${catkin_LIBRARIES})
编译然后执行:polygon_loader结果如下:
[ INFO] [WallTime: 1279658450.869089666]: Triangle area: 43.30
[ INFO] [WallTime: 1279658450.869138007]: Square area: 100.00
参考视屏赵虚左ros入门