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

3 個の投稿 / 0 new
最終投稿
root
オフライン
Last seen: 5日 12時間 前
登録日: 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;
のところで起こっています。
ソースコードを同封しますので、コメットいただけると助かります。

未定義
root
オフライン
Last seen: 5日 12時間 前
登録日: 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
オフライン
Last seen: 5日 12時間 前
登録日: 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使用率でした。

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

ダウンロード

最新バージョン

初めての方へ

Windows msi(インストーラ) パッケージ (サンプルの実行ができます。)

C++,Python,Java,
Toolsを含む
1.2.1-RELEASE

RTコンポーネントを開発するためには開発環境のインストールが必要です。詳細はダウンロードページ

統計

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

Choreonoid

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

OpenHRP3

動力学シミュレータ

OpenRTP

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

産総研RTC集

産総研が提供するRTC集

TORK

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

DAQ-Middleware

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