IndyDCP3
IndyDCP3는 gRPC를 사용하는 원격 프로시저 호출(RPC) 프로토콜입니다. HTTP/2 기반의 높은 성능, 빠른 통신속도를 가지고 있으며 언어 중립성 특성으로 다양한 언어에서 쉽게 개발될 수 있습니다. 또한 양방향 스트리밍과 비동기 통신을 지원하여 이를 활용한 다양한 어플리케이션 구현 할 수 있습니다.
Note
통신 속도는 클라이언트와 서버 간의 네트워크의 지연 시간, 메시지의 크기, 시스템의 처리 능력 등에 따라 달라집니다. 실제 통신 속도는 애플리케이션의 요구 사항과 리소스 한계에 따라 결정됩니다. IndyDCP3의 경우 가장 기본적인 로봇 상태 메시지 응답 (예를들어 관절 각도 수신)에 대해서 네트워크 유선 연결 시 평균 지연속도는 약 2ms 정도입니다.
IndyDCP3에 대한 Python 과 C++ 클라이언트의 경우 뉴로메카에서 공식적으로 제공하기 때문에 아래 링크를 통해 바로 사용이 가능합니다. 이를 제외한 개발 언어에 대해서는 본 장의 나머지 문서를 참고해주시기 바랍니다.
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 메시지 형식을 사용하여 데이터를 서버에 전송합니다.
- 서버는 이 데이터를 수신하고, 필요한 작업을 수행한 후 응답을 클라이언트에 반환합니다.
추가 자료
- 자세한 정보와 사용법은 Protocol Buffers 문서와 gRPC 공식 문서를 참조하세요.
이 매뉴얼은 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에서 다운로드 받으실 수 있습니다.