[openrtm-users 00041] Re: RTコンポーネントとプロセスの関係について

Akio Uda uda-axa @ necst.nec.co.jp
2005年 11月 28日 (月) 13:45:29 JST


To: 産総研 安藤様

いつも御世話になります。宇田@NECシステムテクノロジーです

どうも詳細な情報をありがとうございます。

コンポーネントとプロセスの関係がだいぶイメージできました。

もう一点、RTCLinkとコンポーネントの関係について教えて頂い
てもよろしいでしょうか?

デベロッパーズガイドの2.3項を拝見しますと、ConsoleInCompと
ConsoleOutCompのプロセスを起動したのち、RTCLinkのシステム
ドローウィンドウの中でもConsoleIn/Outのコンポーネントを
ドラッグ&ドロップしてStartさせているようですが、この時の
両コンポーネントは、ConsoleIn/OutCompとRTCLinkのどちらの
プロセス下で稼動しているのでしょうか?

またConsoleInCompの中でもmanager->createComponent()により
コンポーネントのインスタンスを生成しているようですが、これ
とRTCLinkのシステムドローウィンドウのコンポーネントは同一
インスタンスなのでしょうか、それとも別物でしょうか?


> 宇田様
> 
> > はじめまして。宇田@NECシステムテクノロジーと申します。
> 
> はじめまして
> 安藤@産総研です
> 
> > OpenRTMコンポーネントとプロセスの関係について、少し詳しく教えて
> > 頂けますでしょうか?
> > 
> > 例えば既存のロボット用のソフトウェア資産をOpenRTMで活用する場合、
> > 普通に考えると頭、腕、足などのパーツごとにコンポーネント化するの
> > が自然かと思います。
> > 
> >               OpenRTMから見たロボットソフトウェア      
> >         +---------------------------------------------+
> >         |                   システム                  |
> >         | +-----------+  +-----------+  +-----------+ |
> >         | |  頭制御   |  |  腕制御   |  |  足制御   | |
> >         | | Component |  | Component |  | Component | |
> >         | +-----------+  +-----------+  +-----------+ |
> >         +---------------------------------------------+
> > 
> > これらのパーツの制御用ソフトウェアは、元々がロボット・システムで
> > あるという経緯から、通常は1プロセス内で動いていることが想定され
> > ます。
> > 
> >                 ロボットソフトウェアの内部構造         
> >         +---------------------------------------------+
> >         |                 単一プロセス                |
> >         | +-----------+  +-----------+  +-----------+ |
> >         | | 頭制御部  |  | 腕制御部  |  | 足制御部  | |
> >         | +-----------+  +-----------+  +-----------+ |
> >         +---------------------------------------------+
> > 
> > そこで、最も簡単なコンポーネント化の方法は、これら3種類のコンポー
> > ネントを1つの実行ファイルにまとめる方法かと思うのですが、デベロッ
> > パーズガイドの3.1.1.1によると、スタンドアロンコンポーネントは原則と
> > して1プロセスにつき1種類のコンポーネントにのみ対応するとあります。
> > これは何か技術的な理由による制約でしょうか?
> 
> そのようなコンポーネントをスタンドアロンコンポーネントと呼んでいるだけです。
>  
> > またローダブルモジュールコンポーネントであれば複数種類のコンポーネ
> > ントに対応可能なようですが、それらのロード先を1プロセスに制限する
> > ことは可能でしょうか?(上記のように、ベースになるソフトウェア資産
> > が単一プロセスで動いている場合、それを基に作成したコンポーネントも
> > 同一プロセス内で動かすのが最もシンプルかと思うのですが)
> 
> rtc-template で作成されるスタンドアロンコンポーネント("なんとかComp.cpp")は、
> あくまで一例で、当該コンポーネントを1個だけ作成するための実行ファイルです。
> 
> 全部のコンポーネントを同じプロセスで動かしたい場合、
> 同一のマネージャでそれらのコンポーネントを作成すれば可能です。
> 
> 仮に、上記の3つのコンポーネントが下記のようなソースからできているとします。
> Head.cpp, Head.h, HeadComp.cpp
> Arm.cpp, Arm.h, ArmComp.cpp
> Leg.cpp, Leg.h, LegComp.cpp
> 
> ここで、全部のコンポーネントをいっぺんに作成する新しい
> 実行ファイル (AllComp) を作成します。
> ------------------------------------------------------------
> AllComp.cpp
> ------------------------------------------------------------
> #include <rtm/RtcManager.h>
> #include "Head.h"
> #include "Arm.h"
> #include "Leg.h"
> 
> // この関数は、main 無いの、manager.initModuleProc(MyModuleInit) で
> // 一度だけ実行される。
> void MyModuleInit(RtcManager* manager)
> {
>   HeadInit(manager); // Head.h 内に定義されている。
>   ArmInit(manager); // Arm.h 内に定義されている。
>   LegInit(manager); // Leg.h 内に定義されている。
> 
>   std::string name;
>   // コンポーネントを作成する
>   // Headコンポーネント: 名前 "Head", カテゴリ "Generic" とする。
>   manager->createComponent("Head", "Generic", name);
>   // Armコンポーネント: 名前 "Arm", カテゴリ "Generic" とする。
>   manager->createComponent("Arm", "Generic", name);
>   // Legコンポーネント: 名前 "Leg", カテゴリ "Generic" とする。
>   manager->createComponent("Leg", "Generic", name);
> 
>   return;
> }
> 
> int main ()
>    : つづく
> ------------------------------------------------------------
> 
> これを、Head.o, Arm.o, Leg.o とリンクすれば、
> ご希望の実行ファイルになると思います。
> 
> 
> 実は、もう少し柔軟な方法もあります。
> コンポーネントをビルドすると、Head.so, Arm.so, Leg.so
> といった共有オブジェクトファイルも一緒に作成されますが、
> これを使うこともできます。
> 
> ------------------------------------------------------------
> AllComp.cpp
> ------------------------------------------------------------
> #include <rtm/RtcManager.h>
> 
> void MyModuleInit(RtcManager* manager)
> {
>   // 共有ライブラリをロード
>   manager->load("Head.so", "HeadInit");
>   manager->load("Arm.so", "ArmInit");
>   manager->load("Leg.so", "LegInit");
> 
>   std::string name;
>   // コンポーネントを作成する
>   manager->createComponent("Head", "Generic", name);
>   manager->createComponent("Arm", "Generic", name);
>   manager->createComponent("Leg", "Generic", name);
> 
>   return;
> }
> 
> int main ()
>    : つづく
> ------------------------------------------------------------
> 
> このように、マネージャにsoファイルをロードさせて、
> コンポーネントを作成することもできます。
> 
> あまり違いがないように見えますが、こちらの方法では、
> Head.h, Arm.h, Leg.h をincludeしていません。
> 
> この方法だと、どれかひとつのコンポーネントに変更があっても、
> この実行ファイルをコンパイル・リンクしなおす必要がありません。
> 
> > コンポーネントサーバがこのロード・実行の役割を担っているようですが、
> > デベロッパーズガイドにはあまり解説がないようですので、もし関連する
> > 資料などがありましたら公開して頂けると助かります。
> 
> 今のところ、公開できるような資料はありませんが、
> 付属のクラスリファレンス RTM::RtcManager の項を読んでいただければ、
> おそらくお分かりになるのではないかと思います。
> 
> 次のバージョンのマニュアルでは、使い方等記載しようと考えております。
> 
>           安藤慶昭@独立行政法人産業技術総合研究所 研究員
>                     知能システム研究部門 タスクインテリジェンス研究グループ
>                     〒305-8568 茨城県つくば市梅園1-1-1 中央第2
>                     TEL: 029-861-5981 FAX: 029-861-5971
>                     n-ando @ aist.go.jp, n-ando @ ieee.org

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
z  宇田 安規男                                                        z
z  NECシステムテクノロジー株式会社  システムテクノロジーラボラトリ  z
z  神奈川県川崎市中原区下沼部 1753  NEC 玉川事業場 9号館               z
z  〒 211-8666   Tel: 044-431-7574  Fax: 044-431-7588                  z
z  E-mail: uda-axa @ necst.nec.co.jp                                     z
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz




openrtm-users メーリングリストの案内