ページ

2013年6月8日土曜日

RTコンポーネントとマネージャ、複合コンポーネントの関係について

OpenRTMを用いて開発をしていく中でRTコンポーネントとマネージャ、複合コンポーネントの関係について誤解していたので、学んだことも含めてここで関係をもう一度纏めてみたいと思います。
間違ってたら教えて下さい…

RTコンポーネントのプロジェクトをビルドした際に生成される実行ファイルは、RTコンポーネント1つとマネージャ1つから構成されるスタンドアローン動作のRTコンポーネントになります。


RTコンポーネントの実体はdllファイルとして存在しています。このコンポーネントに対して、マネージャが実行コンテキストや状態遷移を提供することでRTコンポーネントは動作します。

また、マネージャ部分だけを実装し、RTコンポーネントを動的にロードすることが可能となっている実行ファイルがRTC Daemonになります。rtc.confはマネージャの動作を設定するもので、スタンドアローン動作RTコンポーネント、RTC Daemonから参照されます。

マネージャの実体はプロセスで、全てのRTコンポーネントはいずれかのマネージャによって支配されています。また、RTC Daemonを利用することで、ひとつのマネージャ上に複数のRTコンポーネントを簡単にロードすることができます。


同一マネージャ( == 同一プロセス)上に複数のRTコンポーネントをロードすることで、CORBAによるポート間の通信オーバーヘッドが非常に小さくなるという利点があります。しかし、いずれかのRTコンポーネントがクラッシュした際に他の同一プロセス上のRTコンポーネントを巻き込むので、脆弱性が高まります。
rtcdを利用して複数コンポーネントをロードする方法は、
  1. rtcdを起動した後にSystem EditorからModuleをLoad、Createする
  2. rtc.confにmanager.modules.preloadとmanager.modules.precreateを設定する

の2種類の方法があります。

--

また、全く別の概念として複合コンポーネントというものが存在します。これは、複数のコンポーネントの実行コンテキストや状態を共有させるものです。複合コンポーネントを形成するRTコンポーネント同士が別々のマネージャに所属していた場合には、いずれかのマネージャをマスターに指定するか、もしくは別のマネージャを起動してマスターに設定する必要があります。


(a)のように、片方のRTコンポーネントの所属するマネージャをマスターに設定する場合には、そのマネージャのrtc.confにmanager.is_master: YESを設定します。
(b)のように、新しくRTC Daemonをたちあげてマスターに設定する場合には、rtcdを-dオプションで立ち上げるなどします。
そして、System Editorから配置した複数のコンポーネントを選択して、右クリック、複合コンポーネントの作成を選択し、マネージャを設定します。



0 件のコメント:

コメントを投稿