空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

ROSプラグインのお勉強

プラグインプログラムの作成

  1. ベースプラグインクラス
  2. プラグインクラス

で構成される

プラグインをエクスポート

他のクラスで動的に利用するために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