ros下的plugin学习
来源:互联网 发布:js循环读取txt文件内容 编辑:程序博客网 时间:2024/05/17 02:55
昨天看了ros下的plugin教程,今天整理一下,教程网址如下:http://wiki.ros.org/pluginlib/Tutorials/Writing%20and%20Using%20a%20Simple%20Plugin
所谓插件plugin个人理解就是把一个写好的类按照ros下标准格式封装一下,然后就可以直接按照ros下的标准格式进行调用。这样方便移植和分享给其他人用,相当于一个动态链接库。
1、catkin_ws/src/pluginlib_tutorials_/include/pluginlib_tutorials_/polygon_base.h建立基类
#ifndef PLUGINLIB_TUTORIALS__POLYGON_BASE_H_#define PLUGINLIB_TUTORIALS__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
上面的代码应该非常自我解释...我们正在创建一个名为RegularPolygon的抽象类。 有一件事要注意的是初始化方法的存在。 使用pluginlib,类不需要参数的构造函数,所以如果需要任何参数,我们使用initialize方法初始化对象。RegularPolygon是一个基类,同时定义了几种纯虚函数,作为一个基类的模板,具体的实现在继承类里面进行实体化。2、include/pluginlib_tutorials_/polygon_plugins.h建立继承类
#ifndef PLUGINLIB_TUTORIALS__POLYGON_PLUGINS_H_#define PLUGINLIB_TUTORIALS__POLYGON_PLUGINS_H_#include <pluginlib_tutorials_/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
这两个继承类将作为我们的插件3、src/polygon_plugins.cpp注册一个插件
#include <pluginlib/class_list_macros.h>#include <pluginlib_tutorials_/polygon_base.h>#include <pluginlib_tutorials_/polygon_plugins.h>PLUGINLIB_EXPORT_CLASS(polygon_plugins::Triangle, polygon_base::RegularPolygon)PLUGINLIB_EXPORT_CLASS(polygon_plugins::Square, polygon_base::RegularPolygon)
4、 CMakeLists.txt修改功能包的cmakelist这样就可以编译生成库文件add_library(polygon_plugins src/polygon_plugins.cpp)然后在功能包的根目录下catkin_make
5、增加一个配置文件说明该插件的功能,
在package.xml的同级目录下新建polygon_plugins.xml:
<library path="lib/libpolygon_plugins"> <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> <pluginlib_tutorials_ plugin="${prefix}/polygon_plugins.xml" /></export>6、验证插件是否正常
rospack plugins --attrib=plugin pluginlib_tutorials_7、src/polygon_loader.cpp调用一个插件
#include <pluginlib/class_loader.h>#include <pluginlib_tutorials_/polygon_base.h>int main(int argc, char** argv){ pluginlib::ClassLoader<polygon_base::RegularPolygon> poly_loader("pluginlib_tutorials_", "polygon_base::RegularPolygon"); try { boost::shared_ptr<polygon_base::RegularPolygon> triangle = poly_loader.createInstance("polygon_plugins::Triangle"); triangle->initialize(10.0); boost::shared_ptr<polygon_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;}
CMakeLists.txt添加 :include_directories(include)add_executable(polygon_loader src/polygon_loader.cpp)target_link_libraries(polygon_loader ${catkin_LIBRARIES})
然后catkin_make
运行生成的可行文件devel/lib/pluginlib_tutorials_/polygon_loader
0 0
- ros下的plugin学习
- 关于ROS下的Dynamic Reconfig的学习探索
- ROS plugin原理
- ROS学习历程(2)-----ROS的文件系统
- ros学习笔记--ros的服务
- ros下Kinect的“跟屁虫”
- ros 安装 qt creator plugin
- ROS学习过程的杂七杂八
- [ROS]LaserScan消息的学习
- 学习1:ROS的安装
- ros学习的相关网站
- ROS进阶学习的过程
- 【学习日记】ROS下IMU使用困惑
- ROS 教程之 navigation :在 catkin 环境下创建costmap layer plugin
- 【ROS总结】ROS下的百度语音识别应用
- Ubuntu安装ROS及ROS下的一些package
- ROS的学习(七)ROS的话题
- ROS的学习(八)ROS的服务
- 2.ehcache memcache redis 三大缓存男高音
- Lists是google对java.util.List类的封装
- input输入框value获取JS中值
- 【COCI2015】bzoj3881 Divljak
- 实现spring事务的四种方式
- ros下的plugin学习
- 参考知识库
- AAC ADTS格式分析
- Oracle学习笔记--day01
- [李景山php]高仿 京东首页
- 前端优化最佳实践及工具
- overflow:hidden
- Java事务处理总结
- Vijos 1554题:硬币游戏