[openrtm-users 00841] ステートマシンについての質問

Masayuki Shimizu masayuki.shimizu @ aist.go.jp
2009年 6月 18日 (木) 15:29:16 JST


RTC仕様に詳しい方へ

RTCのステートマシンについて質問があるのですが、
RTC仕様に詳しい方、教えてください。

OpenRTM-aistのHPに載っている
ステートマシン図を見る限りでは、
Inactive状態にはentry/do/exitの
どの処理も書いてないのですが、
これは、いかなる処理もInactive状態では
許可しないということなのでしょうか?

通常、Inactive状態では何もすることがないため、
それでもよいかなと思っていたのですが、
次のようなケースはどう実装するのがよいのか?
というので悩んでいます。

【実現したいこと】
RTCが外部イベントに応じて自己的に状態遷移をすること。
例えば、Inactive状態にあるRTCのデータ入力ポートに、
ある特定のデータが入力されたら、自動的に
Active状態に移行し、onExecuteの処理を行う。

【検討中の実現方法】
(1) RTCとは別にイベント監視機構を導入する。
(2) OpenRTM-aistで提供されるイベント通知機構の利用。
(3) (RTC仕様違反でなければ)Inactive状態に
do処理を実装する。

(1)を実現するためには、監視用のスレッドを
自分で作り、周期的にイベントを監視する
(ポーリングの場合)、という実装になるでしょうか。
ただ、独自スレッドを上げるプログラムは、
RTCの標準パターンにマッチしないし、
リソースの面でも不利かと思います。

(2)は、具体的には、データポートのコールバックを
利用する方法です。入力ポートにデータが
書き込まれると実行されるOnWrite系の処理内から
ExecutionContext::activate_component()
を呼んでやればよさそうです。
ただ、OpenRTM-aist-1.0.0-RC1では、
OnWriteコールバックは機能しないようですし、
0.4.2でも、OnWriteの呼ばれるタイミングに
少し問題があります。今の場合、
バッファにデータを書き終わってからでないと
処理を開始できないので、バッファにデータを
書いた後に呼ばれるコールバックが欲しいのですが、
0.4.2では、すべてのOnWrite系はバッファに
データが書かれる前に呼ばれてしまいます。
したがって、現時点のOpenRTM-aistでは
実現に難があります。

(3)が今回の質問に関連する方法です。
現在のOpenRTM-aistの実装では、
Inactive状態でもdo処理に当たるものを
与えてあげれば、ECがそれを実行してくれる
ように見受けられます。
ただ、今のところ、そのコールバックが
NULLに固定なので何も実行されないだけのようです。
せっかく、周期的にECが動いているのに、
そのリソースを利用しないのはもったいないと
感じます。そこで、もしRTC仕様違反でないなら、
Inactive状態のdo処理をユーザが指定できる
ようにはならないのでしょうか?というのが
私の質問です。

以上、よろしくご教授お願いいたします。

静岡大 清水

--------------------
Masayuki Shimizu
Assistant Professor
Dept. of Mechanical Engineering, Shizuoka Univ.
3-5-1, Johoku, Naka-ku, Hamamatsu 432-8561, JAPAN
TEL/FAX: +81-53-478-1061
Email: tmsimiz @ ipc.shizuoka.ac.jp



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