[openrtm-users 00505] onWrite コールバック

3 posts / 0 new
Last post
root
Offline
Last seen: 1 day 23 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00505] onWrite コールバック

KEKの安と申します。
安藤さんからPipe.tar.gzというファイルをいただきました。これは
ConsoleOut/ConsoleInの間にいれてPipeのような役割をonWrite コールバックを
利用して実現させています。私は性能テストのためにこれを利用しようとしてい
ます。この例題ではOutPortにはDataTypeしか与えていません。私の場合は
MyRingBufferという独自のリングバッファを作りました。これは
mutex/condition variableを使ってproducer/consumerモデルでバッファを実現
しています。そのためMyRingBufferをOutPortに入れる必要があります。そこで、
template
class DirectInOut : public RTC::OnWrite {
OutPort& m_out;
public:
DirectInOut(OutPort& out) : m_out(out) {}
virtual void operator() (const DataType& value) {
m_out.write(value);
}

  DirectInOut m_InOut;
}
という具合にしました。安藤さんもNullBufferを使ってこれをテストされていて
問題がないということのようですが、私の場合はうまくいっていません。エラー
メッセージは
type/value mismatch at argument in template parameter list for
'template class Buffer> class
RTC::OutPort'
です。これは
OutPort& m_out;
のところで起こっています。
ソースコードを同封しますので、コメットいただけると助かります。

Undefined
root
Offline
Last seen: 1 day 23 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00509] onWrite コールバック

KEKの安です。
Yoshiji Yasu さんは書きました:
> template
> class DirectInOut : public RTC::OnWrite {
>
安藤さんから教えていただいて、
tempate class BufferType>
class DirectInOut : public RTC::onWrite {
に置き換えてコンパイルは通りました。ありがとうございました。

root
Offline
Last seen: 1 day 23 hours ago
Joined: 2009-06-23 14:31
[openrtm-users 00511] onWrite コールバック

KEKの安です。onWriteコールバックを使って動かしてみました。
実は私たちのOpenRTM-aist.0.4.2は改造されていまして、コンポーネント間の
データ転送は同期を取りながらデータを落とさずに行われます。ですからバッ
ファのempty/full時にはデータは流れずブロックされます。このような条件で
コールバックを使っています。コンポーネントは3つあり、proc1/proc2/proc3
です。proc1は単にTimedLongSeqである単位のデータをシーケンス番号を付けて
送ります。 proc2はそのデータを受けとりシーケンスをチェックし、問題がなけ
ればproc3へ送ります。proc3は同様にシーケンスをチェックし問題なければ捨て
ます。転送時にはTimeOutが発生する可能性がありますのでそれをwrite/read時
のステータスとして受けてTimeOutならシーケンス番号をインクリメントせず再
送したり再読み込みを行います。
さてこのような環境で、proc2に安藤さんのPipeの機能を実装させました。とこ
ろが、問題がありました。確かに、RingBufferをデフォルトのものを使用する限
り、データのシーケンスは保障されなかったりデータがオーバーライトされたり
同じものを読んだりしますが、正常に動作します。しかし、私たちのところは
proc2のInPortでバッファがいっぱいになり、proc1はタイムアウトを発生させて
動作しなくなりました。当然ですが、 proc2でMyRingBufferからデータを読んで
あげないといけないわけですが、proc2のメインスレッドでは何もしていないの
で、読み飛ばす必要があります。とりあえずメインスレッドで読み捨てをしまし
て動作させました。
性能の面ではたぶん読み飛ばしの余計な処理のためかとは思いますが、若干落ち
てしまいました。
40kBのTimedLongSeqで、proc1->proc2->proc3とデータをベストエフォートで渡
して、平均スループットは 16MB/sec(1つのPC上で3つのコンポーネントを
走らせました)で、onWriteコールバックを使わない場合の18MB/secより若干悪
くなっています。PCのCPU使用率は4coreですが、数パーセントです。ちな
みにonWriteコールバックを使わない場合で2MBの TimedLongSeqでは80MB/sec程
度でした。すべてのcoreで約50%のCPU使用率でした。

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