RTコンポーネント作成(Java版)

概要

OpenRTM-aist-Java 概要

 OpenRTM-aist とは、独立行政法人産業技術総合研究所・知能システム研究部門・タスクインテリジェンス研究グループが実装・配布・メンテナンスを行っている RTミドルウェアの実装例です。RTミドルウェアおよび OpenRTM-aist は、ロボットの様々な機能要素を RTコンポーネントと呼ばれる部品単位に分割し、これらを自由に組み合わせることで多様なロボットシステムの構築を可能にするためのソフトウェアプラットフォームです。現在 OMG (Object Management Group) にて仕様策定中のロボット用ミドルウェア仕様(The Robotic Technology Component Specification)にも準拠しています。
OpenRTM-aist-Java は、これまで C++言語向けに提供されていた OpenRTM-aist を Java言語に移植したものです。C++版 OpenRTM-aist互換のインターフェースを有し、Java言語を使用して開発した RTコンポーネントと C++言語を利用して開発した RTコンポーネントの相互運用が可能としています。

対象

 本ドキュメントは、OpenRTM-aist-Java を利用して、Java言語版 RTコンポーネントを開発する方法について説明しています。なお、本ドキュメントでは Java言語については基本知識を既に持っている方を対象としています。

動作環境

 OpenRTM-aist-Java の動作に必要な環境は以下のとおりです。


表 1-1 動作環境

環境 備考
Java Development Kit 5.0 (JDK 5)
(http://java.sun.com/products/archive/j2se/5.0_14/index.html )
注意:Java1.4 では動作しません.


 OpenRTM-aist-Java のインストール方法の詳細につきましては、「OpenRTM-aist-Java インストールマニュアル(UNIX)」あるいは「OpenRTM-aist-Java インストールマニュアル(Windows)」を参照してください。特に、次のことを確認してから以下の作業に移ってください。
  • 「java -version」を実行したときのバージョンが上記 JDKと一致すること
  • 環境変数 RTM_JAVA_ROOT に OpenRTM-aist-Java のライブラリへのパス(ベースパス)が設定されていること
  • <RTM_JAVA_ROOT>で設定されるパスの直下のディレクトリー「jar」内にライブラリファイル OpenRTM-aist-0.4.x.jar と commons-cli-1.1.jar が存在すること(クラスパスとして設定するため)
      こちら を参考に独自のクラスパスの設定も可能です。

◆参考:

 ここでは、Java版 RTコンポーネントの開発を行う場合の手順をご紹介します。サンプルとして以下のような仕様のコンポーネントを取り上げます。

表 2-1 サンプルコンポーネントの仕様

基本プロファイル
コンポーネント名 sample
説明 SampleComponent
バージョン 1.0
ベンダ AIST
カテゴリ example
コンポーネントの型 DataFlowComponent
アクティビティタイプ SPORADIC
最大インスタンス数 5
データInPort
名称 in
TimedLong
サービスProvider
IDLパス IDLs/MyService.idl
ポート名 MySvcPort
サービス名 myservice0
サービス型 MyService
コンフィギュレーションパラメーター
名称 multiply
int
デフォルト値 1


MyService.idl は適当なエディタを用いて以下のような IDL ファイルを作成します。また、上の表中の「IDLパス」はMyService.idl のパスを記述します。Windowsの場合は、この「IDLパス」が MyService.idl へのフルパスでなければなりません。

 typedef sequence<string> EchoList;
 typedef sequence<float> ValueList;
 interface MyService
 {
   string echo(in string msg);
   EchoList get_echo_history();
   void set_value(in float value);
   float get_value();
   ValueList get_value_history();
 };
MyService.idl


なお、上記 MyService.idl は OpenRTM-aist-0.4-Java に付属するサンプルの「examples/Java/RTMExamples/SimpleService」ディレクトリー内にあるものと同一です。

GUI を用いた場合の RTコンポーネントの開発手順

 GUI ツールである RtcTemlate を用いて、RTコンポーネントを開発手順を説明します。RtcTemplate の詳細についてはRtcLink・RtcTemplateのインストールおよびRtcTemplateを参照してください。

RtcTemplate と JDT の連携

  • Eclipse を「新規」に開く  RTコンポーネントの開発は、統合開発環境 Eclipse のプロジェクトから行うことも可能です。新しいワークスペースを指定して [OK] ボタンをクリックします。Eclipse が起動します。(このとき「ようこそ」という画面が表示される場合がありますが、これは閉じます。)
    CheckedWorkSpace2.png
    図 2-2 新規の Workspace を指定

  • Java プロジェクトファイルの作成
     上部メニューから [ファイル] > [新規] > [プロジェクト] を選択します。
    MakeProjectForBulid1.png
    図 2-3 ビルド用プロジェクトの作成 1

 「新規プロジェクト」ウィザード内で「Javaプロジェクト」を選択し、[次へ] ボタンをクリックします。

MakeProjectForBulid2.png
図 2-4 ビルド用プロジェクトの作成 2

 「新規プロジェクト」ウィザードの次のステップで、作成する「プロジェクト名」を入力します。「JDK準拠」グループ内の設定が「5.0」以上(あるいは1.5以上)となっていることを確認した上で、[次へ] ボタンをクリックします(図 2-5)。一方、環境によっては「JDK準拠」フレームであるところが「JRE」フレームとなっており、プルダウンメニューから JDK5(あるいはJDK1.5)が選択できない場合があります(図 2-5')。その場合は、こちら を参照してJDKを選択できるようにします。

MakeProjectForBulid3.png
図 2-5 ビルド用プロジェクトの作成 3


PullDownMenu_Default.png
図 2-5' 環境によっては JDK を選択できない


参考:
 → ''FAQ'': Q. 新規 Java プロジェクトが JDK5 (1.5) 準拠として作成できない



 表示された「新規 Java プロジェクト」画面において、生成するプロジェクトの各種設定を行い [終了] ボタンをクリックします。

ProjectSettings.png
図 2-6 プロジェクトの各種設定をして終了

 指定したプロジェクトが生成され、「パッケージ・エクスプローラービュー」内に表示されます。

PackageExplorerView.png
図 2-7 パッケージエクスプローラビューの表示例



-自動ビルドを無効に
 Eclipse のメニューバーの [プロジェクト] > [自動的にビルド] がオンになっている場合は、チェックをはずし無効にしておいた方がいいでしょう。

プロジェクトの作成時の各種オプション、設定など Eclipse に関する詳細は、Eclipse のサイト(http://www.eclipse.org/ )などを参照してください。



RtcTemplate を利用したスケルトン・コードの生成

  • GUI版RtcTemplate エディタの起動
     RtcTemplate のエディタ画面を起動します。

参考:
 → RtcTemplate を直接起動する
RtcTemplate の使用方法等につきましては、RtcTemplateを参照してください。


  • RtcTemplate エディタで設定項目を編集
     GUI版の RtcTemplate を使用して''表2-1'' の仕様を持つ RTコンポーネントのスケルトン・コードを生成させる場合の設定を以下に示します。
    GUIrtc-templateSetting1.png
    GUIrtc-templateSetting2.png
    図 2-8 GUI RtcTemplateの設定


:注:Windowsの場合、上記 「Output directory」 や「IDL path:」などはフルパスで記述すること。|

  • [Generate] ボタンでコードを生成
     [Generate] ボタンをクリックし、コード生成を実行する。このとき必ず、RtcTemplate エディタ最下段の 「Output directory」 欄に、先に生成したプロジェクトのディレクトリーを指定すること( 図 2-8では「temp」となっている)。


GenCode.png
図 2-9 コードを生成


  • 生成された各種ファイルがプロジェクトに追加
     「Output directory」として指定したディレクトリーに以下のファイルが生成されます。
    • Sample.java ・・・・・・・・・・・・・・・・・・・ Component Profile、初期化処理などを定義したクラス
    • Sampleimpl.java ・・・・・・・・・・・・・・・ RTコンポーネント本体クラス
    • SampleComp.java ・・・・・・・・・・・・・ RTコンポーネント起動用クラス
    • MyServiceSVC_impl.java ・・・・・・・ サービス実装クラス
    • build_Sample.xml ・・・・・・・・・・・・・・ RTコンポーネント ビルドファイル
    • README.Sample ・・・・・・・・・・・・・・  Read Meファイル


: 「Output directory」欄にプロジェクトのディレクトリーを指定することにより、生成された各種ファイルがプロジェクトへ(自動的に)追加されることになります。|

Done.png
図 2-10 各種ファイルの追加


 
コード生成が完了しても生成されたファイルの内容がプロジェクトの「パッケージ・エクスプローラ」に反映されていない場合があります。対象プロジェクトを右クリックして表示されるコンテキストメニュー内から [更新] を選択して、情報の更新を行うことができます。
UpdateProject.png
図 2-11 プロジェクト表示の更新


サービスポートを定義している RTコンポーネントの場合、Rtctemplate が生成したファイルだけではエラーが表示されます。これは該当するファイルが、IDL ファイルから自動生成されるクラスを利用しているためです。これらのクラスはビルド実行時に自動生成されます。


クラスパスが有効となる場所に、OpenRTM-aist-Java がインストールされていない場合、エラーが表示されます。この場合、プロジェクトのプロパティから OpenRTM-aist-Java のインストールフォルダー(ディレクトリー)を指定してください。

ProjectContextMenu.png
図 2-12 プロジェクトを右クリック


ProjectProperty.png
図 2-13 OpenRTM-aist-Javaへのパスを追加



  • IDLファイルを「Output directory」に追加
     RtcTemplate エディタ上の「IDL path:」で指定したIDLファイルを、生成されたJavaソースコードが配置される「Output directory」に手動でコピーします。

    Eclipseを用いたビルド

  • Antビルド
     パッケージ・エクスプローラー内の build_Sample.xml を右クリックし、表示されるコンテキストメニュー中から [実行] > [Antビルド] を選択することで、対象 RTコンポーネントのビルドを行うことが可能です。自作の jar ライブラリ等を使う必要があったり、OpenRTM-aist を違う場所にインストールしたなどの事情でクラスパスを任意の場所に設定してビルドするにはこちら を参照してください。
    BuildProject.png
    図 2-14 プロジェクトのビルド


BuildProject-consoleview.png
図 2-15 ビルド実行時のコンソール画面


ビルドが成功すると、プロジェクト内の「classes」ディレクトリーに classファイルが生成されます。




:参考:|
 → ''FAQ'': Q. 任意のフォルダーにクラスパスを設定して Ant ビルドを行う方法は?



作成した RTコンポーネントの実行

  • rtc.confの作成
     プロジェクト内の「classes」に以下のような内容のファイル rtc.conf を作成しておきます。


 corba.nameservers: localhost
 naming.formats: %n.rtc
rtc.conf



 なお、上記 rtc.conf は OpenRTM-aist-0.4-Java に付属しているサンプルの「examples/Java/RTMExamples/SimpleService」ディレクトリー内にあるものと同一です。


-ネームサーバーと RtcLink の起動
 OpenRTM-aist-0.4-Java に付属のツールで「bin」ディレクトリー内にある start-orbd.vbs をダブルクリック(Windows)し、あるいは、start-orbd.sh を実行(UNIX)し、ネームサーバーを起動しておきます。また、RtcLinkを起動しておきます。
    • 参考:
      • ネームサーバの起動(UNIX) ネームサーバの起動(Windows)
      • RtcLink の起動

        -RTコンポーネントの実行
         コマンドプロンプトあるいはターミナルを起動して、前述「classes」ディレクトリーをカレントとします。
        --UNIX系システムの場合
         $ java -classpath .:$RTM_JAVA_ROOT/jar/OpenRTM-aist-0.4.1.jar:$RTM_JAVA_ROOT/jar/commons-cli-1.1.jar SampleComp
         
         あるいは、たとえば bash の場合などは、上記コマンドを分割して、
         
         $ export CLASSPATH=.:$RTM_JAVA_ROOT/jar/OpenRTM-aist-0.4.1.jar:$RTM_JAVA_ROOT/jar/commons-cli-1.1.jar
         $ java SampleComp
    • Windows系システムの場合
       > java -classpath ".;%RTM_JAVA_ROOT%\jar\OpenRTM-aist-0.4.1.jar;%RTM_JAVA_ROOT%\jar\commons-cli-1.1.jar" SampleComp
       
       あるいは、上記コマンドを分割して、
       
       > set CLASSPATH=.;%RTM_JAVA_ROOT%\jar\OpenRTM-aist-0.4.1.jar;%RTM_JAVA_ROOT%\jar\commons-cli-1.1.jar
       > java SampleComp
というコマンドを実行すれば、RtcLink上に RTコンポーネントがあらわれます。



JavaSampleOnRtcLink.png
図 2-16 Sample コンポーネントを実行に成功したときの RtcLink の状態





Java版 RTコンポーネントの詳細

Java版 RTコンポーネントの構成

Java版 RTコンポーネントのソースファイルと、各ファイル内で実行している概略機能との関係を図3-1に示します。また、比較のために C++版 RTコンポーネントおよび OpenRTM-aist-0.3用 Java版 RTコンポーネントの構成も併せて示します。

InnerRTcomponents.png
図3-1 RTコンポーネントの構成


既存の C++版 RTコンポーネントと Java版 RTコンポーネントを比較した場合、以下の点が異なります。
  • RTコンポーネント機能の実体の分離 Java版 RTコンポーネントでは、起動処理の関係などから、RTコンポーネント機能の実体をXXXImplクラス (図3-1中では<Sample>Impl.java) 側へ移動しております。これに伴い、元々の RTコンポーネントクラス(図3-1中では<Sample>.java)側では Component Profile 定義と、各種コンポーネント生成用処理のみが残った形となっております。
  • コールバック関数のインターフェース化 C++版 RTコンポーネントにてコールバック関数として定義されていた部分が、Java版 RTコンポーネントではインターフェース化されています。
    • ModuleInitProc:コンポーネント起動クラス起動用インターフェース
    • RtcNewFunc:RTコンポーネント生成用インターフェース
    • RtcDeleteFunc:RTコンポーネント破棄用インターフェース
この修正に伴い、コンポーネント起動用クラスは上記インターフェースの実装を行う必要がございます。

Java版 RTコンポーネントと C++版コンポーネントの相違点

データポート

OpenRTM-aist-Java では、データの受け渡しを行うためにホルダクラス(DataRefクラス)を追加しています。そのため、データポートの定義および利用方法が以下のように変更されております。

Java版RTコンポーネント C++版RT コンポーネント
//InPort の定義
protected TimedShort m_in_val;
protected DataRef<TimedLong> m_in;
protected InPort<TimedLong> m_inIn;

//InPort の登録
m_in_val = new TimedLong();
m_in = new DataRef<TimedLong>(m_in_val);
m_inIn = new InPort<TimedLong>(“in”,m_in);
registerInPort(TimedLong.class,“in”,m_inIn);

//InPort からのデータ読み込み
m_inIn.read();
入力データ = m_in.v.data;
//InPort の定義
TimedShort m_in;
InPort<TimedShort> m_inIn;

//InPort の登録
m_inIn = new InPort<TimedLong>(“in”,m_in);
registerInPort(“in”,m_inIn);

//InPort からのデータ読み込み
m_inIn.read();
入力データ = m_in.data;
//OutPort の定義
protected TimedFloat m_out_val;
protected DataRef<TimedFloat> m_out;
protected OutPort<TimedFloat> m_outOut;

//OutPort の登録
m_out_val = new TimedFloat();
m_out = new DataRef<TimedFloat>(m_out_val);
m_outOut = new OutPort<TimedLong>(“out”,m_out);
registerOutPort(TimedLong.class,“out”,m_outOut);

//OutPort へのデータの書き出し
m_out_val.data = 出力データ;
m_outOut.write();
//OutPort の定義
TimedFloat m_out;
OutPort<TimedFLoat> m_outOut;

//OutPort の登録
m_outOut = new OutPort<TimedFloat>(“out”,m_out);
registerOutPort(“out”,m_outOut);

//OutPort へのデータの書き出し
m_out.data = 出力データ;
m_outOut.write();

 データポート使用方法につきましては、「SeqIO」「SimpleIO」のサンプルをご参照ください。

 

サービスポート

 OpenRTM-aist-Java では、サービスポートを使用するための補助変数(<サービス名>Base)を追加しております。このため、サービスポートの定義、利用方法が以下のように変更されております。詳細につきましては、「SimpleService」のサンプルをご覧ください。

Java版RTコンポーネント C++版RTコンポーネント
//Consumer の定義
protected CorbaPort m_MyServicePort;
protected CorbaConsumer<MyService> m_myservice0Base
= new CorbaConsumer<MyService>(MyService.class);
protected MyService m_myservice0;

//Consumer の登録
m_MyServiceRef = new CorbaPort(“MyService”);
m_MyServicePort.registerConsumer
(“myservice0”,”MyService”,m_myservice0Base);
registerPort(m_MyServicePort);

//Consumer の利用
m_myservice0 = m_myservice0Base._ptr();
m_myservice0.echo(argv[1]);
//Consumer の定義
RTC::CorbaPort m_MyServicePort;
RTC::CorbaConsumer<MyService> m_myservice0;

//Consumer の登録
m_MyServicePort = new RTC::CorbaPort(“MyService”);
m_MyServicePort.registerConsumer
(“myservice0”,“MyService”, m_myservice0);
registerPort(m_MyServicePort);

//Consumer の利用
m_myservice0->echo(argv[1].c_str());
//Provider の定義
protected CorbaPort m_MyServicePort;
protected MyServiceSVC_impl m_myservice0
= new MyServiceSVC_impl();

//Provider の登録
m_MyServiceRef = new CorbaPort(“MyService”);
m_MyServicePort.registerProvider
(“myservice0”,”MyService”,m_myservice0);
registerPort(m_MyServicePort);
//Provider の定義
RTC::CorbaPort m_MyServicePort;
MyServiceSVC_impl m_myservice0;

//Provider の登録
m_MyServicePort = new RTC::CorbaPort(“MyService”);
m_MyServicePort.registerProvider
(“myservice0”,“MyService”,m_myservice0);
registerPort(m_MyServicePort);



コンフィギュレーション

データポートの場合と同様、コンフィギュレーションを利用する場合もデータの受け渡しのためにホルダクラスを利用しています。このため、コンフィギュレーション・データの定義、利用方法が以下のように変更されております。

Java版RTコンポーネント C++版RTコンポーネント
//Configuration Variable の定義
protected IntegerHolder m_int_param0 = new IntegerHolder();
protected StringHolder m_str_param0 = new StringHolder();
protected VectorHolder m_vector_param0= new VectorHolder();

//パラメーターのバインド
bindParameter(“int_param0”,m_int_param_0,“0”);
bindParameter(“str_param0”,m_str_param_0,“sample”);
bindParameter(“vector_param0”,m_vector_param_0,“0.0,1.0,2.0,3.0,4.0”);
//Configuration Variable の定義
int m_int_param0;
str::string m_str_param0;
str::vector<double> m_vector_param0;

//パラメーターのバインド
bindParameter(“int_param0”,m_int_param_0,“0”);
bindParameter(“str_param0”,m_str_param_0,“sample”);
bindParameter(“vector_param0”,m_vector_param_0,“0.0,1.0,2.0,3.0,4.0”);

コンフィギュレーション・データの使用方法につきましては、「ConfigSample」のサンプルをご参照ください。
OpenRTM-aist-Javaで、コンフィギュレーション・データ用ホルダとして用意しているホルダクラスの種類とデータ型の関係を表3-1に示します。

表 3-1 コンフィギュレーション・データ用ホルダ型対応関係

データ型 ホルダ・クラス
short jp.go.aist.rtm.RTC.util.ShortHolder
int jp.go.aist.rtm.RTC.util.IntegerHolder
long jp.go.aist.rtm.RTC.util.LongHolder
float jp.go.aist.rtm.RTC.util.FloatHolder
double jp.go.aist.rtm.RTC.util.DoubleHolder
byte jp.go.aist.rtm.RTC.util.ByteHolder
String jp.go.aist.rtm.RTC.util.StringHolder

C++版 OpenRTM-aist と同様に、OpenRTM-aist-Java におきましてもユーザーが定義した任意の型についてコンフィグレーション・データ用ホルダを作成することができます。
コンフィギュレーション・データ用のホルダを実装する場合は、jp.go.aist.rtm.RTC.util.ValueHolder の stringFrom メソッドを実装し、implements節に Serializable インターフェースを追加する必要があります。
jp.go.aist.rtm.RTC.util.ValueHolder の stringFrom メソッドは、引数で渡された文字列から対象データ型に変換するためのメソッドです。
コンフィグレーション・データ用ホルダにつきましては「ConfigSample」サンプル内の VectorHolder クラスをご参照ください。

Java版 RTコンポーネントの起動時の振る舞い

C++版 RTコンポーネントの起動時の振る舞いを以下に示します。コンポーネント起動時の振る舞いについては、Java版 RTコンポーネントも基本的には同様な振る舞いとなっておりますが、RTコンポーネント機能の実体が XXXImpl クラスに分離された関係から、コンポーネント生成時、コンポーネント初期化時のメッセージの送信先はXXXクラスへと変更となっております。
JavaRTcomponent1.png

JavaRTcomponent2.png

IDL用データ型と Java言語データ型の対応関係

CORBA IDL用データ型と Java言語データ型の対応関係を表3-2に示します。

表 3-2 データ型対応関係

CORBA IDL Java言語
short short
long int
float float
double double
long long long
long double double
char char
wchar char
octet byte
unsigned short short
unsigned long int
unsigned long long long
boolean boolean
string String
wstring String
any org.omg.CORBA.Any
void void

その他

Tips

Eclipse の自動起動の設定方法について

    • Windows の場合
      • 1.Eclipse プロジェクトのディレクトリーの中から「.project」ファイルを選択して右クリックします。表示されたコンテキストメニュー内から [プロパティ] を選択します。
        ※選択する Eclipse プロジェクトは任意のプロジェクトで構いません。


SelectProject.png
「.project」ファイルを選択

      • 2.表示された「プロパティ」画面の「全般」タブ内、中段にある「プログラム」行右側の [変更] ボタンをクリックします。
        Property.png
        アプリケーションの関連付けの変更
      • 3.表示された「ファイルを開くプログラムの選択」画面下側にある [参照] ボタンをクリックします。
        SelectApplication.png
        Eclipseを選択
      • 4.ファイル選択画面が表示されるので、自動起動を行う Eclipse がインストールされているディレクトリー内から「eclipse.exe」を選択します。
      • 5.「ファイルを開くプログラムの選択」画面、「プロパティ」 を [OK] ボタンをクリックして閉じます。
        ::以上の設定を行うことで、「.project」ファイルをダブルクリックすることで指定した Eclipse を自動起動することが可能となります。
        |
        :: 複数の Eclipse をインストールしている場合、ダブルクリック動作では上記操作で指定したバージョンの Eclipse が常に起動されますのでご注意ください。
        |
        ダブルクリックを行ったプロジェクトが、起動対象 Eclipse に設定された workspace 内に含まれない場合、起動された Eclipse のパッケージ・エクスプローラー内に表示されません。この場合は、対象プロジェクトを workspace 内にインポートするか、workspace の設定を変更してください。


        --Linuxの場合
         data オプションにて workspace を指定して Eclipse を起動することが可能です。
         > eclipse -data /home/devel/OpenRTM/workspace
        対象プロジェクトが含まれている workspace を指定してください。


        謝辞

 OpenRTM-aist-Java は、以下のライブラリを使用して開発されました。これらのプロジェクトの開発と設計にかかわった方々に感謝します。
  • Apache Commons CLI 1.1

This product includes software developed by The Apache Software Foundation (http://www.apache.org/ ).

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2159
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク