Download
latest Releases : 2.0.0-RELESE
2.0.0-RELESE | Download page |
Number of Projects
RT-Component | 153.5 |
RT-Middleware | 35 |
Tools | 22 |
Documentation | 2 |
Choreonoid
Motion editor/Dynamics simulator
OpenHRP3
Dynamics simulator
OpenRTP
Integrated Development Platform
AIST RTC collection
RT-Components collection by AIST
TORK
Tokyo Opensource Robotics Association
DAQ-Middleware
Middleware for DAQ (Data Aquisition) by KEK
데이터포트가 있는 컴포넌트
여기에서는, 데이터포트가 있는 컴포넌트를 두 개 작성해, 두 개의 컴포넌트간에 데이터의 송수신을 해보겠습니다. 작성하는 컴포넌트의 사양은 이하와 같습니다.
rtc-template에 의한 소스 생성
상기의 사양을 가지는 컴퍼넌트를 작성하기 위해 이하와 같은 셸 스크립트를 gen.sh라는 이름으로 준비합니다.
최초의 rtc-template의 실행으로 컴퍼넌트 1:ConsoleInComp, 다음의 rtc-template의 실행으로 컴퍼넌트 2:ConsoleOutComp가 작성됩니다.
ConsoleIn의 작성
생성된 소스를 편집하고, ConsoleIn 컴퍼포트를 작성해 갈 것입니다.
ConsoleIn.h
이 컴포넌트는 액티브 되었을 때에, 입력 대기를 실시해 입력된 값을 OutPort로부터 출력하는 컴포넌트입니다. 따라서, 액티브 상태 때에 루프 실행되는 onExecute 멤버 함수만 실행하면 좋기 때문에, 생성된 ConsoleIn.h를 이하와 같이 주석처리 되고 있는 onExecute 함수의 주석을 해제합니다.
또, ConsoleIn.h의 아래쪽에, rtc-template로 지정한 OutPort의 변수 선언이 있습니다.
TimedLong m_out라고 선언되고 있는 것이 OutPort에 바인드 되는 변수.
OutPort<TimedLong> m_outOut라고 선언되고 있는 것이 OutPort의 인스턴스입니다.
ConsoleIn.cpp
ConsoleIn의 작성은 간단합니다. 주석처리 되고 있는 onExecute의 주석을 해제해, 이하와 같이 작성합니다.
ConsoleOut의 작성
ConsoleOut 컴포넌트는 조금 복잡합니다. InPort에 들어 온 데이터에 컨피그레이션 파라메터 multiply에 의해 계산된 값을 저장하지 않으면 안됩니다. 이것은, InPort에 콜백 오브젝트를 세트 하는 방법으로 실현될 수 있습니다.
콜백 오브젝트
콜백 오브젝트란, InPort나 OutPort의 버퍼에 있는 이벤트가 발생했을 때에 불리는operator()가 정의된 오브젝트입니다. 이번은 InPort의 버퍼에 써질 때 값을 변환하기 위해 콜백 OnWriteConvert를 사용합니다.
RTC::OnWriteConvert를 계승해 이하와 같은 클래스를 정의합니다.
ConsoleOut.h
상기의 콜백 클래스를 ConsoleOut.h의 include의 행의 직후에 삽입합니다. 게다가 이 콜백 클래스의 인스턴스를 ConsoleOut 클래스의 멤버 변수로서 선언합니다. 장소는, private의 바로 아래로 합니다.
이 컴퍼넌트는 액티브화 되었을 때에 InPort로부터 데이터를 읽어들여 표준 출력에 데이터를 표시하는 컴퍼넌트입니다. 따라서, 액티브 상태때에 루프 실행되는 onExecute 멤버 함수만 실행하면 좋기 때문에 생성된 ConsoleOut.h를 이하와 같이 주석처리 되고 있는 onExecute 함수의 주석을 해제합니다.
또, ConsoleOut.h의 아래쪽에 rtc-template로 지정한 컨피그레이션 변수의 선언과 InPort의 변수 선언이 있습니다.
ConsoleOut에서는 InPort의 버퍼로서 RingBuffer를 사용하므로,RingBuffer.h를 인클루드 할 필요가 있습니다. ConsoleOut.h의 선두 부분을로 이하와 같이RingBuffer.h를 인클루드해 주십시오.
또, InPort의 선언 부분에서 디폴트에서는InPort<TimedLong> m_inIn되고 있는 곳을 InPort<TimedLong, RTC::RingBuffer> m_inIn와 같이 고쳐 쓰고, InPort가 RingBuffer를 사용하도록 변경해 주십시오.
int m_multiply라고 선언되고 있는 것이, 컨피그레이션 「multiply」에 바인드 되는 변수.
TimedLong m_in라고 선언되고 있는 것이, InPort에 바인드 되는 변수.
InPort<TimedLong> m_inIn라고 선언되고 있는 것이, InPort의 인스턴스입니다.ConsoleOut.cpp
ConsoleOut 클래스의 constructor로 방금전 정의한 Multiply의 인스턴스의 초기화를 추가합니다.
:「m_owc(m_multiply),dummy(0)」의 부분을 추가할 뿐만 아니라, 「m_inIn("in", m_in)」를 「m_inIn("in", m_in) ,」라고 변경해 주십시오 (콤마 「,」의 누락에 주의).|
게다가 콜백 오브젝트를 InPort에 추가하기 위해, constructor내에서 이하와 같이 기술합니다.
주석 처리되고 있는 onExecute의 주석을 해제해, 이하와 같이 작성합니다.
컴파일
작성이 끝나면 이하와 같이 소스를 컴파일 합니다.
compile error가 나왔을 경우는 스펠링 미스 등이 없는지 어떤지 체크해 재차 컴파일을 해주십시오.
실행
*적절한 rtc.conf란… 다음은 하나의 예입니다.
ConsoleIn를 실행한 터미널에서 Please input number: 라고 하는 표시가 나오므로, 적당한 숫자를 입력합니다.
ConsoleOut를 실행한 터미널에서는, 이하와 같이 표시될 것입니다.
다음에 RtcLink의 컨피그레이션뷰로 multiply의 값을 10으로 변경해 봅시다. 그러면, ConsoleIn로부터 상기와 같이 입력하면 각각 10배 된 값이 이하와 같이 출력될 것입니다.