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システムの例
各実行パターンで実行した場合の特徴をいかに記します。
非同期
各RTCは独立したプロセスにより実行されるため、直列的に実行するよりも処理時間を短縮できる場合がある。
各RTCの処理時間※1が不安定な場合、Test40、Test41、Test42の実行回数がTest50の実行回数よりかなり多くなる場合があり無駄な処理が発生することになる※2。
※1例えばbreak文が記述されている場合、処理にかかる時間は場合によって大きく変わります。
※2これを防ぐには実行周期を大きくする必要があるが、例えばTest50がロボットの動きを表示するRTCの場合、動きがカクカクするなどの不具合が生じる可能性がある。
同期直列実行
同期的に実行するため無駄なRTCの実行が発生しない。
直列的に実行するため、並列的に実行する場合よりも処理に時間がかかる場合がある。
同期並列実行
同期的に実行するため無駄なRTCの実行が発生しない。
並列的に実行するため直列的に実行する場合よりも処理時間を短縮できる場合がある。
データの送受信のタイミングが不安定な場合、Test50が受信するタイミングが、Test40、Test41の送信したデータは同じ周期、Test42の送信したデータは次の周期で受信することがある。
これらの考察から、図6.3の実行順序で行うのが適切であると考えられます。
図6.3の手順で処理を実行した場合の特徴は以下の通りです。
Test40、Test41、Test42は並列的に実行されるため直列的に実行するよりも処理時間が短縮できる場合がある。
データの送受信のタイミングが同じ周期で行われる。
図6.3 実行順序の例