[openrtm-users 01530] データポートコールバックに関する質問

5 個の投稿 / 0 new
最終投稿
root
オフライン
Last seen: 3日 16時間 前
登録日: 2009-06-23 14:31
[openrtm-users 01530] データポートコールバックに関する質問

OpenRTM-aist開発者の皆様

お世話になっております。富士ソフトの二宮です。

RTCプログラミング入門のデータポート (基礎編)の「データポートの接続」の絵を
見つつ、サンプルソースのSimpleIOを用いてデータポートコールバックの挙動を
調べていたところ、データフロー型=pull型の場合に不明な点がございましたので
ご質問させてください。

まずこちらの環境でデータ送信に拾うことが出来たコールバックはデータフロー型、
サブスクリプション型毎で以下のような流れとなっておりました。

<確認環境>
OS:Ubuntu10.04、WindowXP各々で確認
RTM:OpenRTM-1.0.0-RELEASE

push型(Flush)のデータ送信時
送信側
ON_SEND→ON_RECEIVED
受信側
ON_RECEIVED→ON_BUFFER_WRITE

push型(new/periodic)のデータ送信時
送信側
ON_BUFFER_WRITE→ON_BUFFER_READ→ON_SEND→ON_RECEIVED
受信側
ON_RECEIVED→ON_BUFFER_WRITE

pull型(受信側のisNewはコメントアウト)のデータ送信時
送信側
ON_BUFFER_READ→ON_SEND
受信側
ON_RECEIVED→ON_BUFFER_WRITE

ここで質問ですが、pull型ではどうしてもON_RECEIVEDを受け取ることが
出来ませんでしたが、これは仕様でしょうか?

pull型でも送信側としては送り出したデータが相手に到達したのか?は知りたい
ケースがあるかと思います。

お忙しいところ大変恐縮ですが、ご確認の程よろしくお願いいたします。

未定義
root
オフライン
Last seen: 3日 16時間 前
登録日: 2009-06-23 14:31
[openrtm-users 01532] データポートコールバックに関する質問

富士ソフト 二宮様

お世話になっております。
産総研 栗原です。

ご連絡が遅くなり、申し訳ございません。

> ここで質問ですが、pull型ではどうしてもON_RECEIVEDを受け取ることが
> 出来ませんでしたが、これは仕様でしょうか?
はい、仕様です。
以下のConnectorDataListenerタイプの"ON_RECEIVED"の説明にもありますように、
ON_RECEIVEDは、「InPortへの送信完了時」となっております。
http://www.openrtm.org/OpenRTM-aist/documents/current/cxx/classreference_ja/namespaceRTC.html#aecdfe03a1e91ff9522a322e4bcc9ed71
pull型では、InPort側のタイミングでOutPort側のget()オペレーションが呼ばれ、
OutPort側では”InPortへの送信が完了した”事を知る事ができません。
よって、ON_RECEIVEDはコールしないようになっております。

> pull型でも送信側としては送り出したデータが相手に到達したのか?は知りたい
> ケースがあるかと思います。
OutPort側のget()がreturnする直前でON_RECEIVEDをコールするように変更する事は
可能ですが、この場合、「InPortへのデータ送信が完了したという保証はできない」
といった条件がつきます。
これでもよろしければ、pull型の接続でもOutPort側でON_RECEIVEDコールバックを
コールするように変更致します。
タイミング的には、 ON_BUFFER_READ→ON_SEND->ON_RECEIVED(ON_SENDの直後)となりま
す。

この件に関しまして、皆様のご意見をいただければと存じます。

以上、宜しくお願い致します。

On Tue, 11 Jan 2011 10:53:55 +0900
二宮恒樹 wrote:

> OpenRTM-aist開発者の皆様
>
> お世話になっております。富士ソフトの二宮です。
>
> RTCプログラミング入門のデータポート (基礎編)の「データポートの接続」の絵を
> 見つつ、サンプルソースのSimpleIOを用いてデータポートコールバックの挙動を
> 調べていたところ、データフロー型=pull型の場合に不明な点がございましたので
> ご質問させてください。
>
> まずこちらの環境でデータ送信に拾うことが出来たコールバックはデータフロー型、
> サブスクリプション型毎で以下のような流れとなっておりました。
>
> <確認環境>
> OS:Ubuntu10.04、WindowXP各々で確認
> RTM:OpenRTM-1.0.0-RELEASE
>
> push型(Flush)のデータ送信時
> 送信側
> ON_SEND→ON_RECEIVED
> 受信側
> ON_RECEIVED→ON_BUFFER_WRITE
>
> push型(new/periodic)のデータ送信時
> 送信側
> ON_BUFFER_WRITE→ON_BUFFER_READ→ON_SEND→ON_RECEIVED
> 受信側
> ON_RECEIVED→ON_BUFFER_WRITE
>
> pull型(受信側のisNewはコメントアウト)のデータ送信時
> 送信側
> ON_BUFFER_READ→ON_SEND
> 受信側
> ON_RECEIVED→ON_BUFFER_WRITE
>
> ここで質問ですが、pull型ではどうしてもON_RECEIVEDを受け取ることが
> 出来ませんでしたが、これは仕様でしょうか?
>
> pull型でも送信側としては送り出したデータが相手に到達したのか?は知りたい
> ケースがあるかと思います。
>
> お忙しいところ大変恐縮ですが、ご確認の程よろしくお願いいたします。
>
>

root
オフライン
Last seen: 3日 16時間 前
登録日: 2009-06-23 14:31
[openrtm-users 01533] データポートコールバックに関する質問

皆様:

産総研の原です。

On 2011/01/13, at 0:13, kurihara shinji wrote:
>
>> pull型でも送信側としては送り出したデータが相手に到達したのか?は知りたい
>> ケースがあるかと思います。
> OutPort側のget()がreturnする直前でON_RECEIVEDをコールするように変更する事は
> 可能ですが、この場合、「InPortへのデータ送信が完了したという保証はできない」
> といった条件がつきます。
> これでもよろしければ、pull型の接続でもOutPort側でON_RECEIVEDコールバックを
> コールするように変更致します。
> タイミング的には、 ON_BUFFER_READ→ON_SEND->ON_RECEIVED(ON_SENDの直後)となりま
> す。
>
> この件に関しまして、皆様のご意見をいただければと存じます。

この件ですが、get()がreturnする直前では、厳密には、データを送信していません。
ON_SENDの前になるはずです。上記のような実装だと、ON_SEND=ON_RECEIVEDと
なると思います。
現在の実装では、pull型であれば、ON_RECEIVEDをコールすることは、厳密には難しいと思いますので、
ON_RECIEVEDを使いたい場合には、push型の接続を使うのではないでしょうか。

root
オフライン
Last seen: 3日 16時間 前
登録日: 2009-06-23 14:31
[openrtm-users 01534] データポートコールバックに関する質問

原様、栗原様

お世話になっております。富士ソフトの二宮です。

丁寧なご説明、ありがとうございました。仕組みを理解できました。

仕様につきましては、特に対応はせず、現状のままで問題ないかと思います。

原様の仰るとおり「ON_RECIEVEDを使いたい場合には、push型の接続を使う」
ということで、目的に応じてコネクタの属性を使い分ければ良く、各々の特性を
理解するにあたり今回質問させていただいた次第です。

以上です。

2011年1月13日9:04 原 功 :
> 皆様:
>
> 産総研の原です。
>
> On 2011/01/13, at 0:13, kurihara shinji wrote:
>>
>>> pull型でも送信側としては送り出したデータが相手に到達したのか?は知りたい
>>> ケースがあるかと思います。
>> OutPort側のget()がreturnする直前でON_RECEIVEDをコールするように変更する事は
>> 可能ですが、この場合、「InPortへのデータ送信が完了したという保証はできない」
>> といった条件がつきます。
>> これでもよろしければ、pull型の接続でもOutPort側でON_RECEIVEDコールバックを
>> コールするように変更致します。
>> タイミング的には、 ON_BUFFER_READ→ON_SEND->ON_RECEIVED(ON_SENDの直後)となりま
>> す。
>>
>> この件に関しまして、皆様のご意見をいただければと存じます。
>
>
> この件ですが、get()がreturnする直前では、厳密には、データを送信していません。
> ON_SENDの前になるはずです。上記のような実装だと、ON_SEND=ON_RECEIVEDと
> なると思います。
> 現在の実装では、pull型であれば、ON_RECEIVEDをコールすることは、厳密には難しいと思いますので、
> ON_RECIEVEDを使いたい場合には、push型の接続を使うのではないでしょうか。
>

root
オフライン
Last seen: 3日 16時間 前
登録日: 2009-06-23 14:31
[openrtm-users 01540] データポートコールバックに関する質問

二宮様、皆様

安藤です

栗原から説明がありましたようにpull型ですと、「データがの送信が完了した」
ということをOutPort側では確認できないので、実装時にON_RECEIVEDは
コールしないようにしました。

ただし、pull型の場合InPort側はデータを受け取り処理をできる準備ができているはず
(onExecute内のロジックにもよりますが)なので、ON_SENDがほぼ同等の
意味になるかと思います。ただし、データが到達した厳密なタイミングを
知りたい場合は今のところそれを知る方法はありません。

CORBAのPortableInterceptorのServerInterceptor?を使うとかなり
近いことができるのですが、それでもオペレーションが戻る寸前のタイミング
にフックを仕掛けるにとどまり、送信が完了したことを検知する仕組みは
なさそうです。(もしご存知の方がいれば教えてください。)

もしこれを行うのであれば現在のOutPortのインターフェースを
例えば、以下のように変更する必要があります。

interface OutPortCdr
{
PortStatus get(out CdrData data, out long cookie);
void done(in long cookie); // これを追加する
};

1回のデータ送信で2回呼び出しが発生してしまうので、
あまりうれしくない拡張のように思います。したがいまして、
現状の仕様のままで行きたいと思います。

以上、よろしくお願いいたします。

なお、コールバックの詳細については、デベロッパーズガイドの
データポートの応用編で書く予定なのですが、筆が遅くてまだそこまで
たどり着いておりません。すみませんが、いましばらくお待ちください。

コールバックについては ConnectorListener.hのリファレンスマニュアルの
以下のページをご覧ください。

http://www.openrtm.org/OpenRTM-aist/documents/current/cxx/classreference_ja/namespaceRTC.html#aecdfe03a1e91ff9522a322e4bcc9ed71

http://www.openrtm.org/OpenRTM-aist/documents/current/cxx/classreference_ja/namespaceRTC.html#a56d51b87875a454c91b4fee8af41422c

http://www.openrtm.org/OpenRTM-aist/documents/current/cxx/classreference_ja/classRTC_1_1ConnectorListener.html

http://www.openrtm.org/OpenRTM-aist/documents/current/cxx/classreference_ja/classRTC_1_1ConnectorDataListener.html

2011年1月13日10:48 二宮恒樹 :
> 原様、栗原様
>
> お世話になっております。富士ソフトの二宮です。
>
> 丁寧なご説明、ありがとうございました。仕組みを理解できました。
>
> 仕様につきましては、特に対応はせず、現状のままで問題ないかと思います。
>
> 原様の仰るとおり「ON_RECIEVEDを使いたい場合には、push型の接続を使う」
> ということで、目的に応じてコネクタの属性を使い分ければ良く、各々の特性を
> 理解するにあたり今回質問させていただいた次第です。
>
> 以上です。
>
> 2011年1月13日9:04 原 功 :
>> 皆様:
>>
>> 産総研の原です。
>>
>> On 2011/01/13, at 0:13, kurihara shinji wrote:
>>>
>>>> pull型でも送信側としては送り出したデータが相手に到達したのか?は知りたい
>>>> ケースがあるかと思います。
>>> OutPort側のget()がreturnする直前でON_RECEIVEDをコールするように変更する事は
>>> 可能ですが、この場合、「InPortへのデータ送信が完了したという保証はできない」
>>> といった条件がつきます。
>>> これでもよろしければ、pull型の接続でもOutPort側でON_RECEIVEDコールバックを
>>> コールするように変更致します。
>>> タイミング的には、 ON_BUFFER_READ→ON_SEND->ON_RECEIVED(ON_SENDの直後)となりま
>>> す。
>>>
>>> この件に関しまして、皆様のご意見をいただければと存じます。
>>
>>
>> この件ですが、get()がreturnする直前では、厳密には、データを送信していません。
>> ON_SENDの前になるはずです。上記のような実装だと、ON_SEND=ON_RECEIVEDと
>> なると思います。
>> 現在の実装では、pull型であれば、ON_RECEIVEDをコールすることは、厳密には難しいと思いますので、
>> ON_RECIEVEDを使いたい場合には、push型の接続を使うのではないでしょうか。
>>

コメントを投稿するにはログインまたはユーザー登録を行ってください

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2195
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク