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), 뎁스(depth), 이미지 데이터, 각 멤버를 가지는 데이터형을 사용하고 싶다고 한다면, 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

옵션으로 파일을 지정해 주십시오.
이것으로 이 데이터형을 이용해 컴퍼넌트 간 통신을 할 수 있게 됩니다.


데이터 포트로 약 2 MB이상의 데이터를 보내고 싶다.

화상 데이터등을 데이터포트로 보낼 때, 1회에 주어지는 데이터 사이즈 약 2 MB를 넘는 경우에는 주의가 필요합니다.
omniORB에서는 giop(General Inter-ORB Protocol)로 취급할 수 있는 사이즈는 디폴트로 "2097152B(2MB)"로 되어 있습니다.
이 사이즈를 넘는 데이터를 한번에 보내려고 하면 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_ko.png
신규 Java 프로젝트의 다이얼로그(JDK의 선택이 없는 경우)
RTCBuilder를 이용해, Java로 RT컴포넌트 작성 하는 프로젝트에서는 이 다이얼로그에서 지정하는 JRE(Java 실행 환경)을 JDK내에 포함되어 있는 JRE로 할 필요가 있습니다. 이대로는 JDK내의 JRE의 선택 방법이 없기 때문에 이하의 순서에 따라 선택 가능하도록 설정을 변경합니다. 위의 그림과 같이 JRE프레임 내의「Configure JREs...」를 클릭합니다.(또는 일단 이 다이얼로그를 Cancle해서 Eclipse의 메인 메뉴의 [Window]→[Proferences]→「Proferences」다이얼로그의 좌측 트리 부분에서 「Java」-「Installed JREs」를 선택합니다.)



new_JRE_setting_ko.png
Installed JREs의 다이얼로그(JDK의 표시는 아직 없음)


오른쪽 상단의 「Add」버튼을 누릅니다.



add_JRE_VM_setting_ko.png
JRE Type의 선택 다이얼로그

Standard VM을 선택하고 「Next」버튼을 눌러,(JDK내의)JRE를 선택하기 위한 다이얼로그(아래의 그림)를 표시합니다.

add_JRE_ko.png
Add JRE의 추가 다이얼로그


「Directory」버튼을 눌러 JDK6까지의 경로까지 갑니다.(참고:통상, JDK6의 경로는 C:\Program Files\Java\jdk1.6.0_XX)



select_JDK_ko.png
JDK6의 경로까지 가서,「Add JRE」다이얼로그에 JDK를 참조시킵니다.


JDK까지의 경로 참조에 성공하면, 「Add JRE」다이얼로그가 아래의 그림과 같이 되기 때문에 「OK」버튼을 눌러 이 다이얼로그를 종료합니다.



load_JDK_ko.png
JDK6의 경로 참조에 성공



「Installed JREs」다이얼로그에 돌아가기 때문에(JDK가 추가된 상태로), 아래 그림과 같이 활성화 된 JRE의 체크를 JDK로 옮겨 「OK」버튼을 누릅니다.



set_active_JDK_ko.png
「Installed JREs」다이얼로그에 JDK가 추가되기 때문에 체크를 JDK로 변경

「New Java Project」의 다이얼로그에서 JDK가 선택 가능하게 됩니다.



SelectJDKasJRE_ko.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의 통상 좌측 뷰「Package Explorer」에서 build_<CompName>.xml를 마우스 오른쪽 클릭해서 [Run As]→[Ant Build...]를 선택합니다.



Call_Ant_Setting_ko.png
Ant 설정 다이얼로그를 호출



클래스 패스의 설정
Ant의 설정 다이얼로그가 표시되면, 「Classpath」탭을 선택한다.



Ant_Setting_Classpath_ko.png
「Classpath」탭을 선택한다.

「User Entries」를 선택한 후 「Add External JARs...」버튼을 누른다.



Ant_External_Jar_ko.png
외부 JAR의 추가


「Jar Selection」다이얼로그가 표시되면 목적 JAR라이브러리까지 경로를 지정한다. 결과, 아래 그림과 같이 추가 된 JAR라이브러리가 Ant의 설정 다이얼로그에 표시된다.



Ant_Add_Jar_ko.png
추가 된 JAR



유의점
환경 변수 RTM_JAVA_ROOT는 반드시 설정해야 합니다.(단, 더미도 가능) 클래스 패스를 임의로 지정하는 것으로, 만약 RTM_JAVA_ROOT의 설정이 불필요해졌다고 해도 그 설정을 삭제하거나 설정 그 자체를 하지않거나 하면 빌드시에 에라가 발생합니다. 또, RTM_JAVA_ROOT가 가리키는 경로는 (비어있어도 상관없음)반드시 「jar」이라는 이름의 폴더가 존재해야 합니다.

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2210
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

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

OpenHRP3

動力学シミュレータ

OpenRTP

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

産総研RTC集

産総研が提供するRTC集

TORK

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

DAQ-Middleware

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