ロボット開発記録

ロボット開発の進捗や記録をするブログ

ROS 2でプラグインを使う [ヒューマノイド動歩行]

前回の振り返り & 今回の概要

 前回は、ROS 2の機能の1つであるROS 2パラメータとその利用に関して示しました。開発中の本ソフトウェア群での活用方法を示しました。
 今回は、ROS 2のライブラリの1つであるPluginlibを用いたプラグイン機能とその活用方法に関して示します。

前回の記事↓ odome.hatenablog.com

開発リポジトリgithub.com

ROS 2におけるプラグイン

 ROS 2は基本的に、1つのプロセスを1つのノードとし、ノードが相互に通信を行うことでシステムを構築します。そして、この1プロセス1ノードでシステムを分割することでシステムの拡張や一部変更が容易になるなど、様々な恩恵を受けることができます。
 しかしこの手法でネック(そして心配)となってくるのが、通信を用いている点です。通信には当然ながら時間を要することに加え必要時間は一定ではないため、例えばある一定の短い周期で回したい処理内に通信があると、周期内に処理時間が収まらない状況が発生する可能性が考えられます。
 ここで、この問題の解決をしたいとき、真っ先に思いつくのが“通信を使わずに全処理を1ノードに書く”ことだと思います。ただこれでは、複数ノードからなるシステムの利点であった拡張容易性と変更容易性が完全に死んでしまいます。この、“拡張容易性”と“変更容易性”(特に“変更容易性”)と“通信を使わない”の3点を併せ持つことができる仕組みの1つとして、今回の「プラグイン」機能があります。ROS 2でのプラグイン機能は、1ノードが1つ以上のプラグインを読み込むことで、1ノード内で行う処理の一部を読み込んだプラグインで行わせることができます。

通信によるノードの結合とプラグインによる機能の実装

何が良いのか?

 このプラグイン機能の利点としては、以下が挙げられます。

  • プラグインは差し替えが可能なので、ノードが読み込むプラグインを変更するだけで簡単に動作の変更が可能である。 ー> 変更容易性
  • 差し替えが可能であることを利用し、拡張可能な箇所に予めプラグインを読み込む処理を加えておくといったことも可能である。 ー> (少しの)拡張容易性
  • 通信を使用せずにノードによってライブラリとして読み込まれるため、通信のデメリットを含まない。

 そして、ROS 2におけるプラグイン機能はPluginlibと呼ばれるC++用のROS 2ライブラリを利用することで実現できます。

Pluginlibによるプラグイン

 Pluginlibは、オブジェクト指向プログラミング特有の、クラスを利用するプラグイン機能を提供します。具体的には、基本クラスをプラグインの雛形、基本クラスを継承した派生クラスを実際に処理を行うプラグインとして実装します。そのため、プラグインの差し替えは共通の基本クラスを持つプラグインである必要があります。しかし基本クラスと派生クラスは自ら実装するため、そこまでの問題にはならないでしょう。

どう活用するのか?

 上記を踏まえて、開発の歩行制御ソフトウェア群でどのように活用するのかを考えます。

 開発の本ソフトウェア群には、ヒューマノイドロボットの歩行動作を制御する歩行制御ソフトウェアが含まれています。この歩行制御ソフトウェアは、基本的に4つの要素からなり、4要素を順番に実行することでロボットの脚関節角度・関節回転速度が算出され、ロボットの脚を動かすことができます。これを周期的(今回は10[ms]周期)に繰り返し出力、適用することで、歩行が実現できます。

歩行制御ソフトウェアの基本構成

 この歩行制御ソフトウェアを実装することを考えたとき、以下の3つの手法が考えられます。

  • 4要素をそれぞれノードとして実装し、通信でつなぐ。
  • 4要素を1つのノードとして実装する。
  • 4要素を1つのノードにプラグインとして実装する。

 前章までの話を踏まえて、変更容易性や処理時間の観点から第3の、4要素を1つのノードにプラグインとして実装する手法を採用しました。

実装

 ここでは、ソフトウェア構成イメージとPluginlibを用いたプラグイン機能の実装(の一部)を示します。

実装した歩行制御ソフトウェアのソフトウェア構成概要

プラグインの実装には、以下の5点が必要です。

ここでは実装例として、上図に含まれるWalking Pattern Generatorプラグインのコードへのリンクを示します。なお、ここでのWalking Pattern Generatorプラグインという名称は、あくまで基本構成を踏まえた仮のものであり、実装でのプラグインのクラス名は“walking_pattern_generator::WPG_LinearInvertedPendulumModel”です。

  • robot_manager/include/robot_manager/control_plugin_bases/PluginBase_WalkingPatternGenerator.hpp (基本クラス: source_code)

  • walking_pattern_generator/include/walking_pattern_generator/LinearInvertedPendulumModel.hpp (派生クラス、のhpp: source_code)

  • walking_pattern_generator/src/LinearInvertedPendulumModel.cpp (派生クラス、のcpp: source_code)

  • walking_pattern_generator/plugins.xml (XMLファイル: source_code)

  • walking_pattern_generator/CMakeLists.txt (ビルド: source_code)

  • Robot Manager (プラグインを読み込むノード、のcpp: source_code)

また、実装にあたってはROS 2の公式ドキュメントなどが参考になります。

最後に

 今回は、ROS 2にパラメータ機能を提供するPluginlibの紹介と活用方法を示しました。歩行制御ソフトウェアとしての骨組みは組み上がってきていると感じているので、次の記事ぐらいで一旦、ソフトウェアの全体をまとめた記事を書こうと思います。

開発リポジトリgithub.com