데이터포트 (기초편)

데이터포트란

데이터포트는 주로 연속적인 데이터를 RTC간에 주고받는하기 위한 포토입니다. 데이터를 다른 RTC에 송신하기 위한 데이터포트를 OutPort, 다른 RTC로부터 데이터 를 수신하기 위한 데이터포트를 InPort라고 부릅니다.「InPort」, 「OutPort」 를 정리해 「데이터포트 (DataPort)」라고 부르는 일이 있습니다.

dataport_ko.png
데이터포트 (InPort와 OutPort)

RTC는 여러가지 프로그램 언어로 기술할 수 있습니다.또, RT컨포넌트 는 네트워크상에 분산시키는 일도, 같은 노드상에 배치 , 혹은 같은 프로세스상에 둘 수도 있습니다.그리고, 양단의 RTC가 어떤 언어로 기술되고 있는지, 네트워크적으로 분산하고 있는 것에 관계없이, 데이터포트간의 데이터의 통신은 투과적으로 행해집니다.

RTC는 필요에 따라서 임의의 수의 데이터포트를 갖게할 수 있습니다.예를 들면, 센서로부터 데이터를 취득하는 컴퍼넌트를 만든다고 합니다.이 컨포넌트 는 적어도 하나의 센서 데이터를 출력하기 위한 OutPort가 필요하게 되는 것으로 구성됩니다.

혹은, 지정된 토크에 따라서, 모터를 구동하는 컴퍼넌트를 작성합니다. 이 컴퍼넌트는, 적어도 하나의 하나의 토크치 지령을 수 취하는 InPort가 필요하게 됩니다. 이러한 컴퍼넌트를 이용하고, 피드백 제어를 행하기 위한 제어기 (콘트롤러) 컴퍼넌트를 만든다고 한다면 센서 데이터를 받는 InPort, 지령치 (예를 들면 속도 지령)를 받는다 InPort, 토크치를 출력하는 OutPort의 각각이 필요하게 됩니다.

dataport_example_ko.png
센서, 콘트롤러, 모터와 데이터포트의 예

프로그램으로서 실제로 InPort와 OutPort를 이용하는 간단한 예를 보겠습니다.각 오브젝트는 각각 이하의 기능을 합니다.

  • encoderDevice: 하드웨어 (예를 들면 카운터 보드등 )를 제어해 엔코더로부터 현재의 각도를 읽어내기 위한 기능이 실장된 오브젝트.하드웨어 벤더가 그러한 라이브러리등을 제공하고 있지 않으면, 스스로 실장할 필요가 있다.
  • encoderData: OutPort 용으로 엔코더의 데이터를 보관 유지하는 변수.여기에서는, 엔코더의 값을을 보관 유지하는 data 라고 하는 필드 (구조체의 멤버)를 가지고 있는 것으로 한다.
  • encoderDataOut: OutPort 오브젝트.encoderData 오브젝트에 관련지을 수 있고 있다.

 // 엔코더 컴퍼넌트의 예
 encoderData.data = encoderDevice.read(); // 카운터로부터 현재가를 취득
 encoderDataOut.write();                  // OutPort 로부터 데이터가 나간다

1행째로는, encoderDevice 오브젝트의 read() 함수를 부르고, 엔코더 의 현재가를 읽어들이고 있습니다.읽힌 데이터는, encoderData 오브제 쿠트의 data 멤버에게 대입됩니다.OutPort 의 인스턴스이다 encoderDataOut 오브젝트는, write()가 불리면, encoderData 오브제 쿠트로부터 데이타를 뽑기 시작해, 접속되고 있는 InPort 에 데이터를 출력합니다.

한편, InPort를 가지는 모터 컴퍼넌트는, 이하와 같이 쓸 수 있습니다.

  • motorDevice: 하드웨어(예를 들면 모터 드라이버에 접속된 DA보드등 )를 제어해 모터 제어를하기 위한 오브젝트.벤더로부터 그러한 라이브러리가 제공되어 있지 않으면, 스스로 실장할 필요가 있다.
  • motorData: InPort 로부터 입력된 값을 보관 유지하는 변수.여기에서는, 엔코더의 값을을 보관 유지하는 data 라고 하는 필드(구조체의 멤버)를 가지고 있는 것으로 한다.
  • motorDataIn: InPort 오브젝트.motorData 오브젝트에 관련지을 수 있고 있다.

 // 모터 컴퍼넌트의 예
 if (motorDataIn.isNew() {
   motorData.data = motorDataIn.read(); // InPort로부터 데이터를 읽는다
   motorDevice.output(motorData.data);  // 모터 드라이버에 지령치를 출력
 }

1행째로는 우선 InPort에 데이터가 와있을지 확인하고 있습니다.데이터가 도 착용하고 있으면, motorDataIn 의 read() 함수를 부르고, InPort로부터 데이터를 motorData 의 data 멤버에게 읽어들이고 있습니다.다음에, 실제로 모터에 지령 값을 건네주기 위해, motorDevice 오브젝트의 output 함수를 호출하고 있습니다.

같이 InPort와 OutPort를 가지는 제어기 컴퍼넌트에서는 이하와 같이 되는 것으로 짊어진다.

 // 제어기 컴퍼넌트의 예
 if (positionDataIn.isNew() && referenceDataIn.isNew()) {
 
   positionDataIn.read();  // 위치 데이터를 InPort로부터 읽어들인다
   referenceDataIn.read(); // 속도 지령을 InPort로부터 읽어들인다
 
   // 제어 알고리즘에 따라서 모터에게 주는 토르크치를 계산
   torqueData.data = controller.calculate(positionData.data,
                                           referenceaData.data);
   torqueDataOut.write(); // 모터 토르크치를 OutPort로부터 출력
 }

가고 있는 것은, 각각 InPort, OutPort만의 경우와 그만큼 변화키 응의 것으로, 자세한 설명은 생략 합니다.상대의 RTC가 어느 언어로 쓰여져 있는지, 아 있어는, 네트워크상의 다른 노드상에 있는지 로컬에 있는지 등의 위 있어에 대해서는, RT컴퍼넌트 체제에 의해 은폐 되고 있으므로, 이와 같이 간단하게 데이터의 송수신을 실시할 수 있습니다.

변수의 형태

여기까지의 예에서는, 각 오브젝트의 선언이 나타나지 않기 때문에, C++나 Java등 형태가 있는 언어에 익숙해 있는 분은, 샘플 프로그램의 각 변수가 어떠한 형태 인가 신경이 쓰였을지도 모릅니다.

기본형

위의 예의 데이터 격납 변수로 상정하고 있던 것은, TimedDouble 라고 하는 데이터형 입니다.C/C++의 구조체로 쓰면, 거의 이하와 같은 구조체와 동등의 것입니다.

 struct Time
 {
   long int sec;
   long int usec;
 };
 
 struct TimedDouble
 {
   Time tm;
   double data;
 };

데이터포트의 형태에 관해서는, 이하와 같은 결정이나 특징이 있습니다.

  • 데이터포트에는 각각 특유의 형태가 있다.
  • 형태의 정의는 IDL(Interface Definition Language)라고 하는 언어비의존의 인터페이스 정의 언어에 의해서 정해져 있다.
  • 언어가 달라도, IDL 정의의 형태가 같으면 접속할 수 있다.
  • 형태가 다른 데이터포트끼리는 접속하지 못하고, 데이터의 송수신은 실시할 수 없다.

따라서, 상기의 예로, 엔코더, 제어기, 모터의 각 컴퍼넌트를 접속 하기 위해서는, 포토의 데이터형이 각각 TimedDouble 형 나오지 않으면 되어 선.

덧붙여 OpenRTM-aist 에서는, 디폴트로 이하와 같은 데이터포트형을 준비해 (이)라고 내려 특히 정의하는 일 없이 이용할 수 있습니다.이러한 디폴트 정의의 기본형에는 타임 스탬프 보관 유지용으로 tm 필드가 준비되어 있습니다.

형명 내용
TimedShort 타임 스탬프와 short int 형
TimedUShort 타임 스탬프와 unsigned short int 형
TimedLong 타임 스탬프와 long int 형
TimedULong 타임 스탬프와 unsigned long int 형
TimedFloat 타임 스탬프와 float 형
TimedDouble 타임 스탬프와 double 형
TimedString 타임 스탬프와 string 형
TimedWString 타임 스탬프와 wstring 형
TimedChar 타임 스탬프와 char 형
TimedWChar 타임 스탬프와 wchar 형
TimedOctet 타임 스탬프와 아르바이트형
TimedBool 타임 스탬프와 bool 형

이러한 쳐, TimedChar, TimedWChar, TimedOctet 는 너무 사용하는 장면은 없을지도 모릅니다.

IDL형으로부터 각 언어 고유에의 대응 관계를 매핑이라고 합니다.각각의 형태 (으)로부터 각 언어상의 형태에의 매핑은 CORBA의 언어 매핑 시방서 또는 「언어 매핑」의 장을 참조해 주세요.

조금 복잡한 데이터형

상기의 기본형에는, Seq 라고 하는 순서형으로 불리는 형태가 준비되어 있습니다. 이것은 간단하게 말하면 배열을 보관 유지할 수 있는 형태입니다.

 seqdata.length(10); // 배열을 10개분확보한다
 for (int i(0); i < seqdata.length(); ++i) // 인수 없음 length 는 길이를 돌려준다
 {
   seqdata[i] = i; // 대입한다
 }

C++에서는 이와 같이 이용할 수 있습니다.배열보다는 편리하고, STL의 vector (을)를 닮아 있습니다만, vector보다는 많이 저기능입니다.Java에서는 배열 전용의 홀더 클래스가 자동적으로 생성되어 이것을 이용할 수 있습니다.또, Python에서는, Python의 배열에 직접 매핑 됩니다.

방금전의 예에서는, 엔코더와 모터는 하나였지만, 실제의 로봇에서는 다 구의 자유도를 취급할 필요가 있습니다.그 때에, 각자사정 때마다 포토를 마련한다 의는, 통신 효율, 동기의 문제등에서 유리한 계책이 아닙니다.그러한 경우로 (은)는, 이러한 순서형을 이용하는 것으로, 복수의 데이터를 효율적으로 취급하는 와 (이)가 할 수 있습니다.

독자적인 데이터형

게다가 더 복잡한 데이터 구조를 취급하고 싶은 경우도 있습니다.그 경우는, 자 분에 데이터형을 정의하고, 데이터포트로 이용할 수도 있습니다.자세한 것은 「데이터포트(응용편)」를 참조해 주세요.

데이터포트의 접속

연결기

RTC가 가지는 InPort와 OutPort를 접속하려면 , RTSystemEditor 나 rtcshell 등 의 툴을 사용합니다.포토를 접속하면 OutPort로부터 송신된 데이터는, 네트워크등을 경유해 InPort에 의해서 수신됩니다.접속은, 시스템의 구조나 컴퍼넌트의 특성에 따르고, 이하와 같이 몇개의 종류를 선택 일이 생깁니다.

  • 데이터 플로우형
  • 인터페이스형
  • 예약 구독형
  • 데이터 송신 폴리시

인터페이스형

인터페이스형에서는, 데이터를 어느 프로토콜로 송수신 하는지를 지정 섬 .디폴트에서는, corba_cdr형이라고 하는 방법만 이용할 수 있게 되어 있어 통상은 이것을 이용하면 특히 문제 없습니다.다만, 시스템의 구성에 (이)라고는, 다른 인터페이스형을 이용하도록(듯이), 확장하는 것도 가능합니다.

cneter
인터페이스형

데이터 플로우형

데이터의 송수신의 방법에는, OutPort 가 InPort 에 데이터를 보내는 push 형의 것도 의와 반대로 InPort 로부터 OutPort 에 문의해 데이타를 뽑아 오는 pull 형 의 것이 있습니다.

push 형에서는, OutPort측의 컴퍼넌트의 주로 액티버티가 주체가 되어 데이터를 수신 측에 보냅니다.보내는 타이밍은 다음의 예약 구독형으로 손가락 정합니다.한편, pull 형에서는, InPort측의 컴퍼넌트의 주로 액티버티 하지만 주체가 되어 데이터를 수신 측에 보냅니다.데이터를 수신하는 타이밍은, InPort측이 read()를 읽은 시점됩니다.

cneter
데이터 플로우형

예약 구독형

예약 구독형은, 데이터 플로우형이 push 때에만 유효한 프로파 티입니다.디폴트에서는, 동기형 송신 방식의 flush, 및 비동기형 송신분 식의 new, periodic 의 3 종류가 제공되고 있습니다.

flush 형은 OutPort로부터 InPort에 데이터를 push 할 때, OutPort의 write 함수내 그리고 직접 데이터의 송신을 실시합니다.즉, write() 함수로부터 돌아왔을 때에는, InPort에 데이터가 도착해 있는 것이 보증됩니다.한편, 상대편의 InPort가 네트워크적으로 먼 장소에 있어, 통신에 시간이 걸리는 경우에는, write()로 긴 시간 기다리게 될 가능성이 있습니다.따라서, 예를 들면 액티버티의 논리를 리얼타임 실행하고 싶은 경우에는 flush 형에서는 문제가 생기는 경우가 있습니다.

new 형과 periodic 형에는, publisher 라고 하는 송신을 위한 스렛드가 접속마다 에 준비됩니다.이러한 타입에서는, OutPort 의 write() 함수를 부르면, 데이 타는 일단 버퍼에 기입 희귀 write() 함수는 곧바로 종료합니다.데이터의 열매 때의 송신은, publisher의 별스렛드가 실시합니다.

cneter
예약 구독형

new 형은 기입과 동시에 송신 기다려 하고 있는 publisher 에 대해서 시그널을 송 , 일으켜진 publisher 스렛드가 실제의 데이터 송신을 실시합니다.버퍼 에의 데이터의 기입 주기에 대해서, 데이터 송신 시간이 충분히 짧으면, flush 와 거의 같습니다만, 데이터 송신에 시간이 걸리는 경우에는, 반드시 방법 (이)라고의 데이터가 수신 측에 닿는 것은 아닌 것에 주의해 주세요.그렇게 말했다 의미로 new 형은 best effort적인 데이터 송신 방법입니다.

한편 periodic 형은, publisher 가 일정 주기에 버퍼로부터 데이타를 뽑아 내밀기 데이터 송신을 실시합니다.송신 주기는, 접속시에 외부로부터 줄 수 있습니다. 데이터 송신 주기에 비해, 데이터 송신 시간이 긴 경우, 송신 주기를 지켜지지 않는다 가능성이 있습니다.또, 데이터를 버퍼에 쓰는 주기 (액티버티 의 주기)와 버퍼로부터 데이타를 뽑기 시작해 송신하는 주기 (publisher 의 주 기), 및 후술 하는 데이터 송신 폴리시의 정합성을 고려하지 않으면, 정상적으로 버퍼 풀 상태 또는 밧파엔프티 상태를 일으킬 가능성 .이른바 , 생산자·소비자 문제를 고려할 필요가 있는 접속 타입에 .

데이터 송신 폴리시

예약 구독형이, new 또는 periodic 의 경우, OutPort 는 버퍼 (을)를 가집니다.데이터를 송신하는 타이밍으로, 버퍼에 모여 있는 데이터 (을)를 어떠한 방침으로 송신할까를 데이터 송신 폴리시라고 부릅니다.

데이터 송신 폴리시에 있어는, 버퍼에 보관 유지되고 있는 데이터를 모두 송신

 ''all'', 선입처이고 방식으로 한개씩 송신하는 ''fifo'', 버퍼에 보관 유지되어
(이)라고 있는 데이터를 몇개인가 걸러서 송신하는 skip, 그리고 최신치만 송신해, 외 데이터는 모두 버리게 되는 new의 4 종류가 있습니다.

폴리시명 의미
all 버퍼에 남아 있는 데이터를 모두 송신
fifo 선입처이고 방식으로, 데이터를 한개씩 송신
skip n 개 두어에 데이터를 송신해, 그 이외는 버린다
new 최신치만 송신해, 낡은 값은 버린다

예약 구독형을 new 나 periodic 등의 비동기형으로 했을 경우, 데이터의 생성 속도, 소비 속도, 한층 더 통신로의 대역폭을 사전에 추측한 데다가, 이것 들의 폴리시를 적절히 설정할 필요가 있습니다.

InPort프로그래밍

여기에서는 실제의 프로그램으로 데이터포트가 어떻게 사용되는지를 보고 삽니다.

InPort를 사용할 때 , 이하의 룰을 염두에 둔 위에프로그래밍 한다 일을 추천 합니다.

  • 데이터는 와있지 않을지도 모른다고 해 처리한다
  • 데이터는 올바르지 않을지도 모른다고 해 처리한다
  • 배열의 길이는 항상 변화할지도 모른다고 해 처리한다
  • 데이터는 도중부터 오지 않게 될지도 모른다고 해 처리한다

InPort 에 접속되는 OutPort 는 다른 노드의 RTC의 OutPort일지도 모릅니다. 포토는 접속되어 있지 않을지도 모르고, 데이터를 보내있어일지도 ‚돼 응.배열이 포함되는 데이터형의 경우, 배열의 길이는 다음의 데이터에서는 변화할까 도 알려지지 않습니다.또, 네트워크 접속이 끊어지거나 상대의 RTC가 정지해 섬 경우, 도중부터 데이터를 보내지 않게 될지도 모릅니다.

모듈화하는데 있어서, 가정이나 전제 조건을 줄여, 다른 요소에 의존하지 않아 게 만드는 것은 매우 중요하고, 이것에 의해서 재이용성이 높게 사용하기 쉽다 모듈이 될지가 바뀌어 와 버립니다.

그런데, InPort의 실제의 사용법을 보고 가기 전에, InPort의 구조를 설명합니다.

cneter
InPort의 구조

InPort 의 실체는 오브젝트입니다.C++에서는, 클래스 템플릿 InPort<T> 형태로서 정의되고 있습니다.T에는 데이터포트가 사용하는 데이터형이 들어갑니다. 아래의 예는, 샘플에 부속되어 있는 ConsoleOut 컴퍼넌트의 InPort 선언의 예입니다.InPort 가 TimedLong 형으로 선언되고 있는 것을 알 수 있습니다.

  TimedLong m_in;
  InPort<TimedLong> m_inIn;

선언이나 초기화는, RTCBuilder나 rtc-template를 사용하고 있으면 자동적으로 기술해 줍니다.InPort를 사용할 때 , InPort 오브젝트에 연결시킬 수 있었던 T 형태의 변수가 하나 정의됩니다.방금전의 예로, TimedLong 형의 m_in 라고 하는 것도 의가 그 변수입니다.이것을 InPort 변수라고 부릅니다.

InPort 와 InPort 변수는 초기화시에 관련지을 수 있어 InPort의 데이터 읽기관 수 read()를 부르면, InPort가 가지는 버퍼로부터 데이터가 하나 읽어내져서 InPort 변수에 카피됩니다.InPort 에 온 데이터를 사용할 때 이와 같이 InPort 변수를 개입시켜 이용합니다.

InPort 오브젝트

InPort 클래스 템플릿으로 정의되고 있는 함수를 이하의 겉(표)에 나타냅니다.

이것은 C++의 InPort 클래스의 함수입니다만, 다른 언어에 대해도 거의 동일한 이름으로 각 함수가 제공되고 있습니다.덧붙여 이러한 함수의 참조 설명서는, Windows 에서는, 「스타트」->「OpenRTM-aist」->「C++」->「documents」-> 「Class reference」에서 볼 수 있습니다.Linux 등에서는 문서가 이 스토르 되고 있으면, ${prefix}/share/OpenRTM-aist/docs/ClassReference 등으로부터 액세스 하는 것 하지만 할 수 있습니다.메뉴얼은 doxygen 형식에서 기술되고 있어 상부 메뉴의 「네 무스페이스」로부터 클래스 일람을 표시시켜, InPort를 참조해 주세요.

InPort (const char *name, DataType &value) constructor   
~InPort (void) 소멸자
const char * name () 포토 명칭을 취득한다.
bool isNew () 최신 데이터가 존재하는지 확인한다
bool isEmpty () 버퍼가 하늘인지 어떤지 확인한다
bool read () DataPort 로부터 값을 읽어낸다
void update () 바인드 된 T 형의 변수에 InPort 버퍼의 최신치를 읽어들인다
void operator>> (DataType &rhs) T 형의 데이터에 InPort 의 최신치 데이터를 읽어들인다
void setOnRead (OnRead< DataType > *on_read) InPort 버퍼에 데이터 읽기시의 콜백의 설정
void setOnReadConvert (OnReadConvert< DataType > *on_rconvert) InPort 버퍼에 데이터 읽기시의 콜백의 설정

주로 사용하는 함수는, isNew() 및 read() 함수가 됩니다.실제로 사용되어 (이)라고 있는 예를 보겠습니다.

 RTC::ReturnCode_t ConsoleOut::onExecute(RTC::UniqueId ec_id)
 {
   if (m_inIn.isNew())
     {
       m_inIn.read();
       std::cout << "Received: " << m_in.data << std::endl;
       std::cout << "TimeStamp: " << m_in.tm.sec << "[s] ";
       std::cout << m_in.tm.nsec << "[ns]" << std::endl;
     }
   return RTC::RTC_OK;
 }

m_inIn.isNew()로 데이터가 와있는지를 확인해, m_inIn.read()로 InPort 변수 m_in 에 데이터를 읽어들이고 있습니다.그 후, m_in의 내용을 cout 로 표시하며 있어 .

통상은, 이 예의 같게 InPort 의 데이터의 처리는, onExecute() 함수내에서 행 있어, InPort에 오는 데이터를 주기적으로 처리하도록(듯이) 프로그램 합니다.

다른 함수는 설명으로부터 곧바로 안다고 생각합니다만, 코르박크오브제크트섹 트 하는 함수 setOnRead 와 setOnRedConvert 에 대해서는, 응용편으로 재차 설명 합니다.

OutPort

OutPort는 InPort와 비교하면, 단지 자신이 데이터를 송낼 뿐입니다 것으로, 조금 간단하게 됩니다.

cneter
OutPort의 구조

구조는 InPort와 거의 같고, C++이면, OutPort는 T형의 형태 인수를 취하는 곳간 스텐프레이트가 되어 있습니다.T는 OutPort의 데이터형으로, 이 T가 같다 InPort에 대해서 밖에 데이터를 보낼 수 없습니다.OutPort도 InPort 같이, OutPort 변수와 함께 이용합니다.OutPort 변수에 데이터를 쓴 후, OutPort의 write() 함수를 부르면 데이터가 OutPort로부터 접속되고 있는 InPort에 배웅해집니다.

OutPort 오브젝트

OutPort 클래스 템플릿으로 정의되고 있는 함수를 이하의 겉(표)에 나타냅니다.

OutPort 에 대해서도 InPort 같이, 다른 언어에 대해도 거의 동일한 이름으로 각 관 수가 제공되고 있습니다.참조 설명서에 대해서도 InPort 같이, doxygen 의 「네임 스페이스」로부터OutPort를 봐 주세요.

OutPort (const char *name, DataType &value) constructor   
~OutPort (void) 소멸자
bool write (DataType &value) 데이터 기입
bool write () 데이터 기입
bool operator<< (DataType &value) 데이터 기입
DataPortStatus::Enum getStatus (int index) 특정의 연결기에의 써 스테이터스를 얻는다
DataPortStatusList getStatusList () 특정의 연결기에의 써 스테이터스 리스트를 얻는다
void setOnWrite (OnWrite< DataType > *on_write) OnWrite 콜백의 설정
void setOnWriteConvert (OnWriteConvert< DataType > *on_wconvert) OnWriteConvert 콜백의 설정

OutPort로 주로 사용하는 함수는 write()와 getStatusList()가 됩니다.

 RTC::ReturnCode_t ConsoleIn::onExecute(RTC::UniqueId ec_id)
 {
   std::cout << "Please input number: ";
   std::cin >> m_out.data;
   if (!m_outOut.write())
     {
       DataPortStatusList stat = m_outOut.getStatusList();
 
       for (size_t i(0), len(stat.size()); i < len; ++i)
         {
           if (stat[i] != PORT_OK)
             {
               std::cout << "Error in connector number " << i << std::endl;
             }
         }
     }
   return RTC::RTC_OK;
 }

우선, std::cin >> m_out.data 로 표준 입력으로부터 OutPort 에 데이터를 대입 섬 .그 후, m_outOut.write()로 데이터를 OutPort로부터 배웅하고 있습니다.려 치가 false 의 경우, 포토의 스테이터스를 조사해 어느 접속으로 에러가 일어나 있는지를 표시하고 있습니다.

데이터포트의 정리

여기에서는, 데이터포트 (InPort, OutPort)의 기본적인 개념과 사용법에 대해 해설했습니다.데이터포트의 선언은, RTCBuilder나 rtc-template로 가 간다 가, 실제로 어떻게 데이터를 주는지, 혹은 이용하는지에 개 있고는 컴퍼넌트 개발자가 기술할 필요가 있습니다.다만, 간단하게 사용 하는 것 뿐이라면, InPort에서는, isNew()와 read() 함수만, OutPort 에서는, write()와 getStatusList() 함수만 기억해 두면 충분하겠지요.

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

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

Choreonoid

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

OpenHRP3

動力学シミュレータ

OpenRTP

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

産総研RTC集

産総研が提供するRTC集

TORK

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

DAQ-Middleware

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