[openrtm-users 02683] 独自バッファの使用法

4 posts / 0 new
Last post
Masayuki Shimizu
Offline
Last seen: Never ago
Joined: 2011-10-28 12:20
[openrtm-users 02683] 独自バッファの使用法

OpenRTM-aist開発チーム
皆様

静岡大の清水です。

データポートのバッファを独自のものを作成して使用しようとしています。

CdrBufferBaseを継承した独自バッファを作成し、
xxxInit()関数でダイナミックロードできる所までは出来ました。

データポートのバッファとしてこの独自バッファを使用したいのですが、
どうすればよいのでしょうか?

ソースを読む限りでは、ポート接続時にConnectorProfileに
buffer_typeプロパティを渡せば良さそうですが、上手くいきません。

原因を探ったところ、InPortBaseでsingle_bufferモードが固定で設定されており、
デフォルトのring_bufferしか使用できないように実装されています。

そこで、multi_bufferモード、もしくはsingleの場合でも独自バッファを使用したいのですが、
RTMのソースに手を加えないで実現可能でしょうか?

よろしくお願いいたします。

清水
--------------------
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

Undefined
Ando Noriaki
Offline
Last seen: 1 year 9 months ago
Joined: 2011-09-04 17:20
[openrtm-users 02686] 独自バッファの使用法

安藤です

清水先生のおっしゃる通り、InPortではsinglebufferタイプのポートに固定
かつバッファは ring_buffer固定という実装になっていますね。
バッファ自体はプロパティで与えて変更できないといけませんね。
これは修正します。とりあえずチケットは発行しました。

ちなみに、OutPortのほうは大丈夫でしたでしょうか?

2012年10月16日 12:04 Masayuki Shimizu :
> OpenRTM-aist開発チーム
> 皆様
>
> 静岡大の清水です。
>
> データポートのバッファを独自のものを作成して使用しようとしています。
>
> CdrBufferBaseを継承した独自バッファを作成し、
> xxxInit()関数でダイナミックロードできる所までは出来ました。
>
> データポートのバッファとしてこの独自バッファを使用したいのですが、
> どうすればよいのでしょうか?
>
> ソースを読む限りでは、ポート接続時にConnectorProfileに
> buffer_typeプロパティを渡せば良さそうですが、上手くいきません。
>
> 原因を探ったところ、InPortBaseでsingle_bufferモードが固定で設定されており、
> デフォルトのring_bufferしか使用できないように実装されています。
>
> そこで、multi_bufferモード、もしくはsingleの場合でも独自バッファを使用したいのですが、
> RTMのソースに手を加えないで実現可能でしょうか?
>
> よろしくお願いいたします。
>
> 清水
> --------------------
> 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

Masayuki Shimizu
Offline
Last seen: Never ago
Joined: 2011-10-28 12:20
[openrtm-users 02687] 独自バッファの使用法

安藤様

清水です。

> ちなみに、OutPortのほうは大丈夫でしたでしょうか?
いまは、データフローがpush型、パブリッシャがflushの場合のみを試しています。
その場合、OutPortのバッファはデータ送受信に関係ないため問題にはなっていません。

pull型の場合や、push型でもflush以外のパブリッシャだと
OutPort側で問題が起きる可能性がありますが、そこは調べてはいません。

ソースに手を入れないと解決できなさそうなので、
InPortをマルチバッファモードに変更するソース改変を行い、
自作バッファを使用できるようにしました。

具体的には、InPortBaseにpublicインタフェースを追加し、
コンポーネントのInPortオブジェクトからそれを呼び出すようにしました。
以下、InPortBaseの追加部分です。
--------------------------------
bool InPortBase::setSingleBufferMode()
{
if(m_singlebuffer) return true;
if(m_thebuffer == 0){
m_thebuffer = CdrBufferFactory::instance().createObject("ring_buffer");
if (m_thebuffer == 0) return false;
}
m_singlebuffer = true;
return true;
}

bool InPortBase::setMultiBufferMode()
{
if(!m_singlebuffer) return true;
if(m_thebuffer != 0){
CdrBufferFactory::instance().deleteObject(m_thebuffer);
m_thebuffer = 0;
}
m_singlebuffer = false;
return true;
}
--------------------------------------------------------

本当は、シングルバッファモードでも、バッファをユーザが
指定できるようにしたいのですが、
バッファの指定は、connect()時にConnectorProfileで渡ってくるものなので、
connect()が発行されるまではバッファの型はInPortBaseでは分かりません。
そのため、ポート接続が無いときにバッファをどうするかの検討が必要そうです。
# 今はオリジナルと同様にring_bufferを入れておくようにしてあります。

清水

Ando Noriaki
Offline
Last seen: 1 year 9 months ago
Joined: 2011-09-04 17:20
[openrtm-users 02689] 独自バッファの使用法

清水先生

安藤です

ありがとうございます。
この辺はまだ枯れてないので、次のリリースでは対応
していきたいと思います。いただいたソースも参考にさせていただきます。
ちなみに、InPortのSingle Bufferモードに関しては、
InPortBase::init() で以下のようにコンポーネントコンフィグファイルで
プロパティを与えているので本当はここで指定できるべきなんです。

void InPortBase::init(coil::Properties& prop)
{
RTC_TRACE(("init()"));
m_properties << prop;
if (m_singlebuffer)
{
RTC_DEBUG(("single buffer mode."));
m_thebuffer = CdrBufferFactory::instance().createObject("ring_buffer");
// ここは本当は以下のようになるべき。
// m_thebuffer =
CdrBufferFactory::instance().createObject(prop["buffer_type"].c_str());

if (m_thebuffer == 0)
{
RTC_ERROR(("default buffer creation failed"));
}
}
else
{
RTC_DEBUG(("multi buffer mode."));
}

で、コンフィグファイルで
port.inport.dataport.buffer_type: mybuffer
とかやれば、自作のバッファが使えるのではないかと思います。(未検証ですが)
もし、こうなっていたら清水さんのやりたいことが実現できるのではないでしょうか?

もし追加で何か情報があれば教えていただければ幸いです。
よろしくお願いいたします。

2012年10月18日 14:01 Masayuki Shimizu :
> 安藤様
>
> 清水です。
>
>> ちなみに、OutPortのほうは大丈夫でしたでしょうか?
> いまは、データフローがpush型、パブリッシャがflushの場合のみを試しています。
> その場合、OutPortのバッファはデータ送受信に関係ないため問題にはなっていません。
>
> pull型の場合や、push型でもflush以外のパブリッシャだと
> OutPort側で問題が起きる可能性がありますが、そこは調べてはいません。
>
> ソースに手を入れないと解決できなさそうなので、
> InPortをマルチバッファモードに変更するソース改変を行い、
> 自作バッファを使用できるようにしました。
>
> 具体的には、InPortBaseにpublicインタフェースを追加し、
> コンポーネントのInPortオブジェクトからそれを呼び出すようにしました。
> 以下、InPortBaseの追加部分です。
> --------------------------------
> bool InPortBase::setSingleBufferMode()
> {
> if(m_singlebuffer) return true;
> if(m_thebuffer == 0){
> m_thebuffer = CdrBufferFactory::instance().createObject("ring_buffer");
> if (m_thebuffer == 0) return false;
> }
> m_singlebuffer = true;
> return true;
> }
>
> bool InPortBase::setMultiBufferMode()
> {
> if(!m_singlebuffer) return true;
> if(m_thebuffer != 0){
> CdrBufferFactory::instance().deleteObject(m_thebuffer);
> m_thebuffer = 0;
> }
> m_singlebuffer = false;
> return true;
> }
> --------------------------------------------------------
>
> 本当は、シングルバッファモードでも、バッファをユーザが
> 指定できるようにしたいのですが、
> バッファの指定は、connect()時にConnectorProfileで渡ってくるものなので、
> connect()が発行されるまではバッファの型はInPortBaseでは分かりません。
> そのため、ポート接続が無いときにバッファをどうするかの検討が必要そうです。
> # 今はオリジナルと同様にring_bufferを入れておくようにしてあります。
>
> 清水

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