Open Nobu19800 opened 4 years ago
onActivatedで処理をしようとしたときに、
if(m_distanceIn.isNew()){ m_distanceIn.read() initial = m_distance.data; }
のように書くことはできません。例えば入力ポートに距離センサのコンポーネントを接続する前にactivateしてしまうと、isNew()に引っかからないため、初期データを読み込めないままonActivateを抜けてしまいます。 データが来るまで待つためにifではなくwhileを使うことも考えられます。
while(!m_distanceIn.isNew()); //データが来るまで待つ //データが来た後でその値を代入 m_distanceIn.read() initial = m_distance.data;
ですが、これでは何らかの理由で前のコンポーネントからデータが来なかった場合、一旦システムを止めたいといったことが起こったとしても、 whileで無限ループにはまってしまうため、RTSystemEditorからactivateやdeactivateの命令を出すことができなくなってしまいます。そのため、onExecute()の中で、最初の値を受け取るという現状の形で問題ないのではないかと考えています。
initialを-1と比較するのは誤りであるというのはご指摘の通りです。 if ( initial == -1)をif ( initial < 0)のように変更いたします。 負の値かどうか見るということであれば誤差の問題はなくなります。 また、正しい距離データが来れば負の値になることはないですから、最初の時だけ値を読み取れるようになるかと思います。
以下の部分でdouble型の変数initialを-1と比較していますが、浮動小数点型は演算で誤差が発生する場合があるので整数と比較するのは一般的には間違いです。
https://github.com/ShibauraRTM/Interactive_Tapioca_GarbageCan/blob/3f20892adb7af867bb1a7081429ad80e15327521/distance/src/distance.cpp#L138-L141
また、上記のコードは1回だけ実行する初期化のための処理のため、onActivated関数で実行したほうがいいと思います。