OpenRTM MLの皆さま
産総研 安藤です
通常のLinux kernelでリアルタイム実行を実現するためのパッチ (RT-Preempt patch) を利用した実行コンテキストを作成してみましたので公開します。 すでに、fuRoの清水さんや、静岡大の清水さんなども作成されているものと ほぼ同じものだと思います。問題がなさそうであれば本体に取り込みます。
Ubuntuではすでにパッチの当たったkernelもパッケージとして 用意されているようですので、簡単に導入できて便利ですね。 こちらでは、Ubuntu8.04 に以下のカーネルを入れてテストしてみました。
$ dpkg -l | grep rt |grep kernel ii linux-image-2.6.24-27-rt 2.6.24-27.65 Linux kernel image for version 2.6.24 on Ing
1 ms周期のループの1000回の計測結果は以下のような感じです。 (PCはPenM 2.0GHz + 2GB memoryのキューブタイプのPC)
max: 1.036 [ms] min: 0.998 [ms] mean: 1.00021 [ms] stddev: 0.00380806 [ms]
必要に応じて rtc.conf で幾つかオプションを指定することができます。 ・優先度 (1-99) ・スケジューリングポリシ (rr or fifo) ・ウエイト時間の調整 ([ns])
添付のソースには、時間計測用のサンプルコンポーネントも同梱されています。 OpenRTM-aistがインストールされた環境で
$ tar xvzf RTPreemptEC.tgz_ $ cd RTPreemptEC $ make $ cd RTSample $ make $ su # ./RTSampleComp -f rtc.conf1
のように、コンパイルしてからrootになって実行してください。 RTSEでActivateすると、1000回ごとの計測結果を表示します。
以下、注意事項です。 ・rootでしか実行できません ・logger.log_level は DEBUG以下にしてください ・logger.enable: NO でも logger.log_level: PARANOID だと デッドラインが守れなくなることがあります。
実装上の問題点や、バグ等ありましたらお知らせください。
以下、ソースのdoxygenドキュメントのコピーです。
* @class RTPreemptEC * @brief RTPreemptEC クラス * * RT-Preempt kernel を利用した、リアルタイム実行コンテキストクラス。 * この実行コンテキストは、RT-Preempt Patch を適用した Linux kernel、 * 又は、これが組み込まれた Linux kernel によるリアルタイムスケジュー * リング機能を利用した実行コンテキストである。 * * この実行コンテキストを利用するには、rtc.conf に下記のように記述する。 * * * exec_cxt.periodic.type: RTPreemptEC * exec_cxt.periodic.rate: 1000 * exec_cxt.priority: 50 * manager.modules.load_path: * manager.modules.preload: RTPreemptEC.so * * * さらに、実行時には root 権限が必要となるので、root としてコンポー * ネントを実行する必要がある。 * * このECに特有なオプションは以下のとおりである。 * * - exec_cxt.periodic.priority: (default: 49) * - exec_cxt.periodic.rtpreempt.priority: (default: 49) * スレッドの実行優先度 1 (最低) から 99 (最高) * Linux sched_setscheduler(2) を参照のこと。 * * - exec_cxt.periodic.rtpreempt.sched_policy: (default: fifo) * スケジューリングのポリシ。 * rr: ラウンドロビン, fifo: FIFO 型 (default: fifo) * Linux sched_setscheduler(2) を参照のこと。 * * - exec_cxt.periodic.rtpreempt.wait_offset: (default: -10000) * ウェイト時間のオフセット。[ns] 単位で指定する。 * 1周期あたり数十 us 程度の定常的な遅れが発生する場合があるので、 * この値を調整することで、より正確な周期で実行させることができる。 * * 注意事項: このECを比較的速い周期 (数十ms以上) で実行させる場合は、 * ログレベルを DEBUG よりも下 (logger.log_level: NORMAL 等) に設定し * て実行する必要がある。また、logger.enable: NO に設定されていても、 * logger.log_level: PARANOID に設定されている場合には、onExecute() * の実行に時間がかかり、デッドラインを守れなくなる可能性があるので注 * 意が必要である。
モーションエディタ/シミュレータ
動力学シミュレータ
統合開発プラットフォーム
産総研が提供するRTC集
東京オープンソースロボティクス協会
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
OpenRTM MLの皆さま
産総研 安藤です
通常のLinux kernelでリアルタイム実行を実現するためのパッチ (RT-Preempt patch)
を利用した実行コンテキストを作成してみましたので公開します。
すでに、fuRoの清水さんや、静岡大の清水さんなども作成されているものと
ほぼ同じものだと思います。問題がなさそうであれば本体に取り込みます。
Ubuntuではすでにパッチの当たったkernelもパッケージとして
用意されているようですので、簡単に導入できて便利ですね。
こちらでは、Ubuntu8.04 に以下のカーネルを入れてテストしてみました。
$ dpkg -l | grep rt |grep kernel
ii linux-image-2.6.24-27-rt 2.6.24-27.65
Linux kernel image for version
2.6.24 on Ing
1 ms周期のループの1000回の計測結果は以下のような感じです。
(PCはPenM 2.0GHz + 2GB memoryのキューブタイプのPC)
max: 1.036 [ms]
min: 0.998 [ms]
mean: 1.00021 [ms]
stddev: 0.00380806 [ms]
必要に応じて rtc.conf で幾つかオプションを指定することができます。
・優先度 (1-99)
・スケジューリングポリシ (rr or fifo)
・ウエイト時間の調整 ([ns])
添付のソースには、時間計測用のサンプルコンポーネントも同梱されています。
OpenRTM-aistがインストールされた環境で
$ tar xvzf RTPreemptEC.tgz_
$ cd RTPreemptEC
$ make
$ cd RTSample
$ make
$ su
# ./RTSampleComp -f rtc.conf1
のように、コンパイルしてからrootになって実行してください。
RTSEでActivateすると、1000回ごとの計測結果を表示します。
以下、注意事項です。
・rootでしか実行できません
・logger.log_level は DEBUG以下にしてください
・logger.enable: NO でも logger.log_level: PARANOID だと
デッドラインが守れなくなることがあります。
実装上の問題点や、バグ等ありましたらお知らせください。
以下、ソースのdoxygenドキュメントのコピーです。
* @class RTPreemptEC
* @brief RTPreemptEC クラス
*
* RT-Preempt kernel を利用した、リアルタイム実行コンテキストクラス。
* この実行コンテキストは、RT-Preempt Patch を適用した Linux kernel、
* 又は、これが組み込まれた Linux kernel によるリアルタイムスケジュー
* リング機能を利用した実行コンテキストである。
*
* この実行コンテキストを利用するには、rtc.conf に下記のように記述する。
*
*
* exec_cxt.periodic.type: RTPreemptEC
* exec_cxt.periodic.rate: 1000
* exec_cxt.priority: 50
* manager.modules.load_path:
* manager.modules.preload: RTPreemptEC.so
*
*
* さらに、実行時には root 権限が必要となるので、root としてコンポー
* ネントを実行する必要がある。
*
* このECに特有なオプションは以下のとおりである。
*
* - exec_cxt.periodic.priority: (default: 49)
* - exec_cxt.periodic.rtpreempt.priority: (default: 49)
* スレッドの実行優先度 1 (最低) から 99 (最高)
* Linux sched_setscheduler(2) を参照のこと。
*
* - exec_cxt.periodic.rtpreempt.sched_policy: (default: fifo)
* スケジューリングのポリシ。
* rr: ラウンドロビン, fifo: FIFO 型 (default: fifo)
* Linux sched_setscheduler(2) を参照のこと。
*
* - exec_cxt.periodic.rtpreempt.wait_offset: (default: -10000)
* ウェイト時間のオフセット。[ns] 単位で指定する。
* 1周期あたり数十 us 程度の定常的な遅れが発生する場合があるので、
* この値を調整することで、より正確な周期で実行させることができる。
*
* 注意事項: このECを比較的速い周期 (数十ms以上) で実行させる場合は、
* ログレベルを DEBUG よりも下 (logger.log_level: NORMAL 等) に設定し
* て実行する必要がある。また、logger.enable: NO に設定されていても、
* logger.log_level: PARANOID に設定されている場合には、onExecute()
* の実行に時間がかかり、デッドラインを守れなくなる可能性があるので注
* 意が必要である。