[openrtm-users 00589] Re: 一つのコンポーネントから複数のインスタンスを生成する方法について

Tsutomu Watanabe watanabe @ ms.esys.tsukuba.ac.jp
2008年 8月 29日 (金) 13:35:53 JST


産総研 安藤様

渡部です。

ご回答ありがとうございます。
参考にさせていただきます。




Ando Noriaki さんは書きました:
> 渡部様
>
> 産総研 安藤と申します
>
>   
>> はじめまして、筑波大学の渡部と申します。よろしくお願いします。
>> 最近OpenRTMを使い始め、C++も素人同然なので試行錯誤しています。
>>
>> rtc-templateを使用してRTコンポーネントを作成する際に、
>> 「module-max-inst」という項目があったので適当な数値をいれコンポーネント
>> を作成し、
>> RTC-Link上で動かしてみたのですが、一つのコンポーネントから複数のインスタ
>> ンスを生成することができません。
>> (というか複数インスタンスの生成方法がわかりません。)
>>     
>
> module-max-inst という項目は、生成できる最大のインスタンス数という意味で、
> 残念ながら、このオプションで生成するインスタンス数を指定することはできません。
> さらに、申し訳ないのですがOpeNRTM-aistの0.4系ではこのオプションは無視するように
> なっていて、インスタンスはいくらでも生成出来てしまいます。
>
>   
>> そこで質問なのですが、
>> 1.一つのコンポーネントから複数のインスタンスを生成するには
>> RTC-Link上でなにか特別な操作を行う必要があるのでしょうか。
>> それとも、「module-max-inst」に数値を入れただけでは駄目で、
>> コンポーネントのプログラムに手を加えないといけないのでしょうか。
>> 2.私のイメージでは、例えば「module-max-inst=5」としてCompAを作成した場合、
>> ネームサービスビューからシステムエディタにCompAを5回ドラッグ&ドロッ
>> プすることで
>> CompA0、CompA1、…、CompA4がシステムエディタ上に生成されるというイ
>> メージを持っていたのですが、
>> そもそもこの考えが間違っているのでしょうか。
>>     
>
> まず、ネームサービスビューに表示されているものは、クラスではなく
> コンポーネントのインスタンスですので、DnDを複数回しても
> インスタンスは増えません。また、同一のシステムエディタ上には
> 同じインスタンスを複数表示させることはできません。
> 将来的には、おっしゃるようにRtcLinkから動的にインスタンスを
> 生成できるようにはしたいと思っています。
>
> さて、コンポーネントのインスタンスを複数生成する方法ですが、
> 0.4.2以降復活したrtcdというコマンドと、
> rtc.confのオプションを指定することで実現できます。
>
> [0.4.2のリリースノート]
> http://www.is.aist.go.jp/rt/OpenRTM-aist/html/E38380E382A6E383B3E383ADE383BCE383892FC2B2B.html#l0daadc5
>
> まず、コンポーネントをビルドすると、*Comp[.exe] という実行ファイルとともに、
> .so (Linux) または.dll (Windows) といった共有ライブラリも生成されると思います。
> この共有ライブラリを適当なディレクトリに置き、以下のようなrtc.confを作成します。
> 以下、Linux(FedoraやUbuntu)に産総研配布のパッケージでOpenRTMを
> 入れたものとして、サンプルのConsoleInコンポーネントを3つ起動する例を示します。
>
>   
>> mkdir sample
>> cd sample
>> cp /usr/share/OpenRTM-aist/examples/rtcs/ConsoleIn.so.0.0.0 ConsoleIn.so
>>     
> # exampleのパッケージをインストールすると、上記の場所に
> # サンプルのsoファイルがインストールされているはず。
> # 実体は、.so.0.0.0 なので、.soとしてコピー(名前が長いので。。。)
>   
>> ls
>>     
> ConsoleIn.so
>   
>> vi rtc.conf 以下のようなファイルを作成
>>     
>
> corba.nameservers: localhost
> naming.formats: %n.rtc
> # Windows では.DLL、Linuxでは.so
> # manager.modules.preload: ConsoleIn.dll, ConsoleOut.dll
> manager.modules.preload: ConsoleIn.so
> manager.components.precreate: ConsoleIn, ConsoleIn, ConsoleIn
>
>   
>> ls
>>     
> ConsoleIn.so*  rtc.conf
>   
>> rtcd
>>     
> RtcLinkで確認するとConsoleIn0、ConsoleIn1, ConsoleIn2
> が生成されている。
>
>
> manager.modules.preload オプションで、ロードしたいコンポーネントの
> 共有ライブラリを指定します。
> さらに、manager.components.precreate で生成したいコンポーネント
> の型名を指定します。オプションは順に処理されるので、
> 上の例では、ConsoleIn が3つ生成されます。
> (100個ConsoleInと書けば100個生成されます。→添付の写真)
> このほかにも、ライブラリのロードに関するオプションはいくつかあるので、
> 詳細はソースコードに含まれる、etc/rtc.conf.sample をご覧ください。
>
> RTコンポーネントの起動の仕方としてはこちらが本来の使い方の
> つもりだったのですが、作ったコンポーネントを手軽に起動して
> 試すために*Compという実行ファイルもおまけで生成する
> ようになっています。
>   
>
> ------------------------------------------------------------------------
>




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