ARTLinux用実行コンテキスト_en

ARTLinux用実行コンテキスト

ARTLinux上でOpenRTM-aist-0.4.0で作成したRTコンポーネントをリアルタイム実行するための方法を解説します。 OpenRTM-aistでは、ローダブルモジュールとして作成した実行コンテキスト(ExecutionContext)を動的にロードし、コンポーネントにバインドすることでRTコンポーネントの挙動を制御することが出来ます。

概要

OpenRTM-aist-0.2.0では、ARTLinuxを使ってRTコンポーネントをリアルタイム化する方法として、以下のような方法が一時的に取られていました。
  1. rtc_active_entry で art_enter をコール
  2. rtc_active_do で art_wait をコール
  3. rtc_active_exit で art_exit をコール

OpenRTM-aist-0.4.0では、コンポーネントの実行主体(≒スレッド)は、ExecutionContextという明示的に分離されたオブジェクトとなっており、上記のような方法ではリアルタイム化することはできません。

手順としては、以下のようになります。
  1. ARTLinux用ExecutionContext共有ライブラリ (ARTExecutionContext.so)の作成
  2. RTコンポーネントの *Comp.cpp の書き換え
  3. RTコンポーネントの再コンパイルする
  4. rtc.confの書き換え
  5. RTコンポーネントの実行

ARTLinux用ExecutionContext共有ライブラリの作成

アーカイブのダウンロード

以下から、ARTExecutionContextのソースをダウンロードします。

ビルド

ファイルを適当なディレクトリに解凍し、ビルドを行います。 付属のMakefileは/usr/lib/art_syscalls.oが存在するものとして記述されています。 art_syscalls.oが他の場所にある場合はMakefileを書き換えてください。

 $ tar xvzf ARTExecutionContext.tgz
 $ cd ARTExecutionContext/
 $ make 

*Comp.cpp の書き換え

作成済みのコンポーネントの *Comp.cpp の先頭部分を変更します。

 manager->load("ArtExecutionContext.so", "ArtExecutionContextInit");
 setModuleInitProc(MyModuleInit);

setModuleInitProc の前に、 manager->load で始まる上記の行を追加します。 これで、上で作成したARTExecutionContext.soがロードされるようになります。

コンポーネントの再コンパイル

コンポーネントを再コンパイルします。

 $ make -f Makefile.yourcomp

rtc.confの書き換え

rtc.confに以下のように(1)~(4)を追加します。

 corba.nameservers: localhost:9876
 naming.formats: Sample/%n.rtc
 logger.log_level: TRACE
 
 exec_cxt.periodic.type: ArtExecutionContext   # (1)
 exec_cxt.periodic.rate: 200                   # (2)
 manager.modules.load_path: ./                 # (3)
 manager.modules.abs_path_allowed: yes         # (4)

exec_cxt.periodic.type
ExecutionContextのタイプを指定します。使用するExecutionContextはArtxecutionContextです。
exec_cxt.periodic.rate
ExecutionContextの実行周期を[Hz]で指定します。1ms周期で実行する場合は1000、5ms周期で実行する場合は200のように指定します。
manager.modules.load_path
モジュールロードパスを指定します。ArtExecutionContext.soが存在するパスを指定します。上記では、コンポーネントを実行するディレクトリを指定しています。
manager.modules.abs_path_allowed
モジュールロードパスに絶対パス指定を許すかを指定します。とりあえずyesを指定してください。

コンポーネントの実行

ArtExecutionContext.so のコピー

上で作成したARTExecutionContext.soをコンポー ネント実行ディレクトリコピーします。

 $ cd YourComponentDir
 $ cp ARTExecutionContext/ARTExecutionContext.so .

実行

コンポーネントを実行します。

 $ YourComponentComp

サンプル

ここでは、ArtExecutionContextを利用した簡単なサンプルを紹介します。(栗原氏提供)

rtc-templateの実行

rtc-templateにてコンポーネントの雛型を生成します。

以下のようにgen.shのようなファイルを生成すると、再度雛型を生成する 際に楽です。

 $ mkdir ArtEcSample
 $ cd ArtEcSample
 $ vi gen.sh
 rtc-template -bcxx --module-name=art_ec_test   --module-desc=art ec test component --module-version=1.0.0 --module-vendor=S.Kurihara   --module-category=Category --module-comp-type=STATIC   --module-act-type=DataFlowComponent --module-max-inst=1
 
 $ sh gen.sh
  File "art_ec_test.h" was generated.
  File "art_ec_test.cpp" was generated.
  File "art_ec_testComp.cpp" was generated.
  File "Makefile.art_ec_test" was generated.
  File "README.art_ec_test" was generated.

ヘッダファイルの編集

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がコンポーネント実行ディレクトリに在る必要があります。

 $ cd ArtEcSample
 $ cp ~/ARTExecutionContext/ARTExecutionContext.so .

以下の方法にてコンポーネントを実行後、Activate,DeActivateを行うと cycle.logというファイルができます。

 $ ./art_ec_testComp

周期データ

以下は、上記コンポーネントにて計測した毎周期の差分時間のデータです。
表示されている値はマイクロ秒です。

 [exec_cxt.periodic.rate: 1000]
 1015
 1004
 997
 1001
 984
 1033
 956
 1024
 991
 981
 995
 1026
 1006
 999
 973
 1009
 1012
 999
 1010
 1002

 [exec_cxt.periodic.rate: 200]
 4997
 5022
 4977
 5010
 4994
 4998
 4992
 5013
 4993
 5004
 5015
 4979
 5006
 4996
 4990
 5009
 4999
 4998
 5007
 4998
 4984

このように、ARTLinuxを用いて既存のコンポーネントをリアルタイム化することが出来ます。

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK