ROSプラグインのお勉強
プラグインプログラムの作成
で構成される
プラグインをエクスポート
他のクラスで動的に利用するためにPLUGINLIB_EXPORT_CLASSを用いる。
src/sample_plugins.cppの例
#include <pluginlib/class_list_macros.h> #include <sample_plugins/sample_base_plugins.h> #include <sample_plugins/sample_plugins.h> PLUGINLIB_EXPORT_CLASS(sample_plugins::plugin1,sample_base_plugins::BasePlugin); PLUGINLIB_EXPORT_CLASS(sample_plugins::plugin2,sample_base_plugins::BasePlugin);
2つのプラグインsample_plugins::plugin1、sample_plugins::plugin2を ベースクラスsample_plugins_base::BasePluginに登録している。
include/sample_plugins/sample_base_plugin.h
#include <~> namespace sample_base_plugins{ class BasePlugin {~} void BasePlugin::initialize(char *file_name) {~}
include/sample_plugins/sample_plugin.h
#include <ros/ros.h> #include <sample_plugins/sample_base_plugin.h> namespace sample_plugins{ class plugin1 : public sample_base_plugin::BasePlugin { public: void sort(){~}; private: static int sample_plugin1(~){}; }; class plugin2 : public sample_base_plugin::BasePlugin {~};
プラグインの登録
package.xmlに以下を記載
<export> <sample_plugins="${prefix}/sample_plugins.xml" /> </export>
${prefix}はパッケージのルートディレクトリ
プラグインの記述
以下、2つのプラグインクラスが同じライブラリに含まれている。 sample_plugins.xml
<library path = "lib/libsample_plugins"> <class name = "sample_plugins/plugin1" type="sample_plugins::plugin1" base_class_type = "sample_base_plugin::BasePlugin"> </class> <class name = "sample_plugins/plugin2" type="sample_plugins::plugin2" base_class_type = "sample_base_plugin::BasePlugin"> </class> </library>
プラグインライブラリの構築
add_library(sample_plugins src/sample_plugins.cpp)
プラグインを利用する
例 src/plugin_sort.cpp
#include <ros/ros.h> #include <boost/shared_ptr.hpp> #include <pluginlib/class_loader.h> #include <sample_plugins/sample_base_plugin.h> //ベースクラスのロード pluginlib::ClassLoader<sample_base_plugin::BasePlugin> loader("sample_plugins","sample_base_plugin::BasePlugin"); //インスタンス生成 boost::shared_ptr<sampel_base_plugin::BasePlugin> plug1 = loader.createInstance("sample_plugins/sample_plugin1); plug1->initialize(~) plug1->sort()
実行
$ rosrun sample_plugins plugin_sort