Project

General

Profile

Actions

調査 #4200

open

openrtp(RTSE)でRTCの状態がACTIVEと表示されない

Added by katami almost 8 years ago. Updated almost 8 years ago.

Status:
担当
Priority:
通常
Assignee:
katami
Target version:
-
Start date:
09/12/2017
Due date:
% Done:

100%

Estimated time:

Description

#3704 の動作確認において、rthsell (rtls localhost/ -l) で確認したところ、 コンポーネントがActiveであることを確認できたが、openrtp(RTSE)で確認したところ、Sensor0.rtcだけがActiveで、Motor0.rtc、Controller0.rtcはInActiveの状態だった。
openrtpのバージョンは eclipse442-openrtp112v20160526-ja-linux-gtk-x86_64。

動作確認は、examples/Composite のSensorCompを利用して、初期化関数を以下のように変更

  • ControllerとMotorはrtc.confで.soをロードしておく。
  • 以下のように、SensorのECを取り出し、Controller, Motor にアタッチ
  • Motor, Controller, Sensor の順で activate した。
    public void myModuleInit(Manager mgr) {
      Properties prop = new Properties(Sensor.component_conf);
      mgr.registerFactory(prop, new Sensor(), new Sensor());

      System.out.println("1");
      // Create a component
      RTObject_impl scomp = mgr.createComponent("Sensor");
      if( scomp==null ) {
          System.err.println("Component create failed.");
          System.exit(0);
      }
      System.out.println("2");
      RTC.RTObject srtc = scomp.getObjRef();

      System.out.println("3");
      // Create a component
      RTObject_impl ccomp = mgr.createComponent("Controller");
      if( ccomp==null ) {
          System.err.println("Component create failed.");
          System.exit(0);
      }
      System.out.println("4");
      RTC.RTObject crtc = ccomp.getObjRef();

      System.out.println("5");
      // Create a component
      RTObject_impl mcomp = mgr.createComponent("Motor");
      if( mcomp==null ) {
          System.err.println("Component create failed.");
          System.exit(0);
      }
      System.out.println("6");
      RTC.RTObject mrtc = mcomp.getObjRef();

      System.out.println("7");
      ExecutionContextListHolder eclist = new ExecutionContextListHolder();
      eclist.value =  srtc.get_owned_contexts();

      System.out.println("8");
      eclist.value[0].add_component(crtc);
      System.out.println("9");
      eclist.value[0].add_component(mrtc);
      System.out.println("10");

      eclist.value[0].activate_component(mrtc);
      System.out.println("11");
      eclist.value[0].activate_component(crtc);
      System.out.println("12");
      eclist.value[0].activate_component(srtc);
      System.out.println("13");
    }

Files

ExecutionContext.png (42 KB) ExecutionContext.png katami, 09/13/2017 10:59 AM
Actions #1

Updated by katami almost 8 years ago

この動作確認では、participating EC からRTCをactivateしました。通常、openrtp(RTSE)のRTCの状態はオーナーECから取得した状態を示します。
openrtp(RTSE)を使用する場合は、実行コンテキストビューで実行コンテキストをparticipatingに切り替えて確認することができます。

#3704 の不具合の報告では、participating EC からRTCをactivateして、そのparticipating ECがRTCの状態を取得してactivate状態を確認していますので、 #3704 の対応で問題ないと思われます。
https://github.com/fkanehiro/hrpsys-base/blob/master/python/rtm.py#L454

 
 
 

以下は、#3704 の動作確認の説明です。
RTCは複数のEC(owned、participating )を持つことができ、ECはRTCをキーとしてステートマシン(RTObjectStateMachine)を保持します。

Motor, Controller, Sensorコンポーネントはそれぞれ owned ECを持ちます。

テストで使用したプログラム(SensorComp)では、

eclist.value =  srtc.get_owned_contexts();

で Sensorのowned ECを取得して、
System.out.println("8");
eclist.value[0].add_component(crtc);
System.out.println("9");
eclist.value[0].add_component(mrtc);
System.out.println("10");

でコンポーネントを追加しています。
ここで、Motor, Controller は Sensorの owned EC を participating EC に登録して、参加します。
eclist.value[0].activate_component(mrtc);
System.out.println("11");
eclist.value[0].activate_component(crtc);
System.out.println("12");
eclist.value[0].activate_component(srtc);
System.out.println("13");

でコンポーネントをactivateしています。
Motor, Controller は participating EC からactivateされます。
この状態で、Motor, Controller の owned EC からRTCの状態を取得する(get_component_state())とINACTIVEのままでが、Motor, Controller の participating EC からRTCの状態を取得する(get_component_state())とACTIVEとなります
これは、ECがRTCをキーとしてステートマシン(RTObjectStateMachine)を保持しているためです。
以下を追加して再度テストしてACTIVEすることを確認しました。

try{
    Thread.sleep(3000);
}catch(InterruptedException e){}

System.out.println("14");
LifeCycleState state;
state = eclist.value[0].get_component_state(crtc);
if (state == LifeCycleState.ACTIVE_STATE) {
    System.out.println("Controller is ACTIVE_STATE");
}
System.out.println("15");
state = eclist.value[0].get_component_state(mrtc);
if (state == LifeCycleState.ACTIVE_STATE) {
    System.out.println("Motor is ACTIVE_STATE");
}
System.out.println("16");

participating EC からactivate された場合でも、RTCでは、onActivatedのイベントが発生します。引数のECのIDで、participating ECからactivateされたイベントだということがわかります。

Actions #2

Updated by katami almost 8 years ago

  • Status changed from 新規 to 担当
  • Assignee set to katami
Actions #3

Updated by katami almost 8 years ago

Actions #4

Updated by katami almost 8 years ago

  • % Done changed from 0 to 100
Actions

Also available in: Atom PDF