ダウンロード
最新バージョン : 2.1.0-RELESE
| 2.1.0-RELESE | ダウンロードページ |
OpenRTM@Github
OpenRTM-aist GitHubサイト
ROS
Robot Operating System
Choreonoid
モーションエディタ/シミュレータ
DAQ-Middleware
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
| 2.1.0-RELESE | ダウンロードページ |
OpenRTM-aist GitHubサイト
Robot Operating System
モーションエディタ/シミュレータ
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
産総研が提供するRTC集
東京オープンソースロボティクス協会
개요
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에의 전체 경로가 아니면 안됩니다.
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은 OpenRTM-aist-0.4-Java에 부속되는 샘플의 「examples/Java/RTMExamples/SimpleService」디렉토리내에 있는 것과 동일합니다.
GUI를 이용했을 경우 RT컴포넌트의 개발 순서
GUI 툴인 RtcTemlate를 이용하고, RT컴포넌트를 개발 순서를 설명합니다. RtcTemplate의 상세한 것에 대하여는RtcLink·RtcTemplate의 인스톨 및RtcTemplate를 참조해 주십시오.RtcTemplate와 JDT의 연계
상부 메뉴로부터「File」-「New」-「Project」를 선택합니다.
: 「New Project」위저드의 다음의 스텝에서 작성하는「프로젝트명」을 입력합니다.「JDK 준거」그룹내의 설정이「5.0」이상(혹은 1.5이상)이 설정 되고 있는 것을 확인한 다음,「Next」버튼을 누릅니다(그림 2-5). 한편, 환경에 따라서는 「JDK 준거」프레임이 「JRE」프레임이 되고 있어 풀다운 메뉴로부터 JDK5(혹은 JDK1.5)가 선택할 수 없는 경우가 있습니다(그림 2-5'). 그 경우는 여기 를 참조해 JDK를 선택할 수 있도록 합니다.|
-자동 빌드를 무효
Eclipse의 도구 모음의 [Project]→[Build Automatically]가 설정 되어 있는 경우는, 체크를 무효로 해두는 것이 좋습니다.
※프로젝트 작성시의 각종 옵션, 설정 등 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에서 마우스 오른쪽 버튼을 클릭해 표시되는 context menu나 「Run」-「Ant Build」를 선택하는 것으로 대상 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컴포넌트의 실행
커멘드 prompt 혹은 터미널을 기동하고, 앞에서 설명한「classes」디렉토리를 현재 디렉토리로 합니다.
--UNIX계 시스템의 경우
Java버전 RT컴포넌트의 상세
Java버전 RT컴포넌트의 구성
Java버전 RT컴포넌트의 소스 파일과 각 파일내에서 실행하고 있는 개략 기능과의 관계를 그림 3-1에 나타냅니다. 또, 비교를 위해서 C++버전 RT컴포넌트 및 OpenRTM-aist-0.3용 Java버전 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 클래스)를 추가하고 있습니다. 그 때문에 데이터 포트의 정의 및 이용 방법이 이하와 같이 변경되고 있습니다.
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 클래스로 변경이 되고 있습니다.#ref(JavaRTcomponent2.png,nolink,center)
IDL용 데이터형과 Java언어 데이터형의 대응 관계
CORBA IDL용 데이터형과 Java 언어 데이터형의 대응 관계를 표 3-2에 나타냅니다.
그 외
Tips
Eclipse의 자동 기동의 설정 방법에 대해
※선택하는 Eclipse 프로젝트는 임의의 프로젝트로 다른 프로젝트의 「.project」파일로 해도 됩니다.
- 4. 파일 선택 화면이 표시되므로, 자동 기동을 실시하는 Eclipse가 인스톨 되고 있는 디렉토리내로부터「eclipse.exe」를 선택
- 5.「연결 프로그램」화면,「속성」을「OK」버튼을 클릭해 닫는다
- ※더블 클릭을 실시한 프로젝트가 기동 대상 Eclipse로 설정된 workspace내에 포함되지 않는 경우, 기동된 Eclipse의 Package Exploer내에 표시되지 않습니다. 이 경우는, 대상 프로젝트를 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/ ).