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

Ando Noriaki n-ando @ aist.go.jp
2013年 1月 8日 (火) 15:42:43 JST


すみません、勘違いしてました。
情報を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の情報が
> バッファ作成者に渡るので、自作バッファを使用することができます。

バッファの作成のタイミングはそこではなくて、
>
> 以上、ご検討の程よろしくお願いいたします。
>
> 清水
> --- On Mon, 2013/1/7, Ando Noriaki <n-ando @ aist.go.jp> wrote:
>
>> 清水先生
>>
>> 安藤です
>>
>> ご提案ありがとうございます。
>> おっしゃるような初期化順序でも問題なさそうですね。
>> 精査して実装に取り込みたいと思います。
>>
>> また、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 <masayuki.shimizu @ aist.go.jp>:
>> > 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



-- 
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
    統合知能研究グループ 主任研究員, 博士(工学)
    〒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

Noriaki Ando, Ph.D.
    Senior Research Scientist, RT-Synthesis R.G., ISRI, AIST
    AIST Tsukuba Central 2, Tsukuba, Ibaraki 305-8568 JAPAN
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org


More information about the openrtm-users mailing list