MultipleOrderedECの用途

各RTCが実行コンテキストを共有していない場合、各RTCの実行は非同期に行われます。各RTCが実行コンテキストを共有している場合、共有している実行コンテキスト上で各RTCは同期的に実行されます。さらに同期的な実行には並列実行、直列実行があります。
OpenRTM-aist付属のExecutionContextが複数のRTCに関連付けしている場合、同期直列実行されます。

本ソフトウェアでは同期的かつ直列実行、並列実行が混在した実行順序となります。

6.1 センサ、コントローラ、モータの例

OpenRTM-aistのデペロッパーズガイドの制御器の例を考えてみます。
制御器コンポーネントではpositionDataIn.isNew()とeferenceDataIn.isNew()がTrueになるまで処理を飛ばしてます。
しかし、制御器コンポーネントの処理に時間がかかる場合は速度指令コンポーネントとセンサコンポーネントは複数回処理を行っていることになります。
ただし実行周期を大きくすれば処理を減らせるのですが、それぞれのRTCが非同期で動いているので図6.1のように制御器コンポーネントのデータ読み込みのタイミングを速度指令コンポーネント、センサコンポーネントのデータ書き込みのタイミングに挟まれている場合、センサコンポーネントのデータを読み込むのは次の周期になります。実行周期が大きい場合、全く違う時間のデータを取得していることになります。

図6.1 非同期実行

そこで、同期させれば確実に同じ周期のデータを取得できます。

さらに、MultipleOrderedECを使用して速度指令コンポーネントとセンサコンポーネントを並列処理すれば直列実行よりも速く処理できることもあると思います。

6.2 簡単な例

例えば以下のシステムを構成した場合を考える。

図6.2 RTシステムの例

各実行パターンで実行した場合の特徴をいかに記します。

非同期

※1例えばbreak文が記述されている場合、処理にかかる時間は場合によって大きく変わります。

※2これを防ぐには実行周期を大きくする必要があるが、例えばTest50がロボットの動きを表示するRTCの場合、動きがカクカクするなどの不具合が生じる可能性がある。

同期直列実行

同期並列実行

これらの考察から、図6.3の実行順序で行うのが適切であると考えられます。
図6.3の手順で処理を実行した場合の特徴は以下の通りです。

図6.3 実行順序の例