OpenRTM-aist-Java の動作に必要な環境は以下のとおりです。
環境 | 備考 |
Java Development Kit 5.0 (JDK 5) (http://java.sun.com/products/archive/j2se/5.0_14/index.html ) |
注意:Java1.4 では動作しません. |
ここでは、Java版 RTコンポーネントの開発を行う場合の手順をご紹介します。サンプルとして以下のような仕様のコンポーネントを取り上げます。
基本プロファイル | |
コンポーネント名 | 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(); };
: 「Output directory」欄にプロジェクトのディレクトリーを指定することにより、生成された各種ファイルがプロジェクトへ(自動的に)追加されることになります。|
※ サービスポートを定義している RTコンポーネントの場合、Rtctemplate が生成したファイルだけではエラーが表示されます。これは該当するファイルが、IDL ファイルから自動生成されるクラスを利用しているためです。これらのクラスはビルド実行時に自動生成されます。
※クラスパスが有効となる場所に、OpenRTM-aist-Java がインストールされていない場合、エラーが表示されます。この場合、プロジェクトのプロパティから OpenRTM-aist-Java のインストールフォルダー(ディレクトリー)を指定してください。
corba.nameservers: localhost naming.formats: %n.rtc
$ 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
> 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
Java版 RTコンポーネントのソースファイルと、各ファイル内で実行している概略機能との関係を図3-1に示します。また、比較のために C++版 RTコンポーネントおよび OpenRTM-aist-0.3用 Java版 RTコンポーネントの構成も併せて示します。
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(); |
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に示します。
データ型 | ホルダ・クラス |
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 クラスをご参照ください。
CORBA IDL用データ型と Java言語データ型の対応関係を表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 |
> eclipse -data /home/devel/OpenRTM/workspace
This product includes software developed by The Apache Software Foundation (http://www.apache.org/ ).