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 動作環境



 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 のプロジェクトから行うことも可能です。新しいワークスペースを指定して 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/ ).

最新バージョン

初めての方へ

Windows msi(インストーラ) パッケージ (サンプルの実行ができます。)

C++,Python,Java,
Toolsを含む
1.1.2-RELEASE

RTコンポーネントを開発するためには開発環境のインストールが必要です。詳細はダウンロードページ

統計

Webサイト統計
ユーザ数:1632
プロジェクト統計
RTコンポーネント286
RTミドルウエア21
ツール20
文書・仕様書1

Join our slack

Enter email address for slack invite.

旧Webサイト

OpenRTM.org旧Webサイト

OpenHRP3

動力学シミュレータ

Choreonoid

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

OpenHRI

対話制御コンポーネント群

OpenRTP

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

産総研RTC集

産総研が提供するRTC集

TORK

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

DAQ-Middleware

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

VirCA

遠隔空間同士を接続し、実験を行うことが可能な仮想空間プラットホーム