Skip to content

IndyDCP3

IndyDCP3는 gRPC를 사용하는 원격 프로시저 호출(RPC) 프로토콜입니다. HTTP/2 기반의 높은 성능, 빠른 통신속도를 가지고 있으며 언어 중립성 특성으로 다양한 언어에서 쉽게 개발될 수 있습니다. 또한 양방향 스트리밍과 비동기 통신을 지원하여 이를 활용한 다양한 어플리케이션 구현 할 수 있습니다.

Note

통신 속도는 클라이언트와 서버 간의 네트워크의 지연 시간, 메시지의 크기, 시스템의 처리 능력 등에 따라 달라집니다. 실제 통신 속도는 애플리케이션의 요구 사항과 리소스 한계에 따라 결정됩니다. IndyDCP3의 경우 가장 기본적인 로봇 상태 메시지 응답 (예를들어 관절 각도 수신)에 대해서 네트워크 유선 연결 시 평균 지연속도는 약 2ms 정도입니다.

IndyDCP3에 대한 PythonC++ 클라이언트의 경우 뉴로메카에서 공식적으로 제공하기 때문에 아래 링크를 통해 바로 사용이 가능합니다. 이를 제외한 개발 언어에 대해서는 본 장의 나머지 문서를 참고해주시기 바랍니다.

Protobuf를 이용한 IndyDCP3 클라이언트 개발

본 장에서는 Protobuf를 이용하여 다양한 개발 언어에 대한 IndyDCP3 (gRPC) 클라이언트 구현방법을 설명합니다.

Protobuf

Protocol Buffers (Protobuf)는 구조화된 데이터를 효율적으로 직렬화하는 구글의 언어 중립적인 데이터 형식입니다. gRPC는 Protobuf를 기본적으로 사용하여 클라이언트와 서버 간에 데이터를 교환합니다.

Protobuf 설치

Protobuf 컴파일러 (protoc)를 설치하여 .proto 파일을 컴파일할 수 있습니다. 다양한 운영 체제에 대한 설치 지침은 Protocol Buffers GitHub 페이지를 참조하세요.

.proto 파일 정의

  • .proto 파일에서 데이터 구조(message)와 서비스 인터페이스를 정의합니다.
  • 메시지는 필드 타입, 이름, 고유 번호로 구성됩니다.
  • 서비스는 RPC 메소드와 요청/응답 메시지 타입을 정의합니다.
syntax = "proto3";

package example;

// 메시지 정의
message MyMessage {
  int32 id = 1;
  string name = 2;
  repeated string values = 3;
}

// 서비스 정의
service MyService {
  rpc MyMethod(MyMessage) returns (MyMessage);
}

.proto 파일 컴파일

  • protoc 컴파일러를 사용하여 .proto 파일을 특정 프로그래밍 언어용 코드로 변환합니다.
  • 예시: protoc --java_out=. my.proto

gRPC 클라이언트 구현

  • 생성된 코드를 사용하여 gRPC 클라이언트를 구현합니다.
  • 서버는 정의된 서비스 인터페이스를 구현하고 (IndyDCP3 서버), 클라이언트는 이 인터페이스를 통해 서버에 요청을 보냅니다.

메시지 교환

  • 클라이언트는 정의된 Protobuf 메시지 형식을 사용하여 데이터를 서버에 전송합니다.
  • 서버는 이 데이터를 수신하고, 필요한 작업을 수행한 후 응답을 클라이언트에 반환합니다.

추가 자료

이 매뉴얼은 gRPC와 Protobuf 사용의 기본 개념과 절차를 소개합니다. 실제 구현에는 각 프로그래밍 언어와 프레임워크에 맞는 추가적인 단계와 고려사항이 있을 수 있습니다.

IndyDCP3의 Protobuf

아래는 IndyDCP3가 사용하는 protobuf 정의의 일부를 요약한 것입니다.

서비스 RPC 함수명 요청 메시지 반환 메시지 설명
Control GetControlInfo Empty ControlInfo 로봇의 제어 정보를 조회합니다.
MoveJ MoveJReq Response 관절 공간에서 로봇을 지정된 위치로 이동시킵니다.
MoveJT MoveJTReq Response 시간을 지정하여 관절 공간에서 로봇을 이동시킵니다.
MoveL MoveLReq Response 작업 공간에서 로봇을 지정된 위치로 이동시킵니다.
MoveLT MoveLTReq Response 시간을 지정하여 작업 공간에서 로봇을 이동시킵니다.
MoveC MoveCReq Response 작업 공간에서 원형 경로로 로봇을 이동시킵니다.
MoveCT MoveCTReq Response 시간을 지정하여 원형 경로로 로봇을 이동시킵니다.
WaitIO WaitIOReq Response 지정된 I/O 신호를 기다립니다.
WaitTime WaitTimeReq Response 지정된 시간만큼 대기합니다.
WaitProgress WaitProgressReq Response 진행 상태를 기다립니다.
WaitTraj WaitTrajReq Response 궤도 이동을 완료할 때까지 기다립니다.
WaitRadius WaitRadiusReq Response 지정된 반경 내로 이동을 완료할 때까지 기다립니다.
MoveJCond MoveJCondReq Response 조건부로 관절 공간에서 로봇을 이동시킵니다.
... ... ... ...
Device SetBrakes MotorList Response 모터의 브레이크 설정을 변경합니다.
SetServoAll State Response 모든 서보의 상태를 설정합니다.
GetDI Empty DigitalList 디지털 입력 상태를 조회합니다.
GetDO Empty DigitalList 디지털 출력 상태를 조회합니다.
... ... ... ...
RTDataExchange GetMotionData Empty MotionData 모션 데이터를 조회합니다.
GetControlData Empty ControlData 제어 데이터를 조회합니다.
... ... ... ...
Config SetRefFrame Frame Response 참조 프레임을 설정합니다.
GetHomePosition Empty JointPos 홈 위치를 조회합니다.
SetSpeedRatio Ratio Response 속도 비율을 설정합니다.
... ... ... ...

상기의 표는 주요 기능을 간략히 요약한 것으로, 전체 protobuf 파일은 Neuromeka Github에서 다운로드 받으실 수 있습니다.