RTコンポーネント作成について

RTコンポーネント作成に関するFAQをまとめました。

RTコンポーネントのインスタンス命名規則は

RTコンポーネントのインスタンス命名規則は、
[RTコンポーネントtype名]+[数字 (0,1,2,3...)]
のようになっています。
RTコンポーネントtype名は、rtc-templateで--type-nameオプションで指定した名前、もしくは、コンポーネントプロファイル(通常は*.cppファイルの先頭に記述)"type_name"に指定されている名前です。
番号は、同一マネージャ上で生成されたコンポーネントに対して、0,1,2,3...のような連番を振ります。

同一のコンポーネントが別プロセスで複数起動された場合には、インスタンスの番号はそれぞれ0から始まるので、同一の名前のコンポーネントが複数起動されたことになります。
場合によっては、ネームサービスに同一の名前として複数のコンポーネントが登録されることになり、前に登録されたものは後で登録されたもので上書きされます。

これを回避するには、
同一プロセスで複数のコンポーネントを起動させる
rtc.confのnaming.formatsオプションでそれぞれ衝突しない名前フォーマットを指定する
などの方法があります。

標準以外のデータ型をInPort/OutPortで使うには

通常OpenRTM-aistでは rtm/idl/BasicDataType.idl で定義されている TimedShort, TimedLong, TimedUShort, TimedULong, TimedFloat, TimedDouble, TimedChar, TimedBoolean, TimedOctet, TimedString, TimedShortSeq, TimedLongSeq, TimedUShortSeq, TimedULongSeq, TimedFloatSeq, TimedDoubleSeq, TimedCharSeq, TimedBooleanSeq, TimedOctetSeq, TimedStringSeq の20種類のデータ型をInPortおよびOutPortのデータ型として使用することが出来ます。

これ以外のデータ型を定義しInPort/OutPortで使用したい場合は、そのデータ型をIDLで定義し、コンポーネントをコンパイルするときに同時にコンパイル・リンクする必要があります。

仮に画像を格納するため、サイズ(width, height)、デプス、イメージデータ、各メンバを持つデータ型を使用したいとします。IDLではこのデータ型を以下のように定義します。
 #include <BasicDataType.idl>
 module RTC
 {
   struct TimedImage
   {
     Time tm;
     long width;
     long height;
     long depth;
     sequence<octet> data;
   };
 };
Time型はOpenRTMで定義されているタイムスタンプのための型です。無くても構いませんが、含めておいたほうが良いでしょう。
これをTimedImage.idlとして、ファイルに保存します。

このファイルをコンポーネントを作成するディレクトリにおきます。
次に、rtc-templateでコンポーネントを作成します。その際に、このIDLファイルを--consumer-idlオプションに指定します。
 rtc-template -bcxx    --module-name=ConsoleIn --module-type='DataFlowComponent'    --module-desc='Console input component'    --module-version=1.0 --module-vendor='Noriaki Ando, AIST'    --module-category=example    --module-comp-type=DataFlowComponent --module-act-type=SPORADIC    --module-max-inst=10 --outport=out:TimedImage    --consumer-idl=TimedImage.idl
この例では、TimedImage.idlで定義したTimedImage型をOutPortのデータ型として用いています。生成されたコードをコンパイルします。
 make -f Makefile.ConsoleIn
これで、TimedImage.idlがIDLコンパイラでコンパイルされ、スタブが生成されると共に、コンポーネントにリンクされます。
コンポーネント内でのデータの使用方法は通常のものと同じです。
これと同じデータ型を他のコンポーネントでも使用したい場合は、このIDLファイルだけコピーして、同様にrtc-templateの--consumer-idlオプションでファイルを指定してください。
これで、このデータ型を用いてコンポーネント間で通信できるようになります。

データポートで約2MB以上のデータを送りたい

画像データなどをデータポートで送る際、1回に贈られるのデータサイズ約2MBを超える場合には注意が必要です。
omniORBでは、giop(General Inter-ORB Protocol)で扱えるサイズはデフォルトで"2097152B(2MB)"となっています。
このサイズを超えるデータを1回に送ろうとすると、giopの制限のため正しいデータを送ることができません。
この最大サイズを変更するためには、下記の2つの方法があります。
rtc.confにて最大サイズを指定する。
 # file: rtc.conf
 corba.nameservers: localhost
 naming.formats: %n.rtc
 corba.args: -ORBgiopMaxMsgSize 3145728 # この行を追加
                                          # Maxサイズを3Mに指定
環境変数にて指定する場合
  export ORBgiopMaxMsgSize=3145728
※ giopMaxMsgSizeを指定する場合、server,client共(対になるコンポーネント)に設定する必要があります。

(omniORB configuration and API) http://omniorb.sourceforge.net/omni41/omniORB/omniORB004.html

新規JavaプロジェクトがJDK6(1.6)準拠として作成できない

新規プロジェクトでJavaプロジェクトを作成しようとすると、次のようなダイアログが表示されて、JDK準拠が選択できないことがあります。
new_project_name_ja.png
新規Javaプロジェクトのダイアログ(JDKの選択がない場合)
RTCBuilderを利用し、JavaでRTコンポーネント作成するプロジェクトでは、このダイアログにおいて指定するJRE(Java実行環境)をJDK内に含まれているJREとする必要があります。このままではJDK内のJREを選択のしようがないので、以下の手順に従い選択可能となるように設定を変更します。上図のようにJREフレーム内の「JREを構成...」リンクをクリックします。(あるいは、一旦このダイアログをキャンセルしてEclipseのメニューバーの[ウィンドウ]→[設定]→「設定」ダイアログの左のツリー部分から「Java」の下の「インストール済みのJRE」を選択します。)



new_JRE_setting_ja.png
インストール済みのJREのダイアログ(JDKの表示はまだない)


右上の「追加」ボタンを押します。



new_JRE_VM_setting_ja.png
JREの型の選択のダイアログ

標準VMを選択して「次へ」ボタンを押し、(JDK内の)JREを追加するためのダイアログ(下図)を表示させます。

add_JRE_ja.png
JREの追加ダイアログ


「ディレクトリ」ボタンを押して、JDK6までのパスをひいてきます。(参考:通常、JDK6のパスはC:\Program Files\Java\jdk1.6.0_XX)



select_JDK_ja.png
JDK6までのパスをひいて、「JREの追加」ダイアログにJDKを参照させる


JDKまでのパスの参照に成功すると、「JREの追加」ダイアログが下図のようになりますので、「OK」ボタンを押してこのダイアログを終了します。



load_JDK_ja.png
JDK6のパス参照に成功



「インストール済みのJRE」ダイアログに戻ってくるので(JDKが追加された状態で)、下図のようにアクティブとするJREのチェックをJDKの方に移し、「OK」ボタンを押します。



set_active_JDK_ja.png
「インストール済みのJRE」ダイアログにJDKが追加されているので、アクティブチェックをJDKに変更

「新規Javaプロジェクト」のダイアログでJDKが選択できるようになります。



SelectJDKasJRE_ja.png
「JRE」としてJDK内のJREで構成するように指定する




任意のフォルダにクラスパスを設定してAntビルドを行う方法は?

環境変数RTM_JAVA_ROOTにOpenRTM-aist(Java版)ライブラリ「OpenRTM-aist-X.X.X.jar」(X.X.Xはバージョンです。)が存在するフォルダ「jar」へのパスのベースパス(親フォルダまでのパス)を設定し、それをクラスパスの設定に用いることで、OpenRTM-aist(Java版)はRTCBuilderでのコード生成とAntでのビルド実行の連携を築いています。したがって、RTM_JAVA_ROOTはOpenRTM-aist(Java版)のライブラリフォルダへのパス(のベースパス)を必ず保持していなければならないわけです。ところが、RTM_JAVA_ROOTはその名の示すとおり、本来OpenRTM-aist(Java版)のインストール場所を指すものなので、結果OpenRTM-aist(Java版)のライブラリと他のコンポーネント(ドキュメント・サンプル・ユーティリティツール類)は常にそのフォルダ構造を保っていなければならないことになります。

環境変数RTM_JAVA_ROOTをクラスパス設定専用に使う方法も考えられます。OpenRTM-aist(Java版)のライブラリフォルダを自由な位置に配置し、それに合わせてRTM_JAVA_ROOT設定するという使い方もできるでしょう。ただし、この場合は、「環境変数RTM_JAVA_ROOTをライブラリへのクラスパスの用途以外には使用していない」という保証が必要です。

そこで、何らの事情でRTM_JAVA_ROOTが指示しているところとは別のところにクラスパスを設定したい場合のために、クラスパスをどのように設定したらよいのかをここで説明します。
EclipseのAnt設定ダイアログを呼び出す
Eclipseの通常左のビュー「パッケージ・エクスプローラー」からbuild_<CompName>.xmlを右クリックして、[実行]→[Antビルド...]を選択する。



Call_Ant_Setting_ja.png
Ant設定ダイアログを呼び出す



クラスパスの設定
Antの設定ダイアログが表示されるので、「クラスパス」タグを選択する。



Ant_Setting_Classpath_ja.png
「クラスパス」タグを選択する

「ユーザーエントリ」を一度選択し、その後「外部JARの追加」ボタンを押す。



Ant_External_Jar_ja.png
外部JARの追加


「JARの選択」ダイアログが現れたら、目的のJARライブラリまでのパスを指定する。結果、下図のように追加したJARライブラリがAntの設定ダイアログに表示される。



Ant_Add_Jar_ja.png
追加されたJAR



重要な留意点
環境変数RTM_JAVA_ROOTは必ず設定しなければなりません(ただし、ダミーでも可)。クラスパスを任意に指定することで、たとえRTM_JAVA_ROOTの設定が不要となったとしても、その設定削除をしたり、設定そのものをしなかったりするとビルド時にエラーとなります。また、RTM_JAVA_ROOTが指し示すパスの先には(空でもいいので)必ず「jar」という名前のフォルダが実在していなければなりません。

最新バージョン

初めての方へ

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

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

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

統計

Webサイト統計
ユーザ数:1620
プロジェクト統計
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

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