RosBridge 환경세팅
이 글은 RosBridge 프로토콜을 중점적으로 다루는 포스팅입니다. RosBridge 에 대한 상세 정의 혹은 환경세팅이 궁금하시다면,
ROS Series 1. ROS Quick Start - ROS 개념부터 환경구성까지
에서4번
을 참고해주세요
기본적으로 통신을 하기 위해서는 통신 프로토콜(protocol)에 대해 공부해야합니다. 일반적으로 프로토콜이란 통신 규약을 의미하는데, 쉽게 말해 데이터를 어떻게 주고받을 지를 정의한 약속입니다.
사실 라이브러리를 쓰면 통신 프로토콜 단계까지는 오진 않았을텐데, JAVA에서는 ROS Bridge 라이브러리의 지원이 부족해서 새롭게 라이브러리를 만들어보고자 합니다.
RosBridge Server와 통신하기 위해서는 통신 프로토콜(Protocol)에 대해서 탐구해야 합니다. 이번 포스팅에서는 RosBridge Protocol에 대해 살펴보도록 하겠습니다.
RosBridge Protocol Specification
The message transport of rosbridge is
JSON
objects. The only required field is the 'op' field, which specifies the operation of that message. Eachop
then specifies its own message semantics.The rosbridge protocol is a set of
op
codes which define a number of operations, along with the semantics for each operation.The rosbridge server is a server which accepts websockets connections and implements the rosbridge protocol.
요약하자면, rosbridge server 는 웹소켓 프로토콜로 통신하며, rosbridge protocol을 구현하는 서버입니다.
rosbridge protocol는 JSON
객체로 메세지를 주고 받으며, 일련의 작업(op, operation, 이하 op)들이 있습니다.
메세지는 JSON 객체로 구성되어 있으며, op
에 따라 객체 구성이 다릅니다. op
는 실제 동작을 의미하며, 이 값은 필수 값입니다.
id 값은 message의 고유한 id입니다. id 값을 넣으면 많은 이점을 얻을 수 있습니다. (응답에 포함, 버그 이슈에 포함, 특정 토픽 ID 구독 취소 등)
{
"op": "Example",
"id": "fred"
}
op 목록은 다음과 같습니다.
info
, warning
, error
, or none
) 설정 요청advertise
: 발행한 Topic 등록unadvertise
: 발행한 Topic 삭제publish
: Topic 발행subscribe
: Topic 구독 요청unsubscribe
: Topic 구독 취소 요청call_service
: 서비스 호출advertise_service
: 외부 서비스 등록unadvertise_service
: 외부 서비스 삭제service_request
: 서비스 요청service_response
: 서비스 응답이 포스팅에서는 주로 ROS Operations에 대해 다루겠습니다.
Topic이 처리되는 과정을 그림으로 그려보았습니다.
처음 보면서 가장 이해되지 않는 부분이 advertise 기능인데, 이는 ROS Master에게 Topic의 정보를 등록하는 기능입니다.
Topic을 게시할 예정일 때 사용하는 기능입니다. ROS Master에게 Topic 등록을 요청합니다.
메세지 형식은 다음과 같습니다.
{
"op": "advertise",
(optional) "id": <string>,
"topic": <string>,
"type": <string>
}
Topic
- 게시를 알릴 Topic 명Type
- Topic 유형Topic 등록 삭제할 때 사용하는 기능입니다. ROS Master에게 Topic 삭제를 요청합니다.
메세지 형식은 다음과 같습니다.
{
"op": "unadvertise",
(optional) "id": <string>,
"topic": <string>
}
Topic
- 알림를 중지할 Topic명Topic을 발행할 때 사용합니다. 발행된 Topic은 해당 Topic을 구독하는 구독자에게 전달됩니다.
메세지 형식은 다음과 같습니다.
{
"op": "publish",
(optional) "id": <string>,
"topic": <string>,
"msg": <json>
}
Topic
- 게시할 Topic명msg
- 게시할 메세지지정된 Topic을 구독할 때 사용합니다.
메세지 형식은 다음과 같습니다.
{
"op": "subscribe",
(optional) "id": <string>,
"topic": <string>,
(optional) "type": <string>,
(optional) "throttle_rate": <int>,
(optional) "queue_length": <int>,
(optional) "fragment_size": <int>,
(optional) "compression": <string>
}
Topic
- 구독할 Topic 명Type
- (예상되는) Topic 유형throttle_rate
- 전송되는 메시지 사이에 경과해야 하는 최소 시간(miliseconds). 기본 값은 0queue_length
- 메시지를 버퍼링할 대기열 크기. 메시지는 throttle_rate의 결과로 버퍼링됨. 기본값은 0 (대기열 없음)id
- 고유 구독 id. 지정된 경우 id를 참조하여 구독 취소 가능fragment_size
- 메시지가 조각화되기 전에 걸릴 수 있는 최대 크기compression
- 메시지에 사용할 압축 체계 (none, png, cbor, cbor-raw)queue_length가 지정되면 메시지가 전송되기 전에 대기열에 배치됩니다. 메시지는 대기열의 헤드에서 전송됩니다. 대기열이 가득 차면 가장 오래된 메시지가 제거되고 최신 메시지로 대체됩니다.
클라이언트에 동일한 주제에 대한 여러 구독이 있는 경우 메시지는 가장 낮은 조각화 크기 및 가장 높은 queue_length와 함께 가장 낮은 throttle_rate로 전송됩니다. rosbridge가 적절한 단편화 크기와 게시 속도를 효과적으로 선택할 수 있도록 클라이언트가 구독에 대한 ID를 제공하는 것이 좋습니다.
Topic 구독을 취소할 때 사용합니다.
메세지 형식은 다음과 같습니다.
{
"op": "unsubscribe",
(optional) "id": <string>,
"topic": <string>
}
Topic
– 구독을 취소할 주제의 이름id
- 구독을 취소할 구독의 IDID가 제공되면 해당 구독
만 구독 취소됩니다. ID가 제공되지 않으면 모든 구독
이 구독 취소됩니다.
ROS 서비스를 호출할 때 사용합니다.
메세지 형식은 다음과 같습니다.
{
"op": "call_service",
(optional) "id": <string>,
"service": <string>,
(optional) "args": <list<json>>,
(optional) "fragment_size": <int>,
(optional) "compression": <string>
}
service
– 호출할 서비스의 이름args
– 서비스에 args가 없으면 args를 제공할 필요가 없지만 빈 목록도 동일하게 허용됩니다. Args는 서비스에 대한 인수를 나타내는 json 개체 목록이어야 합니다.id
– 이 서비스 호출을 구별하기 위한 선택적 idfragment_size
– 응답 메시지가 조각화되기 전에 취할 수 있는 최대 크기compression
–메시지에 사용할 압축 체계를 지정하는 선택적 문자열. "none", "png"서비스에 응답할 때 사용합니다.
메세지 형식은 다음과 같습니다.
{
"op": "service_response",
(optional) "id": <string>,
"service": <string>,
(optional) "values": <list<json>>,
"result": <boolean>
}
service
– 호출된 서비스의 이름value
– 반환 값. 서비스에 반환 값이 없는 경우 이 필드를 생략할 수 있습니다(rosbridge 서버에서 수행함).id
– 서비스 요청에 ID가 제공된 경우 서비스 응답에 ID가 포함됩니다.value
: 서비스 콜백의 반환 값. true는 성공, 거짓 실패를 의미합니다.ROS Server에 서비스를 등록할 때 사용합니다. call_service를 통해 등록한 서비스를 요청할 수 있습니다.
메세지 형식은 다음과 같습니다.
{
"op": "advertise_service",
"type": <string>,
"service": <string>
}
service
– 공고할 서비스명type
– 서비스 유형Ros Service Server에 등록한 Service를 제거할 때 사용합니다.
{
"op": "unadvertise_service",
"service": <string>
}
service
– 공고를 취소할 서비스명rosbridge 공식 레포의 프로토콜 설명을 통해 탐구한 내용을 바탕으로 포스팅을 작성하였습니다. 라이브러리를 만들어보면서 내용을 점진적으로 추가할 예정입니다.