ROS에서 노드 사이에 데이터를 주고 받을때 토픽(topic), 서비스(service), 액션(action)이 사용되는데 이때 사용되는 데이터 타입을 인터페이스(interface)라고 합니다. 토픽은 msg 파일, 서비스는 srv 파일, 액션은 action 파일에 인터페이스가 정의됩니다.
1. 메시지 인터페이스(msg)
메시지 인터페이스는 필드 타입과 필드 이름으로 구성됩니다.
fieldtype1 fieldname1 fieldtype2 fieldname2 fieldtype3 fieldname3 |
예시:
int32 my_int string my_string |
ROS에 내장된 자료형은 다음과 같습니다.
built-in type |
C++ |
Python |
DDS type |
bool |
bool |
builtins.bool |
boolean |
byte |
uint8_t |
builtins.bytes* |
octet |
char |
char |
builtins.str* |
char |
float32 |
float |
builtins.float* |
float |
float64 |
double |
builtins.float* |
double |
int8 |
int8_t |
builtins.int* |
octet |
uint8 |
uint8_t |
builtins.int* |
octet |
int16 |
int16_t |
builtins.int* |
short |
uint16 |
uint16_t |
builtins.int*
|
unsigned short |
int32 |
int32_t |
builtins.int* |
long |
uint32 |
uint32_t |
builtins.int*
|
unsigned long |
int64 |
int64_t |
builtins.int*
|
long long |
uint64 |
uint64_t |
builtins.int* |
unsigned long long |
string |
std::string |
builtins.str |
string |
wstring | std::u16string | builtins.str | wstring |
built-in type의 배열 정의도 가능합니다.
built-in type |
C++ |
Python |
DDS type |
static array |
std::array<T,N> |
builtins.list* |
T[N] |
unbounded dynamic array |
std::vector |
builtins.list |
sequence |
bounded dynamic array |
custom_class<T,N> |
builtins.list* |
sequence<T,N> |
bounded string |
std::string |
builtins.str* |
string |
예시:
int32[] unbounded_integer_array int32[5] five_integers_array int32[<=5] up_to_five_integers_array string string_of_unbounded_size string<=10 up_to_ten_characters_string string[<=5] up_to_five_unbounded_string string<=10[] unbounded_array_of_string_up_to_ten_characters_each string<=10[<=5] up_to_five_string_up_to_ten_characters_each |
기본값 설정은 다음과 같습니다.
unit8 x 42 int16 y -2000 string full_name "Spot" int32[] samples [-200, -100, 0, 100, 200] |
상수는 등호(=)를 넣어주면 됩니다.
int32 X=123 int32 Y=-123 string FOO="foo" string EXAMPLE='bar' |
2. 서비스 인터페이스(srv)
서비스 인터페이스는 요청(request) 메시지와 응답(response) 메시지로 구성되며 대시(-)로 구분됩니다.
float32 x float32 y float32 theta string name --- string name |
3. 액션 인터페이스(action)
액션 인터페이스는 액션 목표(goal), 액션 결과(result), 액션 피드백(feedback)으로 구성되며, 각각 대시(-)로 구분됩니다.
float32 theta --- float32 delta --- float32 remaining |
4. 인터페이스 만들기
인터페이스를 만들어 보겠습니다.
터미널을 열고 오버레이 작업공간 src 폴더로 이동하세요.
인터페이스를 만들때는 cmake 빌드시스템을 사용합니다. 패키지 이름은 tutorial_interfaces, 빌드타입은 ament_cmake로 하여 패키지를 생성합시다.
$ ros2 pkg create tutorial_interfaces --build-type ament_cmake |
이번 글에서는 메시지와 서비스 인터페이스를 만들겠습니다. ~/dev_ws/src/tutorial_interfaces/ 폴더 아래에 msg와 srv 폴더를 만드세요.
$ mkdir ~/dev_ws/src/tutorial_interfaces/{msg,srv} |
인터페이스 파일 이름은 대문자로 시작해야 합니다. 우선 메시지 인터페이스부터 만들겠습니다.
$ touch ~/dev_ws/src/tutorial_interfaces/Num.msg |
다음과 같이 수정합니다.
Num 타입 메시지는 int형 num으로 구성되어있습니다.
서비스 인터페이스를 만들겠습니다. $ touch ~/dev_ws/src/tutorial_interfaces/AddThreeInts.srv |
다음과 같이 수정합니다.
AddThreeInts 타입 서비스 인터페이스는 int형 a,b,c로 구성된 요청 메시지와 int형 sum으로 구성된 응답 메시지로 이루어져 있습니다.
이제 패키지 설정파일 package.xml을 수정합니다. 일반적인 패키지와 달리 인터페이스 패키지에서는 빌드시 IDL(Interface Definition Language) 생성에 필요한 rosidl_default_generators가 사용되며 builtin_interfaces와 rosidl_default_runtime을 의존성 에 추가해줍니다.
다음으로 빌드 설정파일 CMakeLists.txt를 수정합니다. rosidl_generate_interfaces를 통해 인터페이스를 정의해주세요.
빌드해주세요.
$ cd ~/dev_ws && colcon build --symlink-install --packages-select tutorial_interfaces |
오버레이 환경설정을 하고 작성한 인터페이스를 확인해보세요.
$ overlay && ros2 interface show tutorial_interfaces/srv/AddThreeInts |
|