왕다방

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

제목ROS2: 서비스2021-11-28 22:18
작성자user icon Level 4

88x31.png


서비스(Service)


서비스(service)는요청(request)응답(response)으로 이루어진 통신 방식입니다.

요청을 하는 노드를 클라이언트(client), 요청을 받고 응답을 하는 노드를 서버(server)라고 합니다.

mb-file.php?path=2021%2F11%2F28%2FF4281_1.gif
어디서 본적 있는 방식이지 않나요? HTTP도 요청-응답을 기반으로 통신했습니다.


조금 의문점이 있는것이 HTTP에서는 단방향 통신이라고 하는데 ROS에서는 양방향 통신이라고 합니다.

추측상 HTTP에서는 요청방향을 기준으로 단방향 통신이라 하고, ROS에서는 메시지의 이동방향을 기준으로 양방향 통신이라고 하는듯 합니다.


서비스도 토픽처럼 하나의 채널에 여러 노드가 연결할 수 있지만 토픽이 n:n으로 통신하는 반면 노드는 1:1로 통신합니다.

mb-file.php?path=2021%2F11%2F28%2FF4282_2.gif
출처: https://docs.ros.org/en/foxy/Tutorials/Services/Understanding-ROS2-Services.html


토픽처럼 turtlesim을 통해 서비스에 대해 알아보겠습니다.


우선 2개의 터미널을 열고 각각 turtlesim_node 노드와 turtle_teleop_key 노드를 실행합니다.

  $ ros2 run turtlesim turtlesim_node

  $ ros2 run turtlesim turtle_teleop_key


또다른 터미널을 열고 다음 명령어를 입력하여 현재 실행중인 서비스 목록을 확인합시다.

  $ros2 service list


mb-file.php?path=2021%2F11%2F28%2FF4283_3.png


토픽처럼 -t 옵션을 넣으면 메시지 타입도 함께 표시됩니다.

mb-file.php?path=2021%2F11%2F28%2FF4284_4.png
 

총 19개의 서비스가 있는데 parameter라고 적힌 서비스는 파라미터 입니다.

파라미터는 복합적 통신 방식이므로 파라미터를 제외한 7개의 서비스를 하나씩 실행해봅시다.


서비스를 실행하기에 앞서 특정 타입의 메시지를 가지는 서비스를 찾아보겠습니다.

다음 명령어를 입력합니다.

  $ ros2 srvice find [타입 이름]


mb-file.php?path=2021%2F11%2F28%2FF4285_5.png

std_srvs/srv/Empty 타입의 메시지를 가지는 서비스는 /clear와 /reset이라는 것을 확인할 수 있습니다.


서비스의 메시지 형태는 srv 입니다. srv 인터페이스의 구조를 확인하기 위해 아래 명령어를 입력해봅시다.

  $ ros2 interface show [타입 이름].srv


mb-file.php?path=2021%2F11%2F28%2FF4287_6.png

 --- 가 나옵니다. 위쪽에는 요청하는 데이터, 아래쪽에는 응답받은 데이터가 출력되는데 std_srvs/srv/Empty.srv 메시지는 인수가 없는 요청을 하고 비어있는 응답을 받기 때문입니다. 다른 메시지를 확인해 보겠습니다.


mb-file.php?path=2021%2F11%2F28%2FF4288_7.png
 

아래에서 설명할텐데 tuttlesim/srv/Spawn.srv 서비스는 거북이를 소환하는 서비스입니다.

float32 자료형의 x, y, theta와 stirng 자료형 name 구조를 가지는 메시지를 서버에 요청하고 string 자료형 name 구조를 가지는 메시지를 응답받습니다.


이제 서비스를 실행해보겠습니다. 서비스를 실행하려면 아래 명령어를 입력합니다.

  $ ros2 service call [서비스 이름] [메시지 타입] "인수"


/clear 서비스는 거북이가 이동한 경로를 지웁니다. 요청 메시지에 인수가 필요없고 비어있는 메시지를 응답을 받습니다.

  $ ros2 service call /clear std_srvs/srv/Empty


mb-file.php?path=2021%2F11%2F28%2FF4289_8.png
mb-file.php?path=2021%2F11%2F28%2FF4290_11.gif


/spawn 서비스는 거북이를 소환합니다. 필수 인수인 x, y, theta, 선택인수인 name 구조를 가진 요청 메시지를 서버에 보내고 name 구조를 가진 메시지를 응답 받습니다.

이때 x, y는 왼쪽 아래를 기준으로 x,y 좌표를 나타내고, theta는 회전 각도, name은 이름을 나타냅니다.

  $ ros2 service call /spawn turtlesim/srv/Spawn "{x: 1, y: 1, theta: 0.5, name: 'robotstory'}"

  $ ros2 service call /sapwn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name": 'robotstory2'}"


mb-file.php?path=2021%2F11%2F28%2FF4291_10.png
mb-file.php?path=2021%2F11%2F28%2FF4292_12.gif
 

/reset 서비스는 거북이를 원점으로 리셋시킵니다. /clear 서비스와 같은 타입의 메시지를 사용하므로 비어있는 요청 메시지를 서버에 보내고 비어있는 응답을 받습니다.


  $ ros2 service call /reset std_srvs/srv/Empty


mb-file.php?path=2021%2F11%2F28%2FF4293_9.png
mb-file.php?path=2021%2F11%2F28%2FF4294_13.gif
 

/kill 서비스는 거북이를 지웁니다. name 구조를 가진 요청 메시지를 서버에 보내고 비어있는 응답 메시지를 받습니다.

mb-file.php?path=2021%2F11%2F28%2FF4295_14.png
mb-file.php?path=2021%2F11%2F28%2FF4296_15.gif
 

/turtle1/set_pen 서비스는 경로의 색상이나 넓이를 변경합니다.

인수 r, g, b ,width 를 가진 메시지를 서버에 전송하고 빈 응답을 받습니다. (off 인수도 있는데 어떨때 쓰는지 모르겠네요..)


  $ ros2 service call /turtle1/set_pen "{r: 255, g:255, b:255, width:10}"

  $ ros2 service call /turtle1/set_pen "{r: 0, g:0, b:0, width:20}"


mb-file.php?path=2021%2F11%2F28%2FF4298_16.png
mb-file.php?path=2021%2F11%2F28%2FF4299_17.gif
 

/turtle1/teleport_absolute 서비스는 거북이가 절대경로로 순간이동하고,

/turtle1/teleport_relative 서비스는 거북이가 상대경로로 순간이동합니다.


turtlesim/TeleportAbsolute.srv 메시지는 float 32 자료형 x, y, theta로 구성된 요청 데이터와 빈 응답 데이터로 이루어져 있습니다.

turtlesim/TeleportRelative.srv 메시지는 float 32 자료형 linear, angular로 구성된 요청 데이터와 빈 응답 데이터로 이루어져 있습니다.

  $ ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 1, y: 1, theta: 0.5}"

  $ ros2 service call /turtle1/teleport_relative turtlesim/srv/TeleportRelative "{linear: 5, angular: 0.5}"


mb-file.php?path=2021%2F11%2F28%2FF4300_18.png
mb-file.php?path=2021%2F11%2F28%2FF4301_18.gif
 

#ROS2# Robot Operating System# 노드# 서비스# srv
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)