[openrtm-users 00401] リングバッファからのデータ取得につきまして
Yusuke Nakajima
y.nakajima @ aist.go.jp
2008年 3月 27日 (木) 15:04:14 JST
安藤様
産総研の中島です。
2つのRTC間でデータポートでのデータ送受信を行う際に、
以下に示しますようにデータ取得にて欠落が発生するため、
原因or対処法についてご教示願います。
<現象>
[dataOutComp][dataInComp]の2つコンポーネントがあり、データポートにて
TimedDoubleSeqのデータを[dataOutComp]-->[dataInComp]方向に送信しており、
実行サイクルは「dataInComp」の方が早いため、何回かonExecuteがループして
から「dataOutComp」よりデータを取得できているのですが、稀に、データを取
得していない状態が発生します。(以下のサンプルソースとデバッグ参照)
データの取得は、まず、isNew()でバッファに新たなデータが入っていないか
確認し、なければ今回のonExecuteは何も処理せず、データがあればそれをread()
しています。
サイクルが早い[dataInComp]がデータを取得し損ねているのは、その時だけ
[dataOutComp]が急にサイクルが早くなり、データを2度書き終えてしまった可能
性もありますが、これは考えにくいため、
[dataOutComp]側がバッファへのデータ書き込みに失敗していると考えているの
ですが、”ロック”がかかる状況が発生したのでしょうか?
たとえば、[dataInComp]がisNew()でバッファにアクセスしている最中に、丁度
[dataOutComp]がデータ書き込みを試みて、ロックがかかっているため失敗した
など。
ちなみに、[dataOutComp]はOpenHRP3のシミュレータとControllBridgeを介し
て、毎シミュレーションstep毎(0.002sec)にデータをもらい、そのまま、
[ dataInComp]にスルーさせる構成です。
情報、よろしくお願いします。
----------------------------------------------------------------
[[dataOutComp側のonExecute部(必要部のみ記述)]]
onExecute(){
//データセット
unsigned long sec,nsec;
・・・
「省略(0.002[sec]毎にシミュレータからデータ取得し、時刻をセット)」
・・・
m_dataOut.tm.sec = sec;
m_dataOut.tm.nsec = nsec;
//データ出力
m_dataOut.write();
//時刻デバッグ
double time = sec + 1.0e-9*nsec;
std::cout << "--[送信][TIME]: " << time << std::endl;
return RTC::RTC_OK;
}
[[dataInComp側のonExecute部(必要部のみ記述)]]
onExecute(){
//新しいデータが得られたら実行
if (m_dataIn.isNew()) {
//データ取得
m_dataIn.read();
//データセット
unsigned long sec,nsec;
sec = m_dataIn.tm.sec;
nsec = m_dataIn.tm.nsec;
//時刻デバッグ
double time = sec + 1.0e-9*nsec;
std::cout << "--[受信][TIME]: " << time << std::endl;
} else {
//新しいデータが得られていないので処理をスキップ
std::cout << "---[SKIP] " << std::endl;
}
return RTC::RTC_OK;
}
----------------------------------------------------------------
<dataOutComp側のデバッグ>
・・・
[送信][TIME]: 0.788
[送信][TIME]: 0.79
[送信][TIME]: 0.792 <- このデータを送信はきちんとしているはず
[送信][TIME]: 0.794
・・・
<dataInComp側のデバッグ>
・・・
[受信][TIME]: 0.788
---[SKIP]
---[SKIP]
---[SKIP]
---[SKIP]
[受信][TIME]: 0.79
---[SKIP]
---[SKIP]
---[SKIP]
---[SKIP]
---[SKIP]
<-- しかし、この部分のデータの取得が出来ていない(time:0.792)
[受信][TIME]: 0.794
---[SKIP]
---[SKIP]
---[SKIP]
[受信][TIME]: 0.796
・・・
openrtm-users メーリングリストの案内