OpenRTM / OpenRTM-aist

OpenRTM-aist: RT-Middleware and OMG RTC implementation in C++ implemented by AIST
https://openrtm.org/
Other
19 stars 12 forks source link

1.2.0のRTCの状態遷移について #417

Closed y-masutani closed 3 years ago

y-masutani commented 5 years ago

1.2.0でRTCのonActivated()におけるエラー処理がうまくいかないため,調べていたところ,onActivated() でreturn RTC::RTC_ERROR;しても,onExecute()が1回実行されていることがわかりました.1.1.2で同じことを確認しましたが,そのようなことはありませんでした.

これは,私の環境の問題でしょうか?何かを間違っていますか?

Windows 10にOpenRTM-aist-1.2.0-RELEASE_x86_64.msiをインストールして,VS2015でC++でプログラムしています.

onActivated()でデバイスが問題があった場合は,エラー状態に遷移させたいのに,onEecute()が実行されプログラムが異常終了するという悲しい目に遭っています.

n-ando commented 5 years ago

ご指摘ありがとうございます。調査してみます。

Nobu19800 commented 5 years ago

コメントの内容の通りの動作なので、動作が変わったのが仕様変更によるものなのかバグによるものなのかが問題だと思います。

n-ando commented 5 years ago

原因がわかりました。修正してPRいたしました。#419 1.2のブランチにもコミットしてありますので1.2.1では修正されます。

https://github.com/OpenRTM/OpenRTM-aist/pull/419

申し訳ございませんが、このバグに関しては簡単な Workaround はありません。 きれいなやり方ではありませんが、RTC内にonActivateの戻り値を状態変数として持たせて、onExecuteやonDeactivateでそれを見てスキップするくらいしか回避方法がありません。

y-masutani commented 5 years ago

対応ありがとうございます.根幹のバグなのでかなり驚いています. 1.2.1はいつ頃リリースされますか?

対処法ですが,以下のようにするということでしょうか?

RTC::ReturnCode_t Hoge::onActivated(RTC::UniqueId ec_id)
{
  m_rtcError = false;
  デバイスのオープン
  if (オープン失敗) {
    m_rtcError = true;
    return RTC::RTC_ERROR;
  }
  略
}

RTC::ReturnCode_t Hoge::onDeactivated(RTC::UniqueId ec_id)
{
  if (m_rtcError) return RTC::RTC_ERROR;
  略
}

RTC::ReturnCode_t Hoge::onExecute(RTC::UniqueId ec_id)
{
  if (m_rtcError) return RTC::RTC_ERROR;
  略
}
n-ando commented 5 years ago

ご提示のコードの通りかと思います。 ただ、onDeactivate() の部分は、OMG RTC Specificationで見る限り、onActivatedでエラーになっても呼ばれるべきかと思いますので、スキップするのは、onExecuteと(使っていれば)onStateUpdate()だけでよろしいかと思います。

ECに関しては、Choreonoidなどで使用する外部トリガ型ECを導入するにあたって、ECの実装コードの構造がいまいちで、すべてのECが外部トリガ型のIDLインターフェースを継承する形で実装するしかありませんでした。1.2に変更するにあたり、ECの拡張性を上げるために内部の構造をすっかり入れ替えたのですが、この変更のために、今回の問題が発生したようです。(状態遷移する場合でも、その状態に定義されているentry/do/exitの実行を一通り実行してから、次の状態に移るというのがデフォルトで、それ以外の振る舞いをする場合は明示的に処理を記述する必要がある)

ちなみに、1.2.1のリリース予定は未定ですが、このバグは致命的なのでできるだけ早くリリースしたいと考えています。

n-ando commented 3 years ago

対応済みなのでcloseします。