ダウンロード
最新バージョン : 2.0.2-RELESE
| 2.0.2-RELESE | ダウンロードページ |
OpenRTM@Github
OpenRTM-aist GitHubサイト
ROS
Robot Operating System
Choreonoid
モーションエディタ/シミュレータ
DAQ-Middleware
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
| 2.0.2-RELESE | ダウンロードページ |
OpenRTM-aist GitHubサイト
Robot Operating System
モーションエディタ/シミュレータ
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
ARTLinux上でOpenRTM-aist-0.4.0で作成したRTコンポーネントをリアルタイム実行するための方法を解説します。 OpenRTM-aistでは、ローダブルモジュールとして作成した実行コンテキスト(ExecutionContext)を動的にロードし、コンポーネントにバインドすることでRTコンポーネントの挙動を制御することが出来ます。
概要
OpenRTM-aist-0.2.0では、ARTLinuxを使ってRTコンポーネントをリアルタイム化する方法として、以下のような方法が一時的に取られていました。OpenRTM-aist-0.4.0 では、コンポーネントの実行主体(≒スレッド)は、ExecutionContext という明示的に分離されたオブジェクトとなっており、上記のような方法ではリアルタイム化することはできません。
手順としては、以下のようになります。ARTLinux用 ExecutionContext 共有ライブラリの作成
アーカイブのダウンロード
以下から、ARTExecutionContext のソースをダウンロードします。
ビルド
ファイルを適当なディレクトリーに解凍し、ビルドを行います。 付属の Makefileは/usr/lib/art_syscalls.o が存在するものとして記述されています。 art_syscalls.o が他の場所にある場合は Makefile を書き換えてください。
*Comp.cpp の書き換え
作成済みのコンポーネントの *Comp.cpp の先頭部分を変更します。
manager->load("ArtExecutionContext.so", "ArtExecutionContextInit"); setModuleInitProc(MyModuleInit);コンポーネントの再コンパイル
コンポーネントを再コンパイルします。
rtc.conf の書き換え
rtc.conf に以下のように(1)~(4)を追加します。
コンポーネントの実行
ArtExecutionContext.so のコピー
上で作成した ARTExecutionContext.so をコンポーネント実行ディレクトリーにコピーします。
実行
コンポーネントを実行します。
サンプル
ここでは、ArtExecutionContext を利用した簡単なサンプルを紹介します。(栗原氏提供)
rtc-template の実行
rtc-template にてコンポーネントの雛型を生成します。
以下のように gen.sh のようなファイルを生成すると、再度雛型を生成する際に便利です。
ヘッダファイルの編集
art_ec_test.hのonExecute(),onDeactivate() のコメントを外します。
ソースファイルの編集
今回は、onExecute() 内にてgettimeodda() で取得した時間をファイルに書き出すだけのコンポーネントを作成します。
[art_ec_test.cpp]
// -*- C++ -*- /*! * @file art_ec_test.cpp * @brief art ec test component * @date $Date$ * * $Id$ */ #include "art_ec_test.h" #include <fstream> #include <sys/time.h> // 時間をファイルに書き出すためのオブジェクト ofstream out; static const char* art_ec_test_spec[] = { "implementation_id", "art_ec_test", "type_name", "art_ec_test", "description", "art ec test component", "version", "1.0.0", "vendor", "S.Kurihara", "category", "Category", "activity_type", "DataFlowComponent", "max_instance", "1", "language", "C++", "lang_type", "compile", "" }; art_ec_test::art_ec_test(RTC::Manager* manager) : RTC::DataFlowComponentBase(manager), dummy(0) { // ファイルオープン out.open("cycle.log"); } art_ec_test::~art_ec_test() { } /* RTC::ReturnCode_t art_ec_test::onActivated(RTC::UniqueId ec_id) { return RTC::RTC_OK; } */ RTC::ReturnCode_t art_ec_test::onDeactivated(RTC::UniqueId ec_id) { // ファイルクローズ out.close(); return RTC::RTC_OK; } RTC::ReturnCode_t art_ec_test::onExecute(RTC::UniqueId ec_id) { /****** 時間取得とファイルへの書き出し ***********/ timeval tv; gettimeofday(&tv,0); out << tv.tv_usec << std::endl; /************************************************/ return RTC::RTC_OK; } extern "C" { void art_ec_testInit(RTC::Manager* manager) { RTC::Properties profile(art_ec_test_spec); manager->registerFactory(profile, RTC::Create<art_ec_test>, RTC::Delete<art_ec_test>); } };*Comp ファイルの編集
art_ec_testComp.cppのmain()関数内のmanager->setModuleInitProc(MyModuleInit);の 上に以下の1行を追加します。
manager->load("ArtExecutionContext.so", "ArtExecutionContextInit");コンポーネントの実行
ART用ExecutionContext?を利用するためにはARTExecutionContext?.soがコンポーネント実行ディレクトリに在る必要があります。
以下の方法にてコンポーネントを実行後、Activate,DeActivate を行うと cycle.log というファイルができます。
周期データ
以下は、上記コンポーネントにて計測した毎周期の差分時間のデータです。
表示されている値はマイクロ秒です。
このように、ARTLinux を用いて既存のコンポーネントをリアルタイム化することができます。