rtコンポーネント作成(java版)

✏️ Edit this page on GitHub

#contents

概要

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 のライブラリへのパス(ベースパス)が設定されていること
  • で設定されるパスの直下のディレクトリー「jar」内にライブラリファイル OpenRTM-aist-0.4.x.jar と commons-cli-1.1.jar が存在すること(クラスパスとして設定するため)**※** : **※** [こちら ](/my-jekyll-site/ja/doc/faq/faq_rtc_creation#Antbuild)を参考に独自のクラスパスの設定も可能です。|


◆参考:

&aname(javacomp);

Java版RTコンポーネントの開発について

 ここでは、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 が起動します。(このとき「ようこそ」という画面が表示される場合がありますが、これは閉じます。)
図 2-2 新規の Workspace を指定


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


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

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


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

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


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


 表示された「新規 Java プロジェクト」画面において、生成するプロジェクトの各種設定を行い [終了] ボタンをクリックします。
図 2-6 プロジェクトの各種設定をして終了
 指定したプロジェクトが生成され、「パッケージ・エクスプローラービュー」内に表示されます。
図 2-7 パッケージエクスプローラビューの表示例



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

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



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

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


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



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

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



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

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


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

図 2-11 プロジェクト表示の更新


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


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

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


図 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 を違う場所にインストールしたなどの事情でクラスパスを任意の場所に設定してビルドするにはこちら を参照してください。
図 2-14 プロジェクトのビルド


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


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



作成した 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(リンク切れです)を起動しておきます。
  • 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コンポーネントがあらわれます。



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



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

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

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

図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クラス)を追加しています。そのため、データポートの定義および利用方法が以下のように変更されております。


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

サービスポート

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

コンフィギュレーション

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

コンフィギュレーション・データの使用方法につきましては、「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クラスへと変更となっております。



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 プロジェクトは任意のプロジェクトで構いません。


「.project」ファイルを選択
  • 2.表示された「プロパティ」画面の「全般」タブ内、中段にある「プログラム」行右側の [変更] ボタンをクリックします。
アプリケーションの関連付けの変更
  • 3.表示された「ファイルを開くプログラムの選択」画面下側にある [参照] ボタンをクリックします。
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/ ).