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

Ando Noriaki n-ando @ aist.go.jp
2008年 8月 28日 (木) 18:02:17 JST


渡部様

産総研 安藤と申します

> はじめまして、筑波大学の渡部と申します。よろしくお願いします。
> 最近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という実行ファイルもおまけで生成する
ようになっています。
-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
 知能システム研究部門 タスクインテリジェンス研究グループ
 〒305-8568 茨城県つくば市梅園1-1-1 中央第2
 TEL: 029-861-5981 FAX: 029-862-6631
 n-ando @ aist.go.jp, n-ando @ ieee.org
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: rtclink.jpg
型:         image/jpeg
サイズ:     565052 バイト
説明:       無し
URL:        <http://www.openrtm.org/pipermail/openrtm-users/attachments/20080828/bc8eeee9/attachment-0001.jpg>


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