[openrtm-users 00798] EC の実装に関して

7 個の投稿 / 0 new
最終投稿
root
オフライン
Last seen: 18時間 7秒 前
登録日: 2009-06-23 14:31
[openrtm-users 00798] EC の実装に関して

OpenRTM-aist開発者の皆様

前々から気になっていたのですが、
ExecutionContext(EC)の実装に関してです。

ECは確か、PeriodicとEventDrivenタイプが
あったと思います。
現在の実装では、ECの基底として、
ExecutionContextBaseクラスがあり、
その派生としてPeriodicECクラスがあります。
(1.0.0でもEvtDrivenは実装はないようですね。)

一般的な実装方法では、
Periodic&EvtDrivenの両方に共通な機能の実装を
ExecutionContextBaseクラスで行い、
Periodic/EvtDrivenで異なる機能を
それぞれの派生クラスで実装すると思います。

ECの機能を考えると、
add_component, remove_component, etc.
のメソッドは両タイプに共通と考えられるので、
基底クラスで実装すべきではないでしょうか?

また、これに関連して、
ExtTrigECはPeriodicタイプではなくて、
EvtDrivenに属するもののように感じるのですが、
どうなのでしょうか?
(実際、ExtTrigの場合はset_rate()などは
実質無効なオペレーションですよね。)

以上、間違ってたら指摘してください。

静岡大 清水

未定義
root
オフライン
Last seen: 18時間 7秒 前
登録日: 2009-06-23 14:31
[openrtm-users 00801] EC の実装に関して

清水さま

安藤です

> 前々から気になっていたのですが、
> ExecutionContext(EC)の実装に関してです。
>
> ECは確か、PeriodicとEventDrivenタイプが
> あったと思います。
> 現在の実装では、ECの基底として、
> ExecutionContextBaseクラスがあり、
> その派生としてPeriodicECクラスがあります。
> (1.0.0でもEvtDrivenは実装はないようですね。)

EventDrivenのECはFSMコンポーネント用のECでして、
FSMコンポーネントの実相がないのでEventDrivenのECはまだありません。

> 一般的な実装方法では、
> Periodic&EvtDrivenの両方に共通な機能の実装を
> ExecutionContextBaseクラスで行い、
> Periodic/EvtDrivenで異なる機能を
> それぞれの派生クラスで実装すると思います。

ExecutionContextBaseはただのインターフェースのつもり
だったので何も実装していません。
#なぜかtick()には空の実装がありますが。

> ECの機能を考えると、
> add_component, remove_component, etc.
> のメソッドは両タイプに共通と考えられるので、
> 基底クラスで実装すべきではないでしょうか?

EventDrivenECとPeriodicECでは、それぞれ
扱うコンポーネントの型が違うので、add_component
remove_componentは共通にしないほうがいいと思います。
もし共通にすると、BaseクラスではRTObjectでRTCのリストを
もちつつ、PeriodicECではDataflowComponentのリストを、
EventDrivenECではFsmComponentのリストをそれぞれ二重に
持つことになるので冗長ですね。

> また、これに関連して、
> ExtTrigECはPeriodicタイプではなくて、
> EvtDrivenに属するもののように感じるのですが、
> どうなのでしょうか?
> (実際、ExtTrigの場合はset_rate()などは
> 実質無効なオペレーションですよね。)

ExtTrigECはOpenHRPのために拡張した特殊なECで
これはPeriodicECです。onExecute()も実行されます。
#EventDrivenECではonExecute()は実行されない。

また、シミュレータの内部時間を表現するのに、ExtTrigECの
rateも使用するので、set_rate()、get_rate() もそれぞれ
意味のある関数です。

root
オフライン
Last seen: 18時間 7秒 前
登録日: 2009-06-23 14:31
[openrtm-users 00804] EC の実装に関して

安藤様

丁寧な解説ありがとうございます。

私の理解が間違っていたようです。
Periodicは定期的な周期実行用、
EvtDrivenは不定期なオンデマンド実行用、
という風に解釈していたのですが、
RTC仕様では違うようですね。

リアルタイム処理をやっている私からすると、
一般的なPeriodic/EvtDrivenと定義が
若干異なると感じるのですが、
仕様がそうであればそう理解することにします。
ただ、それでも、ExtTrigECのrateという概念は、
私には理解しがたいです。

清水

root
オフライン
Last seen: 18時間 7秒 前
登録日: 2009-06-23 14:31
[openrtm-users 00808] EC の実装に関して

安藤です

どちらのECも時間によりトリガされることを意図しているので、
本質的には変わりはありません。つまり、

1) 通常のPeriodicECは絶対時間により周期実行がトリガされる、
2) ExtTrigECは外部にある系共通の時計により周期実行がトリガされる

ということです。ExtTrigECはイベント駆動ではなく、時間駆動のECです。

シミュレータの中では、物理現象も、それを制御する制御系も、
すべてのものがシミュレータの時間により進みますが、
このとき、1周期がたとえ1分かかっても、1usで済んでも、
シミュレータが(というかシミュレータのスケジューラが)1msである
いえば、すべてのものは1周期が1msのつもりで計算を行います。
ですので、ECのrateはたとえExtTrigECでも意味を持ちます。

> 安藤様
>
> 丁寧な解説ありがとうございます。
>
> 私の理解が間違っていたようです。
> Periodicは定期的な周期実行用、
> EvtDrivenは不定期なオンデマンド実行用、
> という風に解釈していたのですが、
> RTC仕様では違うようですね。
>
> リアルタイム処理をやっている私からすると、
> 一般的なPeriodic/EvtDrivenと定義が
> 若干異なると感じるのですが、
> 仕様がそうであればそう理解することにします。
> ただ、それでも、ExtTrigECのrateという概念は、
> 私には理解しがたいです。
>
> 清水
>

root
オフライン
Last seen: 18時間 7秒 前
登録日: 2009-06-23 14:31
[openrtm-users 00809] EC の実装に関して

安藤様

下記の説明でさらに疑問点が出てきたので
教えてください。

ExtTrigECを駆動するリソースは、
周期的なタイミングリソース(周期タイマなど)
に限定されていて、
それ以外では駆動してはいけないという
ことでしょうか?
実装を見る限りではそういう制限はないように
思っていたのですが。

私が議論していたExtTrigECの使い方は、
例えば、GUIパネルのボタンをクリックした
ときに駆動する、というような、
不定期のイベントに同期するケースです。
もちろん、OpenHRPのように、
周期的に駆動されるものに関しては、
rateも意味を持ちますし、
安藤様の説明に何ら異論はありません。

しかし、ユーザインタフェースRTCのように、
ユーザからの不定期なコマンドイベントに
同期して動作するものを作ろうと思うと、
ExtTrigECのような任意のタイミングで
ECを駆動できるものが必要ですし、
そういう用途にExtTrigECが使われることも
想定していると私は考えていました。
なので、その場合はrateの意味が
わかりづらい、と言ったつもりでした。

上記のような、不定期イベントに同期させたい
場合は、ExtTrigECを使ってはいけない、
という理解でよろしいでしょうか?
また、そうだとすると、不定期イベント同期型の
RTCはどのECを使うのがよいのでしょうか?
RTC仕様を読んでないので、
変なことを言っていたら指摘してください。

清水

root
オフライン
Last seen: 18時間 7秒 前
登録日: 2009-06-23 14:31
[openrtm-users 00815] EC の実装に関して

清水様

安藤です

> 下記の説明でさらに疑問点が出てきたので
> 教えてください。
>
> ExtTrigECを駆動するリソースは、
> 周期的なタイミングリソース(周期タイマなど)
> に限定されていて、
> それ以外では駆動してはいけないという
> ことでしょうか?
> 実装を見る限りではそういう制限はないように
> 思っていたのですが。

いけないということはないと思います。
OMGの仕様的にはそこまで厳密に決められてません

単に、
周期実行:EC Kind = PERIODIC RTCはDataflowComponent
イベント実行: EC Kind = EVENT_DRIVEN RTCはFsm

という区別になっています。

> 私が議論していたExtTrigECの使い方は、
> 例えば、GUIパネルのボタンをクリックした
> ときに駆動する、というような、
> 不定期のイベントに同期するケースです。
> もちろん、OpenHRPのように、
> 周期的に駆動されるものに関しては、
> rateも意味を持ちますし、
> 安藤様の説明に何ら異論はありません。

> しかし、ユーザインタフェースRTCのように、
> ユーザからの不定期なコマンドイベントに
> 同期して動作するものを作ろうと思うと、
> ExtTrigECのような任意のタイミングで
> ECを駆動できるものが必要ですし、
> そういう用途にExtTrigECが使われることも
> 想定していると私は考えていました。
> なので、その場合はrateの意味が
> わかりづらい、と言ったつもりでした。

GUIへの入力をイベントとしてExtTrigECを駆動するというのは
あまり想定していませんでした。

GUIとの連携はOMGの仕様を決めるときにも議論になりました。
僕はとくにそういう使い方は想定していなかったのですが、
もう一方の提案者であるRTIは一つのRTCが周期の早いECで
制御などの計算をしつつ、GUIのイベントループに相当する遅い
ECでGUI関連の処理もするという使い方も想定していたようです。

こんな感じ↓

ReturnCode_t on_execute(EcId ec_id)
{
if (ec_id == REALTIME_EC)
{
do_control();
}
else if (ec_id == GUI_EC)
{
do_something_related_to_gui();
}
return RTC::RTC_OK;
}

こういう使いかたをしたいというのが意見としてあったので、
RTCは複数のECと関連付けられるようになっています。
#でも、これってあまりOO的ではないですよね。

でも、たいていのGUIツールキットはタイマコールバックを
登録できるので、それでECをトリガするというのもありといえばありですが。。。

> 上記のような、不定期イベントに同期させたい
> 場合は、ExtTrigECを使ってはいけない、
> という理解でよろしいでしょうか?
> また、そうだとすると、不定期イベント同期型の
> RTCはどのECを使うのがよいのでしょうか?
> RTC仕様を読んでないので、
> 変なことを言っていたら指摘してください。

僕はGUIとRTCをくっつける場合は、RTC側にデータを
入出力するための関数を追加してそれを呼んだりして、
周期実行を乱さないように作ったりします。

C++であれば、たとえば

class MyInterface {
virtual MyInterface() {};
DataStruct getData() = 0;
};

などと定義しておいて、RTCにこのインターフェースを継承させgertData()を実装します。
もちろん、onExecuteで触る変数に変数に触る場合はmutexで保護します。
で、これをとりあえずsoまたはDLL形式にコンパイルしてしまいます。

GUIのプログラムの方は全く別に作成しておいて、初期化の部分で、

Manager::instance().load("MyComponent.sO");
RTObject_impl* rtc = Manager::instance().createComponent("MyComponent");
m_myrtc = dynamic_cast(rtc);

m_myrtc は MyInterface* 型

で、タイマコールバック関数や適当なイベント関数など、データがほしいところで、

void OnTimer()
{
DataStruct data(m_myrtc->getData());

updateGuiDisplay(data);
}

などのようにします。

データをRTCに送りつける場合もこれとほぼ同様にできます。

Python何かだと、別にインターフェースを定義しなくても追加したメンバ関数が
いつでも呼べるのでもっと簡単ですね。
ただし、TkInterのイベントループのスレッドとPythonのスレッド(ECのスレッド)
の相性が悪いので、うろ覚えですがTkInterのスレッド側がデータを取りに行く
または渡しにいくように書かないと落ちたような気がします。
これについては、Pythonのサンプルをご覧ください。

以上で答えになってますでしょうか?

root
オフライン
Last seen: 18時間 7秒 前
登録日: 2009-06-23 14:31
[openrtm-users 00819] EC の実装に関して

安藤様

たいへん丁寧なご回答ありがとうございます。

GUIのRTCは一例として挙げたもので、
私が気になっていることは、
ExtTrigECのrateという概念です。

# GUIに関してただ一点気になったのは、
安藤様の実装では、onExecute()は実質何もしない
実装となりますよね。
その場合、PeriodicECでそのRTCを駆動すると、
空のonExecute()が呼ばれ続けることになるので、
リソースの無駄かと思います。
私としては、onExecute()をGUIイベントの
イベントハンドラとし、それを完全イベント駆動
とする方がユーザとしては理解しやすいし、
リソースの使用を最小限に抑えられると思います。
そこで、イベント同期でonExeute()を駆動する
方法としてExtTrigECを使うというのは
どうかな、と思ったわけです。
仕様上不可ではないとすると、そういう使い方
も想定しておいた方がよいのではと思います。

rateの話に戻すと、
ExtTrigECが周期タイマで駆動される場合は
その挙動はPeriodicなのでrateの意味は明確です。
ただし、ExtTrigECが不定期イベントで駆動される
場合は、rateは概念上意味があいまいになる
と思うのですがどうでしょうか。

以前、OpenHRPのコントローラRTCを使ったとき
のことですが、rtc.confにrateの指定がありました。
ユーザはこれを変えればシミュレータの
タイムステップが変えられると思いますよね。
ところが、OpenHRPでは、このrate指定は無意味で、
別の方法でしかタイムステップを変えることが
できないようになっていました。
(だいぶ前の話です。今は違うかもしれません)

ExtTrigECの場合は、外部アプリがECを
任意のタイミングで駆動できるので、
EC自体が持つrateが実行に反映されない
可能性が出てくると思います。
それがRTCユーザからは分かりにくく、
rtc.confでrateを指定しても本当にそれが
実現されるかは外部アプリ次第というのでは、
RTCユーザは混乱するのではと感じます。

清水

コメントを投稿するにはログインまたはユーザー登録を行ってください

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2209
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク