[openrtm-users 01055] Re: python 版におけるSystemEditorを使用しないコンポーネントの接続方法について

Ando Noriaki n-ando @ aist.go.jp
2009年 12月 25日 (金) 11:28:47 JST


鳥居様

産総研 安藤です

お世話になっております。

> 本田技術研究所の鳥井です。
>
> python版で、スクリプトからコンポーネントを配線する方法について質問がござい
> ます。
>
> SimpleIO ディレクトリに、入力ポートと出力ポートがあるコンポーネントとして
> ConsoleProxy というコンポーネントを新規に作成しました。
>
> さらに、ConsoleOut.pyの MyModuleInit()内で、インスタンスを
> 追加する一文( comp2 = manager.createComponent('ConsoleOut')
> を加え、以下の用に配線したいと思います。
>
>
>                                            +-(2)-ConsoleOut0
>                                            |
> CosoleIn0-(1)-ConsoleProxy---+-(3)-ConsoleOut1
>
>
> さて、これを入出力ポートの組毎にConnectorProfileを作成し、
> その度に関連するポートのconnect()を呼ぶことで、配線できることは確認しました
> (合計3度connect()を呼ぶことになります)。
>
> しかし、RTCの仕様によると、一度のconnectで、ConnectorProfileを
> 伝播させて、全ての配線ができるように読み取れましたので、
>
> ポートリストに例えば、
>
> [pin[0], pproxy[0], pproxy[1], pout[0], pout2[0]]
>
> このようして、pin[0] のconnectを呼んでみたのですが、
> 最初の一組しか配線できませんでした。
>
> なにか解釈を間違えているのでしょうか? どうぞご教示ください。

おっしゃる通り、OMG RTC 仕様では、複数のポートが関連する
接続(Connector)を1回の呼び出しで構成できるような記述があります。

ここで注意する必要があるのが、ポートの接続と、ポートに付属する
インターフェースの接続とは別であるということです。
鳥居さんがされた後者の操作では、(1)の接続しか動作しなかったかも
しれませんが、すべてのポートは同一のConnectorProfileを共有しており、
「ポート的には」接続されている状態になっています。
一方、OMGのRTC仕様では、「インターフェースの接続」に関しては
触れられておらず、実装依存ということになっております。

現状のデータポートでは、ポートはInPort1対OutPort1であることが
前提となっており、鳥居さんがされたような接続方法は申し訳ありあせんが、
サポートされておりません。

基本的な考え方として、データポートはRTC間のデータストリームチャネル
であり、1(out)対n(in)またはn(out)対1(in)を一つのコネクタで構成するのは
いろいろと混乱を招きそうなためこういう仕様にしております。
また、1度のconnect()呼び出しで構成できるのは1つのコネクタですので、
仮にdisconnect()すると、上記の(1)〜(3)すべての接続が切断されてしまい
これもまた混乱のもとになると考えました。

また、上記の例では、考え方にもよりますが、(1) と (2),(3) の接続には
関連が無さそうにも見えますので、同じ接続(Connector)として構成するのは
少々違和感があります。
#(2)、(3)の接続を1回のconnect()呼び出しで構成するのは、僕としては
#ありかなとも思いますが。。。


また、インターフェースレベルで考えますと、1つのコネクタ内で、
インターフェース同士の接続関係を指定してあげる必要があるので
ConnectorProfileを作るのが少々面倒になります。

上の例で登場する4つのコンポーネントのインターフェースを
仮に、Provided I/Fを "o--"、Required I/F を "--<" と書けば

          [ConsoleIn]--< (r0)
(p0) o--[ConsoleProxy]--< (r1)
(p1) o--[ConsoleOut0]
(p2) o--[ConsoleOut1]

のように書くことができます。
ここで、それぞれp0-2, r0-1 のように名前を付けておきます。

上の例のようの接続したい場合、それぞれインターフェースごとの
接続の対応関係は、
(r0)--(p0), (r1)--(p1), (r1')--(p2)
のようになりますが、これをConnectorProfileに与えてあげ、
かつ各ポートでは、この記述に従ってインターフェースごとの
接続を構成してあげる必要があります。

さらに、(r1)と(r1')のように、Requiredインターフェースは通常
複数のProvidedインターフェースにはつながりませんので、
上記の接続を行うにはr1を複数用意する必要があります。
データポートでは接続毎に動的にRequiredインターフェースを
増やすことでこれに対処しております。

実は、間もなくリリースする1.0では、サービスポートに限り、
上記のような複雑なインターフェースの接続関係を接続時に
指定する方法がサポートされます。
しかし、データポートでは上記の理由により、このような複雑な
指定に対応させるメリットがあまり無いように思えましたので、
1対1接続のみサポートする仕様のままです。

ご理解いただけましたでしょうか?
-- 
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
    統合知能研究グループ 主任研究員, 博士(工学)
    〒305-8568 つくば市梅園1-1-1 中央第2
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org



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