[openrtm-users 02745] バッファまわりの改善要望

4 個の投稿 / 0 new
最終投稿
Masayuki Shimizu
オフライン
Last seen: なし 前
登録日: 2011-10-28 12:20
[openrtm-users 02745] バッファまわりの改善要望

OpenRTM-aist開発チームの皆さま

静岡大の清水です。

バッファやコネクタまわりに関しての改善・検討要望です。
過日のSI2012で発表した、共有メモリベースの
データ通信機能を実装する際に問題となった点です。
ご検討頂ければ幸いです。

【問題点】
現行のコネクタの実装(InPortPushConnectorを例とします)では、
以下の手順で初期化(コンストラクタ内で)がされています。

(1) バッファ生成
(2) プロバイダの初期化(InPortProvider::init()のコール)

一般に、プロバイダ(コンシューマも)は特定のバッファとの組み合わせでしか
動作しない場合も考えられると思います。
すなわち、プロバイダがどのバッファを生成するかを制御できる必要があります。

どのバッファを生成するかは、ConnectorProfileにbuffer_typeを設定することで
制御できますが、もしユーザが間違ったbuffer_typeを指定した場合、
あるいは何も指定しなかった場合は、プロバイダに適合したバッファが生成されません。

【対応策】
この問題は、バッファの生成とプロバイダの初期化の順序を入れ替えることで
回避できます。私が実際に変更したコードは以下です。

・オリジナル(一部のみ抜粋)
InPortPushConnector(ConnectorInfo info, InPortProvider *provider)
{
  m_buffer = createBuffer(info);
  m_buffer->init(info.properties.getNode("buffer"));
  m_provider->init(info.properties);
  m_provider->setBuffer(m_buffer);
  m_provider->setListener(info, &m_listeners);
}

・変更後
InPortPushConnector(ConnectorInfo info, InPortProvider *provider)
{
m_provider->init(info.properties); //<= バッファ生成前にプロバイダのinit()をする
m_buffer = createBuffer(info);
m_buffer->init(info.properties.getNode("buffer"));
m_provider->setBuffer(m_buffer);
m_provider->setListener(info, &m_listeners);
}

以上のように変更し、自作プロバイダのinit()内でbuffer_typeプロパティを
追加(または上書き)すれば、プロバイダがバッファの種類を完全に制御できます。

ところで、プロバイダのinit()の引数がconst指定になっていないのは、
プロバイダがConnectorProfileの情報(コピー)を書き変えても良いということだと、
私は判断しましたが、それで問題ないですよね。
もし書き換えを許可しないなら、const指定とする必要があります。

以上、よろしくご検討をお願いいたします。

清水
--------------------
Masayuki Shimizu
Assistant Professor
Dept. of Mechanical Engineering, Shizuoka Univ.
3-5-1, Johoku, Naka-ku, Hamamatsu 432-8561, JAPAN
TEL/FAX: +81-53-478-1061
Email: tmsimiz@ipc.shizuoka.ac.jp
_______________________________________________
openrtm-users mailing list
openrtm-users@openrtm.org
http://www.openrtm.org/mailman/listinfo/openrtm-users

未定義
Ando Noriaki
オフライン
Last seen: 1年 9ヶ月 前
登録日: 2011-09-04 17:20
[openrtm-users 02746] バッファまわりの改善要望

清水先生

安藤です

ご提案ありがとうございます。
おっしゃるような初期化順序でも問題なさそうですね。
精査して実装に取り込みたいと思います。

また、init() の引数がconstでない理由はInPortProviderに関する情報を
相手に伝えるためかな、と思ったのですが、以下のドキュメントを読む限り
別途Providerの情報を伝える手段があるのでconstでもいいような気がします。
http://svn.openrtm.org/OpenRTM-aist/tags/RELEASE_1_1_0/OpenRTM-aist/src/lib/rtm/InPortProvider.h

これについても調べて修正します。とりあえずチケット発行しました。
ありがとうございました。

2013年1月4日 17:43 Masayuki Shimizu :
> OpenRTM-aist開発チームの皆さま
>
> 静岡大の清水です。
>
> バッファやコネクタまわりに関しての改善・検討要望です。
> 過日のSI2012で発表した、共有メモリベースの
> データ通信機能を実装する際に問題となった点です。
> ご検討頂ければ幸いです。
>
> 【問題点】
> 現行のコネクタの実装(InPortPushConnectorを例とします)では、
> 以下の手順で初期化(コンストラクタ内で)がされています。
>
> (1) バッファ生成
> (2) プロバイダの初期化(InPortProvider::init()のコール)
>
> 一般に、プロバイダ(コンシューマも)は特定のバッファとの組み合わせでしか
> 動作しない場合も考えられると思います。
> すなわち、プロバイダがどのバッファを生成するかを制御できる必要があります。
>
> どのバッファを生成するかは、ConnectorProfileにbuffer_typeを設定することで
> 制御できますが、もしユーザが間違ったbuffer_typeを指定した場合、
> あるいは何も指定しなかった場合は、プロバイダに適合したバッファが生成されません。
>
> 【対応策】
> この問題は、バッファの生成とプロバイダの初期化の順序を入れ替えることで
> 回避できます。私が実際に変更したコードは以下です。
>
> ・オリジナル(一部のみ抜粋)
> InPortPushConnector(ConnectorInfo info, InPortProvider *provider)
> {
> m_buffer = createBuffer(info);
> m_buffer->init(info.properties.getNode("buffer"));
> m_provider->init(info.properties);
> m_provider->setBuffer(m_buffer);
> m_provider->setListener(info, &m_listeners);
> }
>
> ・変更後
> InPortPushConnector(ConnectorInfo info, InPortProvider *provider)
> {
> m_provider->init(info.properties); //<= バッファ生成前にプロバイダのinit()をする
> m_buffer = createBuffer(info);
> m_buffer->init(info.properties.getNode("buffer"));
> m_provider->setBuffer(m_buffer);
> m_provider->setListener(info, &m_listeners);
> }
>
> 以上のように変更し、自作プロバイダのinit()内でbuffer_typeプロパティを
> 追加(または上書き)すれば、プロバイダがバッファの種類を完全に制御できます。
>
> ところで、プロバイダのinit()の引数がconst指定になっていないのは、
> プロバイダがConnectorProfileの情報(コピー)を書き変えても良いということだと、
> 私は判断しましたが、それで問題ないですよね。
> もし書き換えを許可しないなら、const指定とする必要があります。
>
> 以上、よろしくご検討をお願いいたします。
>
> 清水
> --------------------
> Masayuki Shimizu
> Assistant Professor
> Dept. of Mechanical Engineering, Shizuoka Univ.
> 3-5-1, Johoku, Naka-ku, Hamamatsu 432-8561, JAPAN
> TEL/FAX: +81-53-478-1061
> Email: tmsimiz@ipc.shizuoka.ac.jp
> _______________________________________________
> openrtm-users mailing list
> openrtm-users@openrtm.org
> http://www.openrtm.org/mailman/listinfo/openrtm-users
_______________________________________________
openrtm-users mailing list
openrtm-users@openrtm.org
http://www.openrtm.org/mailman/listinfo/openrtm-users

Masayuki Shimizu
オフライン
Last seen: なし 前
登録日: 2011-10-28 12:20
[openrtm-users 02748] バッファまわりの改善要望

安藤様

清水です。
ご返答ありがとうございます。

init()の引数をconstにした場合、プロバイダがバッファ作成者に
バッファの情報を伝えるにはどうするのでしょうか?
# 「バッファ作成者」はシングルバッファモードかマルチバッファモードかで
# 違うものになっていたと思います。
# 現行の1.1.0では、シングルバッファモードだとバッファタイプは固定なので、
# マルチバッファモードにして使用しています。

今の1.1.0の実装では、publishInterface()でのbuffer_typeの指定は、
バッファ作成者に渡らなかったはずです。
バッファが作成された後にpublishInterface()が呼ばれていると思います。

仕方ないので、私はinit()内でbuffer_typeを指定するようにしました。
実際の実装は以下です。

void InPortArtShmProvider::init(coil::Properties& prop)
{
(void)prop.setProperty(std::string("dataport.inport.buffer_type"),
std::string("artshm_buffer"));
}

Providerのinit()後にバッファを作成すれば、buffer_typeの情報が
バッファ作成者に渡るので、自作バッファを使用することができます。

以上、ご検討の程よろしくお願いいたします。

清水

Ando Noriaki
オフライン
Last seen: 1年 9ヶ月 前
登録日: 2011-09-04 17:20
[openrtm-users 02749] バッファまわりの改善要望

すみません、勘違いしてました。
情報をProviderからBufferFactoryに渡したかったんですね。

データポートに関連する一連のクラスの仕様として、そういう情報の流れは想定していませんでした。

情報はあくまで

コネクタ作成者(RTSystemEditor)->データポート(プロバイダ、コンシューマ、バッファ含む)

という流れと

InPort <-> OutPort

の2通りだけのつもりだけだったんですが。。。

たしかに清水さんの実装のようにprovider->init() のあとでcreateBufferを呼び出せば、
Providerから生成するバッファの種類を制御できますね。

僕としては、SystemEditorからバッファの種類を指定してほしかったんですが、
まぁ、そういうのもありですかね。initで引数の情報を書き換えるというのが
少し引っかかりますが、ドキュメントにその辺しっかり書いておくということで
対処したいと思います。なので、initの引数は非constのままにします。

> 安藤様
>
> 清水です。
> ご返答ありがとうございます。
>
> init()の引数をconstにした場合、プロバイダがバッファ作成者に
> バッファの情報を伝えるにはどうするのでしょうか?
> # 「バッファ作成者」はシングルバッファモードかマルチバッファモードかで
> # 違うものになっていたと思います。
> # 現行の1.1.0では、シングルバッファモードだとバッファタイプは固定なので、
> # マルチバッファモードにして使用しています。
>
> 今の1.1.0の実装では、publishInterface()でのbuffer_typeの指定は、
> バッファ作成者に渡らなかったはずです。
> バッファが作成された後にpublishInterface()が呼ばれていると思います。
>
> 仕方ないので、私はinit()内でbuffer_typeを指定するようにしました。
> 実際の実装は以下です。
>
> void InPortArtShmProvider::init(coil::Properties& prop)
> {
> (void)prop.setProperty(std::string("dataport.inport.buffer_type"),
> std::string("artshm_buffer"));
> }
>
> Providerのinit()後にバッファを作成すれば、buffer_typeの情報が
> バッファ作成者に渡るので、自作バッファを使用することができます。

バッファの作成のタイミングはそこではなくて、
>
> 以上、ご検討の程よろしくお願いいたします。
>
> 清水

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

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

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

Choreonoid

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

OpenHRP3

動力学シミュレータ

OpenRTP

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

産総研RTC集

産総研が提供するRTC集

TORK

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

DAQ-Middleware

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