[openrtm-users 00416] Re: RTCの状態を遷移させる方法は?

Ando Noriaki n-ando @ aist.go.jp
2008年 4月 11日 (金) 09:58:46 JST


喜多様

安藤です

> RTCプログラミング入門など読ませていただき、
> RTC開発者は状態遷移をトリガとして実行される
> 各アクションを実装すればよいということですが、
>
> (OpenRTM開発者ではなく)RTC開発者が
> RTCLinkでマニュアルで状態を遷移させる
> ことなしに、コンポーネントの内部処理で状態を遷移
> させたい場合はどうすればよいでしょうか。

Inactive、Active、Error状態はコンポーネントの状態としてマニュアルなどでは
説明していますが、実際は実行コンテキスト(EC)の状態として管理されています。
RTC<->ECの関係は複数対複数が可能で、
RTC(n)<->EC(1)の場合は同期複合コンポーネント
RTC(1)<->EC(n)の場合は名前は特にないのですが、(マルチレートコンポーネント
とでも呼びましょうか)、複数の(異なる周期かもしれない)ECからonXXXが呼ばれる
コンポーネントとなります。

#これはOMGのSpecを読まないと書いてないかもしれません。
# http://www.omg.org/cgi-bin/doc?ptc/2007-08-18

以上のことを踏まえた上で。。。

> 例えば、自分自身でError状態からInactive状態に回復したり、
> Inactive状態の他のコンポーネントをActive状態に遷移させたいと
> 考えています。

Error->Inactive、もしくはInactive->Activeへの遷移をRTC内部から行いたいとのこと
ですが、上記のような理由から遷移させようとするRTCは自分が属しているEC
に対して遷移するようにメッセージを投げなければいけません。

といっても、それほど難しくなく、

ReturnCode_t onError(EC ec_id)
{
  : 略
  if (error_recovered)
  {
    get_context(ec_id)->reset_component(getObjRef());
  }
  : 略
}

このようにすれば現在のエラー状態にあるECに対して、resetメッセージを投げて、
自分自身で回復することができます。
Inactive->Activeへの遷移も同様にreset_componentの代わりにactivate_component
を呼ぶことで実現できます。

#ちょっと時間がなかったのでできるかどうかは試してないのですが。。。

> Error状態からInactive状態への遷移は、
> onExecuteの返り値RTC_OK/RTC_ERRORにより
> Active状態からError状態へ遷移させられるように、
> onErrorの返り値で制御できればありがたいですし、

Error状態に
とどまる->RTC_ERROR
ぬける->RTC_OK
ということでしょうか?

これは上記のECへのresetメッセージをフレームワークないに組み込んでしまえば、
比較的簡単に実現できますね。
ただ、そのばあいonError()とon_error()の戻り値の意味が変わってしまうので、
RTCのSpecificationの中身を知っている人からすると奇異に感じるかもしれません。

OpenRTMの実装に含めるかどうかは検討させてください。

> Inactive状態からActive状態への遷移は、例えば
> サービスポートを通じた特定コマンドで制御できると
> ありがたいです。Active状態からInactive状態への遷移
> の手段も欲しいところです。

これはちょっと難しいです。
というのも、上述したようにRTCにはECが複数関連付けられる場合があって、
サービスポートはECとは独立しているため、サービスポートからの命令にもとづいて
どのECを遷移させるかがわからなくなってしまいます。
・全部遷移させる
・サービスIFの関数でECのIDを指定する
等の方法が考えられます。

> SimpleIOのConnetorComp.cppで実装されているように、
> 状態を遷移させたいRTCのExecutionContextを取得して
> 状態を遷移させるための関数を呼ぶというのは、
> RTC開発者としては避けたいと思います。

結局、状態遷移をさせるには一番上に書いたコードのようなことを
しなければならないのですが、フレームワーク(RTObject)のインターフェース
として

ReturnCode_t activateMyself(ec_id)
{ retrun get_context(ec_id)->activate_component(getObjRef());}

ReturnCode_t deactivateMyself(ec_id)
{ retrun get_context(ec_id)->deactivate_component(getObjRef());}

ReturnCode_t resetMyself(ec_id)
{ retrun get_context(ec_id)->reset_component(getObjRef());}

のようなものを用意してもいいかもしれません。
検討させていただきます。

なにかご意見等いただけましたら幸いです。

> よろしくお願いいたします。
>
> 喜多 伸之
> -----------------------------------------------
> 主任研究員 喜多伸之
> 独立行政法人 産業技術総合研究所 知能システム研究部門
> 自律行動制御研究グループ
> 〒305-8568 茨城県つくば市梅園1-1-1 つくば中央第2
> E-mail: n.kita @ aist.go.jp   http://www.is.aist.go.jp/nkita/
> TEL:029-861-5986  FAX:029-861-3443



-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                   知能システム研究部門 タスクインテリジェンス研究グループ
                   〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                   TEL: 029-861-5981 FAX: 029-861-5971
                   n-ando @ aist.go.jp, n-ando @ ieee.org



openrtm-users メーリングリストの案内