[openrtm-users 00938] 同一インターフェースのProvider,Consumerを持つサービスポートの不具合(OpenRTM-aist 0.4.2 C++)

7 posts / 0 new
Last post
root
Offline
Last seen: 17 hours 52 sec ago
Joined: 2009-06-23 14:31
[openrtm-users 00938] 同一インターフェースのProvider,Consumerを持つサービスポートの不具合(OpenRTM-aist 0.4.2 C++)

中央大学の小島と申します。

いつもお世話になっております。

もしかしたら、バグなのでは?ということが見つかったので報告させていただきます。
使っているVersionは0.4.2のC++で、Ubutnsu 8.0.4を使っています。

同一インターフェース(Interface name, type
nameともに、同じ名前)のProvider,Consumerを持つサービスポートを他のコンポーネントと接続しました。
すると、自分の中の、ServicePortとConsumerPortをつないでしまう現象が発生しました。(外部と接続することもあるので、動作が不定です)
なお、接続にはRTCLinkを使って接続をいたしました。

ただし、厳密には、実装時に、デフォルトのコンストラクタを拡張し、
ServicePort側に、Consumer側の情報を持つものと、持たないもので接続しておりますが、
これの内容が違うというだけで接続がおかしくなるということは、原因ではないと考えます。

構成したポートの例は以下のようになります。

Service Port
- port.port_type : CorbaPort

- Port Interface Profile
- interface name : XXXPort
- typename : XXXPort
- port interface polarity PROVIDED

- Port Interface Profile
- interface name : XXXPort
- typename : XXXPort
- port interface polarity REQUIRED

以下が、再現用のIDLです。

interface XXXPort
{
short set(in string name, in short version);
};

この問題を、回避または解決する方法として、
Interface nameもしくは、type nameを変えることが考えられますが、
その方法でしか解決できないのでしょうか?

ご存知の方がいらっしゃいましたら、ご教授いただけると幸いです。

また、Version 1.0.0で、この現象についてテストはおこなっていませんが、同じ現象が起こりうるのでしょうか?
ご教授いただけると幸いです。

環境はOpenRTM-aist-0.4.2, OSはUbuntsu 8.0.4 , コンパイラはgcc 4.2です。
以上、よろしくお願いいたします。

Undefined
root
Offline
Last seen: 17 hours 52 sec ago
Joined: 2009-06-23 14:31
[openrtm-users 00940] 同一インターフェースのProvider,Consumerを持つサービスポートの不具

小島様

安藤です

いつもお世話になっております。

> もしかしたら、バグなのでは?ということが見つかったので報告させていただきます。
> 使っているVersionは0.4.2のC++で、Ubutnsu 8.0.4を使っています。

すみません。ドキュメントがリファレンスマニュアルしかないので、わかりにくいと思いますが、
バグではなくて仕様です。詳細は、CorbaPort.h もしくは、
http://www.is.aist.go.jp/rt/OpenRTM-aist/doxygen/ClassReference/classRTC_1_1CorbaPort.html
をご覧ください。

静的にしか対応関係を定義できないので使いづらいのですが、
同一typeのインターフェースがポートに多数存在しても、
任意のPorvider-Consumerを接続することはできます。

具体的には、サービスポートにインターフェースを登録する際に
registerProviderやregisterConsumerの第1引数に与える、
インスタンス名を対応させたい者同士で合わせてみていただけないでしょうか?

たとえば、すべて同一のMyService型のProviderとConsumerを
同じポートに持つRTC-AとRTC-Bがある場合、

RTC-A:
m_ServicePort.registerProvider("myserviceA", "MyService", m_myserviceProvider);
m_ServicePort.registerConsumer("myserviceB", "MyService", m_myserviceConsumer);

RTC-B:
m_ServicePort.registerProvider("myserviceB", "MyService", m_myserviceProvider);
m_ServicePort.registerConsumer("myserviceA", "MyService", m_myserviceConsumer);

のように登録してあげると、AのProviderとBのConsumer、
BのProviderとAのConsumerが接続されます。

なお、1.0-RC1でも、サービスポートは同じ実装になっております。
ただし、RELEASEまでにはProviderとConsumerの対応関係を
接続時に与えられるようにしたいと考えております。

ただし、これを実現するためにはRTSystemEditorの方も変更しなければならないので
もしかすると1.0-RELEASEには入らないかもしれません。

> 同一インターフェース(Interface name, type
> nameともに、同じ名前)のProvider,Consumerを持つサービスポートを他のコンポーネントと接続しました。
> すると、自分の中の、ServicePortとConsumerPortをつないでしまう現象が発生しました。(外部と接続することもあるので、動作が不定です)
> なお、接続にはRTCLinkを使って接続をいたしました。
>
> ただし、厳密には、実装時に、デフォルトのコンストラクタを拡張し、
> ServicePort側に、Consumer側の情報を持つものと、持たないもので接続しておりますが、
> これの内容が違うというだけで接続がおかしくなるということは、原因ではないと考えます。
>
> 構成したポートの例は以下のようになります。
>
> Service Port
> - port.port_type : CorbaPort
>
> - Port Interface Profile
> - interface name : XXXPort
> - typename : XXXPort
> - port interface polarity PROVIDED
>
> - Port Interface Profile
> - interface name : XXXPort
> - typename : XXXPort
> - port interface polarity REQUIRED
>
> 以下が、再現用のIDLです。
>
> interface XXXPort
> {
> short set(in string name, in short version);
> };
>
>
>
> この問題を、回避または解決する方法として、
> Interface nameもしくは、type nameを変えることが考えられますが、
> その方法でしか解決できないのでしょうか?
>
> ご存知の方がいらっしゃいましたら、ご教授いただけると幸いです。
>
> また、Version 1.0.0で、この現象についてテストはおこなっていませんが、同じ現象が起こりうるのでしょうか?
> ご教授いただけると幸いです。
>
>
> 環境はOpenRTM-aist-0.4.2, OSはUbuntsu 8.0.4 , コンパイラはgcc 4.2です。
> 以上、よろしくお願いいたします。

root
Offline
Last seen: 17 hours 52 sec ago
Joined: 2009-06-23 14:31
[openrtm-users 00941] 同一インターフェースのProvider,Consumerを持つサービスポートの不具

安藤です

補足です。

対応関係についての記述はリファレンスマニュアルのsubscribeInterfaces のところ

http://www.is.aist.go.jp/rt/OpenRTM-aist/doxygen/ClassReference/classRTC_1_1CorbaPort.html#d9a122cbe2f9892cc9555e805571742e

に記述があります。

では。

2009年9月4日12:07 に Ando Noriaki さんは書きました:
> 小島様
>
> 安藤です
>
> いつもお世話になっております。
>
>> もしかしたら、バグなのでは?ということが見つかったので報告させていただきます。
>> 使っているVersionは0.4.2のC++で、Ubutnsu 8.0.4を使っています。
>
> すみません。ドキュメントがリファレンスマニュアルしかないので、わかりにくいと思いますが、
> バグではなくて仕様です。詳細は、CorbaPort.h もしくは、
> http://www.is.aist.go.jp/rt/OpenRTM-aist/doxygen/ClassReference/classRTC_1_1CorbaPort.html
> をご覧ください。
>
>
> 静的にしか対応関係を定義できないので使いづらいのですが、
> 同一typeのインターフェースがポートに多数存在しても、
> 任意のPorvider-Consumerを接続することはできます。
>
> 具体的には、サービスポートにインターフェースを登録する際に
> registerProviderやregisterConsumerの第1引数に与える、
> インスタンス名を対応させたい者同士で合わせてみていただけないでしょうか?
>
> たとえば、すべて同一のMyService型のProviderとConsumerを
> 同じポートに持つRTC-AとRTC-Bがある場合、
>
> RTC-A:
> m_ServicePort.registerProvider("myserviceA", "MyService", m_myserviceProvider);
> m_ServicePort.registerConsumer("myserviceB", "MyService", m_myserviceConsumer);
>
> RTC-B:
> m_ServicePort.registerProvider("myserviceB", "MyService", m_myserviceProvider);
> m_ServicePort.registerConsumer("myserviceA", "MyService", m_myserviceConsumer);
>
> のように登録してあげると、AのProviderとBのConsumer、
> BのProviderとAのConsumerが接続されます。
>
> なお、1.0-RC1でも、サービスポートは同じ実装になっております。
> ただし、RELEASEまでにはProviderとConsumerの対応関係を
> 接続時に与えられるようにしたいと考えております。
>
> ただし、これを実現するためにはRTSystemEditorの方も変更しなければならないので
> もしかすると1.0-RELEASEには入らないかもしれません。
>
>
>
>
>> 同一インターフェース(Interface name, type
>> nameともに、同じ名前)のProvider,Consumerを持つサービスポートを他のコンポーネントと接続しました。
>> すると、自分の中の、ServicePortとConsumerPortをつないでしまう現象が発生しました。(外部と接続することもあるので、動作が不定です)
>> なお、接続にはRTCLinkを使って接続をいたしました。
>>
>> ただし、厳密には、実装時に、デフォルトのコンストラクタを拡張し、
>> ServicePort側に、Consumer側の情報を持つものと、持たないもので接続しておりますが、
>> これの内容が違うというだけで接続がおかしくなるということは、原因ではないと考えます。
>>
>> 構成したポートの例は以下のようになります。
>>
>> Service Port
>> - port.port_type : CorbaPort
>>
>> - Port Interface Profile
>> - interface name : XXXPort
>> - typename : XXXPort
>> - port interface polarity PROVIDED
>>
>> - Port Interface Profile
>> - interface name : XXXPort
>> - typename : XXXPort
>> - port interface polarity REQUIRED
>>
>> 以下が、再現用のIDLです。
>>
>> interface XXXPort
>> {
>> short set(in string name, in short version);
>> };
>>
>>
>>
>> この問題を、回避または解決する方法として、
>> Interface nameもしくは、type nameを変えることが考えられますが、
>> その方法でしか解決できないのでしょうか?
>>
>> ご存知の方がいらっしゃいましたら、ご教授いただけると幸いです。
>>
>> また、Version 1.0.0で、この現象についてテストはおこなっていませんが、同じ現象が起こりうるのでしょうか?
>> ご教授いただけると幸いです。
>>
>>
>> 環境はOpenRTM-aist-0.4.2, OSはUbuntsu 8.0.4 , コンパイラはgcc 4.2です。
>> 以上、よろしくお願いいたします。

root
Offline
Last seen: 17 hours 52 sec ago
Joined: 2009-06-23 14:31
[openrtm-users 00942] [openrtm-users 00938] 同一インターフェースのProvider

2009/9/4 Ando Noriaki :
> 安藤です
>
> 補足です。
>
> 対応関係についての記述はリファレンスマニュアルのsubscribeInterfaces のところ
>
> http://www.is.aist.go.jp/rt/OpenRTM-aist/doxygen/ClassReference/classRTC_1_1CorbaPort.html#d9a122cbe2f9892cc9555e805571742e
>
> に記述があります。
>

わかりました。仕様なのですね。

この記述は読みましたが、同じ登録されているポートの中では行われない仕組みがあったのかと
思っておりました。

確認なのですが、
現在の仕組みでは、すなわち、登録可能なサービスが2つ以上あった場合には、接続がおこなわれると、
接続された先のServiceが、2つとも実行されるかと思ったのですが、最初に見つかったほうのみ、呼び出される
という仕様でよろしいでしょうか?
(検索する先がソートされた後ならば一定だが、そうでない場合は不定になる可能性もある)

また、この仕組みは、Releaseまでには、変更されなということは、しばらく変更がないということでよろしいでしょうか?

root
Offline
Last seen: 17 hours 52 sec ago
Joined: 2009-06-23 14:31
[openrtm-users 00943] 同一インターフェースのProvider,Consumerを持つサービスポートの不具

小島様

安藤です

> 2009/9/4 Ando Noriaki :
>> 安藤です
>>
>> 補足です。
>>
>> 対応関係についての記述はリファレンスマニュアルのsubscribeInterfaces のところ
>>
>> http://www.is.aist.go.jp/rt/OpenRTM-aist/doxygen/ClassReference/classRTC_1_1CorbaPort.html#d9a122cbe2f9892cc9555e805571742e
>>
>> に記述があります。
>>
>
> わかりました。仕様なのですね。
>
> この記述は読みましたが、同じ登録されているポートの中では行われない仕組みがあったのかと
> 思っておりました。
>
> 確認なのですが、
> 現在の仕組みでは、すなわち、登録可能なサービスが2つ以上あった場合には、接続がおこなわれると、
> 接続された先のServiceが、2つとも実行されるかと思ったのですが、最初に見つかったほうのみ、呼び出される
> という仕様でよろしいでしょうか?
> (検索する先がソートされた後ならば一定だが、そうでない場合は不定になる可能性もある)

基本的には、インターフェースのインスタンス名はかぶらないという前提です。

ご質問は、仮に同名のプロバイダが複数と、コンシューマが1個の場合、
どのように接続されるか、ということでしょうか?
でしたら、最初に見つかったものがコンシューマに関連付けられ
それだけが呼び出されるという動作であっています。

コンシューマで使用さされる CorbaConsumer はCORBAオブジェクトの
単なるプロキシなので、一回の呼び出しで複数の別のオブジェクトが
それぞれ呼び出されるという動作はしません。

> また、この仕組みは、Releaseまでには、変更されなということは、しばらく変更がないということでよろしいでしょうか?

その予定です。

root
Offline
Last seen: 17 hours 52 sec ago
Joined: 2009-06-23 14:31
[openrtm-users 00947] [openrtm-users 00938] 同一インターフェースのProvider

安藤様

>> 確認なのですが、
>> 現在の仕組みでは、すなわち、登録可能なサービスが2つ以上あった場合には、接続がおこなわれると、
>> 接続された先のServiceが、2つとも実行されるかと思ったのですが、最初に見つかったほうのみ、呼び出される
>> という仕様でよろしいでしょうか?
>> (検索する先がソートされた後ならば一定だが、そうでない場合は不定になる可能性もある)
>
> 基本的には、インターフェースのインスタンス名はかぶらないという前提です。
>
> ご質問は、仮に同名のプロバイダが複数と、コンシューマが1個の場合、
> どのように接続されるか、ということでしょうか?
> でしたら、最初に見つかったものがコンシューマに関連付けられ
> それだけが呼び出されるという動作であっています。
>
> コンシューマで使用さされる CorbaConsumer はCORBAオブジェクトの
> 単なるプロキシなので、一回の呼び出しで複数の別のオブジェクトが
> それぞれ呼び出されるという動作はしません。

はい、同名のプロバイダに接続されてしまっている時の挙動を確認したいと思っておりました。
最初にみつかったもののみ、呼び出される旨を承知いたしました。

双方向で、お互いにある同じサービスが授受できる仕組みを一つのポートでできないかと考え、
インターフェース名が同じものを持つ仕組みを作ってしまいました。
これを実現するには、ポートを別々にするしか手はなさそうですね。

ありがとうございました。

root
Offline
Last seen: 17 hours 52 sec ago
Joined: 2009-06-23 14:31
[openrtm-users 00950] 同一インターフェースのProvider,Consumerを持つサービスポートの不具

安藤です

2009年9月10日9:52 Takashi Kojima :
> 安藤様
>
>>> 確認なのですが、
>>> 現在の仕組みでは、すなわち、登録可能なサービスが2つ以上あった場合には、接続がおこなわれると、
>>> 接続された先のServiceが、2つとも実行されるかと思ったのですが、最初に見つかったほうのみ、呼び出される
>>> という仕様でよろしいでしょうか?
>>> (検索する先がソートされた後ならば一定だが、そうでない場合は不定になる可能性もある)
>>
>> 基本的には、インターフェースのインスタンス名はかぶらないという前提です。
>>
>> ご質問は、仮に同名のプロバイダが複数と、コンシューマが1個の場合、
>> どのように接続されるか、ということでしょうか?
>> でしたら、最初に見つかったものがコンシューマに関連付けられ
>> それだけが呼び出されるという動作であっています。
>>
>> コンシューマで使用さされる CorbaConsumer はCORBAオブジェクトの
>> 単なるプロキシなので、一回の呼び出しで複数の別のオブジェクトが
>> それぞれ呼び出されるという動作はしません。
>
> はい、同名のプロバイダに接続されてしまっている時の挙動を確認したいと思っておりました。
> 最初にみつかったもののみ、呼び出される旨を承知いたしました。
>
> 双方向で、お互いにある同じサービスが授受できる仕組みを一つのポートでできないかと考え、
> インターフェース名が同じものを持つ仕組みを作ってしまいました。
> これを実現するには、ポートを別々にするしか手はなさそうですね。

いえ、前回のメールで示した通り、インスタンス名を分ければ可能なはずです。

Log in or register to post comments

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK