basic - interfaces

ROS 2 애플리케이션은 토픽, 서비스, 액션 중 하나의 인터페이스로 통신한다. ROS 2는 인터페이스 정의 언어(IDL) 로 이 인터페이스를 기술하고, 이 설명을 바탕으로 여러 언어용 소스 코드를 자동 생성한다.

지원하는 인터페이스 종류는 다음과 같다.

종류파일설명
msg.msg메시지 필드 정의. 토픽 등에서 “응답 없이” 데이터를 보낼 때 사용
srv.srv서비스 정의. 요청(request)응답(response) 두 부분(각각 메시지 선언), ---로 구분
action.action액션 정의. goal / result / feedback 세 부분(각각 메시지 선언), ---로 구분

Messages

메시지는 한 노드가 다른 노드에게 응답을 기대하지 않고 데이터를 보낼 때 쓰인다. 예: 센서에서 온도 데이터를 읽어 Temperature 메시지로 토픽에 발행하면, 다른 노드가 구독해 그 메시지를 받는다.

메시지는 패키지의 msg/ 디렉터리 안 .msg 파일로 정의한다. 필드(fields)상수(constants) 로 구성된다.

Fields (필드)

각 필드는 타입이름을 공백으로 구분해 한 줄에 쓴다.

fieldtype1 fieldname1
fieldtype2 fieldname2

예: int32 my_int, string my_string

  • 필드 타입: (1) 기본 타입 — 아래 표. (2) 다른 메시지 타입 — 예: geometry_msgs/PoseStamped.
  • 필드 이름: 소문자·숫자·밑줄(_)만 사용. 알파벳으로 시작하고, 밑줄로 끝나거나 연속 밑줄(__)은 안 됨.
  • 기본값: 세 번째 요소로 지정 가능. 예: uint8 x 42, string full_name "John Doe. 문자열/문자열 배열·복합 타입에는 현재 기본값 미지원.

기본 타입 (Built-in types)

TypeC++PythonDDS
boolboolbuiltins.boolboolean
byteuint8_tbuiltins.bytes*octet
charcharbuiltins.int*char
float32floatbuiltins.float*float
float64doublebuiltins.float*double
int8~uint64int8_t 등builtins.int*(생략)
stringstd::stringbuiltins.strstring
wstringstd::u16stringbuiltins.strwstring

기본 타입은 모두 배열로 쓸 수 있다: int32[](동적 무제한), int32[5](고정 5개), int32[<=5](최대 5개), string<=10(최대 10자 문자열) 등.

Constants (상수)

필드와 비슷하지만 대입 후 변경 불가하다. = 로 값을 넣고, 이름은 대문자로 쓴다.

int32 X=123
string FOO="foo"

Services

서비스는 요청/응답 통신이다. 클라이언트가 서버에게 짧은 연산을 요청하고, 서버가 결과를 반환한다.

서비스는 패키지의 srv/ 디렉터리 안 .srv 파일로 정의한다. 요청응답 메시지 선언을 --- 로 구분한다. --- 로 이어진 두 개의 .msg 내용이 곧 유효한 서비스 정의다.

간단한 예 (문자열 받아 문자열 반환):

string str
---
string str

요청/응답 각각에 상수·필드·다른 패키지 메시지 타입을 쓸 수 있다. 서비스 안에 다른 서비스를 넣을 수는 없다.

Actions

액션은 장시간 요청/응답 통신이다. 액션 클라이언트가 서버에게 작업을 요청하고, 서버가 진행 중 피드백을 보내며 결과를 반환하며, 중단도 가능하다.

액션은 goal / result / feedback 세 부분을 --- 로 구분해 정의한다. 각 부분은 0개 이상의 필드를 가질 수 있으며, 타입·필드 이름 규칙은 메시지와 동일하다. 액션 정의는 패키지의 action/ 폴더에 .action 파일로 둔다

예 (피보나치 액션):

int32 order
---
int32[] sequence
---
int32[] sequence

클라이언트는 order(몇 번째까지 계산할지)를 goal로 보내고, 서버는 최종 수열을 result로, 중간 수열을 feedback으로 보낸다.


참고: Interfaces — ROS 2 Jazzy