//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);
//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);
概要
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 の動作に必要な環境は以下のとおりです。
(http://java.sun.com/products/archive/j2se/5.0_14/index.html )
OpenRTM-aist-Java のインストール方法の詳細につきましては、「OpenRTM-aist-Java インストールマニュアル(UNIX)」あるいは「OpenRTM-aist-Java インストールマニュアル(Windows)」を参照してください。特に、次のことを確認してから以下の作業に移ってください。
◆参考:
Java版RTコンポーネントの開発について
ここでは、Java版 RTコンポーネントの開発を行う場合の手順をご紹介します。サンプルとして以下のような仕様のコンポーネントを取り上げます。
※ MyService.idl は適当なエディタを用いて以下のような IDL ファイルを作成します。また、上の表中の「IDLパス」はMyService.idl のパスを記述します。Windowsの場合は、この「IDLパス」が 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 のメニューバーの [プロジェクト] > [自動的にビルド] がオンになっている場合は、チェックをはずし無効にしておいた方がいいでしょう。
※ プロジェクトの作成時の各種オプション、設定など Eclipse に関する詳細は、Eclipse のサイト(http://www.eclipse.org/ )などを参照してください。
RtcTemplate を利用したスケルトン・コードの生成
RtcTemplate のエディタ画面を起動します。
GUI版の RtcTemplate を使用して''表2-1'' の仕様を持つ RTコンポーネントのスケルトン・コードを生成させる場合の設定を以下に示します。
:注:Windowsの場合、上記 「Output directory」 や「IDL path:」などはフルパスで記述すること。|
[Generate] ボタンをクリックし、コード生成を実行する。このとき必ず、RtcTemplate エディタ最下段の 「Output directory」 欄に、先に生成したプロジェクトのディレクトリーを指定すること(※ 図 2-8では「temp」となっている)。
「Output directory」として指定したディレクトリーに以下のファイルが生成されます。
: 「Output directory」欄にプロジェクトのディレクトリーを指定することにより、生成された各種ファイルがプロジェクトへ(自動的に)追加されることになります。|
※ サービスポートを定義している RTコンポーネントの場合、Rtctemplate が生成したファイルだけではエラーが表示されます。これは該当するファイルが、IDL ファイルから自動生成されるクラスを利用しているためです。これらのクラスはビルド実行時に自動生成されます。
※クラスパスが有効となる場所に、OpenRTM-aist-Java がインストールされていない場合、エラーが表示されます。この場合、プロジェクトのプロパティから OpenRTM-aist-Java のインストールフォルダー(ディレクトリー)を指定してください。
RtcTemplate エディタ上の「IDL path:」で指定したIDLファイルを、生成されたJavaソースコードが配置される「Output directory」に手動でコピーします。
Eclipseを用いたビルド
パッケージ・エクスプローラー内の build_Sample.xml を右クリックし、表示されるコンテキストメニュー中から [実行] > [Antビルド] を選択することで、対象 RTコンポーネントのビルドを行うことが可能です。自作の jar ライブラリ等を使う必要があったり、OpenRTM-aist を違う場所にインストールしたなどの事情でクラスパスを任意の場所に設定してビルドするにはこちら を参照してください。
:参考:|
作成した RTコンポーネントの実行
プロジェクト内の「classes」に以下のような内容のファイル rtc.conf を作成しておきます。
-ネームサーバーと RtcLink の起動
OpenRTM-aist-0.4-Java に付属のツールで「bin」ディレクトリー内にある start-orbd.vbs をダブルクリック(Windows)し、あるいは、start-orbd.sh を実行(UNIX)し、ネームサーバーを起動しておきます。また、RtcLinkを起動しておきます。
-RTコンポーネントの実行
コマンドプロンプトあるいはターミナルを起動して、前述「classes」ディレクトリーをカレントとします。
--UNIX系システムの場合
Java版 RTコンポーネントの詳細
Java版 RTコンポーネントの構成
Java版 RTコンポーネントのソースファイルと、各ファイル内で実行している概略機能との関係を図3-1に示します。また、比較のために C++版 RTコンポーネントおよび OpenRTM-aist-0.3用 Java版 RTコンポーネントの構成も併せて示します。
既存の C++版 RTコンポーネントと Java版 RTコンポーネントを比較した場合、以下の点が異なります。
Java版 RTコンポーネントと C++版コンポーネントの相違点
データポート
OpenRTM-aist-Java では、データの受け渡しを行うためにホルダクラス(DataRefクラス)を追加しています。そのため、データポートの定義および利用方法が以下のように変更されております。
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;
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;
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();
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」のサンプルをご覧ください。
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]);
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());
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);
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);
コンフィギュレーション
データポートの場合と同様、コンフィギュレーションを利用する場合もデータの受け渡しのためにホルダクラスを利用しています。このため、コンフィギュレーション・データの定義、利用方法が以下のように変更されております。
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”);
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に示します。
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に示します。
その他
Tips
Eclipse の自動起動の設定方法について
※選択する Eclipse プロジェクトは任意のプロジェクトで構いません。
- 4.ファイル選択画面が表示されるので、自動起動を行う Eclipse がインストールされているディレクトリー内から「eclipse.exe」を選択します。
- 5.「ファイルを開くプログラムの選択」画面、「プロパティ」 を [OK] ボタンをクリックして閉じます。
- ※ ダブルクリックを行ったプロジェクトが、起動対象 Eclipse に設定された workspace 内に含まれない場合、起動された Eclipse のパッケージ・エクスプローラー内に表示されません。この場合は、対象プロジェクトを workspace 内にインポートするか、workspace の設定を変更してください。
- 対象プロジェクトが含まれている workspace を指定してください。
OpenRTM-aist-Java は、以下のライブラリを使用して開発されました。これらのプロジェクトの開発と設計にかかわった方々に感謝します。::以上の設定を行うことで、「.project」ファイルをダブルクリックすることで指定した Eclipse を自動起動することが可能となります。
|
::※ 複数の Eclipse をインストールしている場合、ダブルクリック動作では上記操作で指定したバージョンの Eclipse が常に起動されますのでご注意ください。
|
--Linuxの場合
data オプションにて workspace を指定して Eclipse を起動することが可能です。
謝辞
This product includes software developed by The Apache Software Foundation (http://www.apache.org/ ).