[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 メーリングリストの案内