왕다방

인공지능 & 로봇 사용자들의 자유게시판입니다. 인공지능, 가정용로봇, 서비스로봇, 인공지능스피커 등 자유롭게 올려주세요. 질문과답변도 이곳에 올려주세요.

제목ROS2: 인터페이스(Interface)2021-12-25 00:52
작성자user icon Level 4

88x31.png


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 폴더로 이동하세요.

  $ cd ~/dev_ws/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


다음과 같이 수정합니다.

mb-file.php?path=2021%2F12%2F25%2FF4423_1.png

Num 타입 메시지는 int형 num으로 구성되어있습니다.


서비스 인터페이스를 만들겠습니다.

 $ touch ~/dev_ws/src/tutorial_interfaces/AddThreeInts.srv


다음과 같이 수정합니다.

mb-file.php?path=2021%2F12%2F25%2FF4424_2.png

AddThreeInts 타입 서비스 인터페이스는 int형 a,b,c로 구성된 요청 메시지와 int형 sum으로 구성된 응답 메시지로 이루어져 있습니다.


이제 패키지 설정파일 package.xml을 수정합니다.

mb-file.php?path=2021%2F12%2F25%2FF4425_3.png
일반적인 패키지와 달리 인터페이스 패키지에서는 빌드시 IDL(Interface Definition Language) 생성에 필요한 rosidl_default_generators가 사용되며 builtin_interfacesrosidl_default_runtime을 의존성 에 추가해줍니다.


다음으로 빌드 설정파일 CMakeLists.txt를 수정합니다.

mb-file.php?path=2021%2F12%2F25%2FF4426_4.png
rosidl_generate_interfaces를 통해 인터페이스를 정의해주세요.


빌드해주세요.

 $ cd ~/dev_ws && colcon build --symlink-install --packages-select tutorial_interfaces


오버레이 환경설정을 하고 작성한 인터페이스를 확인해보세요.

 $ overlay && ros2 interface show tutorial_interfaces/srv/AddThreeInts

mb-file.php?path=2021%2F12%2F25%2FF4427_5.png

#ROS2# 패키지# 인터페이스# msg# srv# action
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)