본문 바로가기
ROS2

[ROS2] ROS2 Service 알아보기, 근데 이제 turtlesim을 곁들인

by ykr0919 2024. 10. 18.

 

 

 

 

서비스는 동기식 양방향 메시지 송수신 방식으로,  서비스 요청(Request) 하는 쪽을 Server Client, 요청을 받은 서비스를 수행한 후 서비스 응답(Response)을 하는 쪽을 Service Server라고 함.

 

 

결국 서비스는 특정 요청을 하는 클라이언트단과 요청받는 일을 수행한 후에 결괏값을 전달하는 서버 단과의 통신임.

 

서비스 요청 및 응답(Request/Response)은 앞에서 언급한 msg 인터페이스의 변형인 srv 인터페이스를 사용함!!

 

서비스는 동일한 서비스 서버에 대해 복수의 클라이언트를 가질 수 있도록 설계됨.

 

 

 

단, 서비스 응답은 서비스 요청이 있었던 서비스 클라이언트에 대해서만 응답하는 형태임.

 

위 이미지를 보면 Node C의 Service Client가 Node B의 Service Server에게 서비스 요청을 하면 Node B의 Service Server는 요청받은 서비스를 수행한 후 Node C의 Service Client에게만 서비스 응답을 하게 됨.

 

또한, 하나의 노드가 서비스 요청을 보내는 클라이언트 역활을 하면서, 다른 요청에 응답하는 서버 역활도 동시에 수행할 수 있음!!! 

 

 

토픽을 알아볼 때처럼 turtlesim을 통해 알아보자!!

 

 

 

서비스 목록 확인(ros2 service list)

 

 

서비스 목록 확인 명령어 ros2 service list  를 사용해 현재 실행 중인 노드들의 서비스 목록을 확인할 수 있음.

 

 

 

서비스 형태 확인(ros2 service type)

 

 

특정 서비스의 형태가 궁금할 땐 ros2 service type 명령어를 사용하면 됨.

 

해당 명령어 뒤에 특정 서비스명을 입력하고 실행하면 어떤 형태의 서비스인지 출력해 줌.

 

예를 들어 다음과 같이 clear 서비스는 std_srv/srv/Empty 형태이고, kill 서비스는 turtlesim/srv/Kill 형태임을 확인할 수 있음.

 

 

참고로 서비스 형태 확인 명령어가 아니더라도 위에서 설명했던 서비스 목록 확인 명령어가 아니더라도 위에서 설명했던 서비스 목록 확인 명령어 ros2 service list 에 옵션으로 -t를 붙여주면 형태를 서비스 목록과 함께 볼 수 있음.

 

 

 

서비스 찾기(ros2 service find)

 

 

서비스 형태 확인에서 언급한 서비스 형태 확인 명령어와 반대로 특정 형태를 입력하면 해당 형태의 서비스를 사용하는 서비스명을 확인할 수 있음. 

 

사용방법은 다음과 같이 ros2 service find 명령어에 인자로 특정 서비스 형태를 입력하면 됨. 

 

 

 

 

서비스 요청(ros2 service call)

 

지금까지 서비스에 대해 알아봤으니 실제 서비스 서버에 서비스 요청(Request)을 해보자! 

 

서비스 요청은 아래와 같이 ros2 service call 명령어를 이용하며 매개 변수로 서비스명, 서비스 형태, 서비스 요청 내용을 기술하면 됨. 

 

ros2 service call <service_name> <service_type> "<arguments>"

 

 

첫 번째로 다뤄볼 서비스는 /clear 서비스로 turtlesim 창에 표시된 이동 궤적을 지우는 서비스임.

 

teleop_turtle 노드를 실행시켜서 turtlesim을 움직여 보자 

 

 

 

그 뒤 다음 명령어로 /clear 서비스를 요청해 보자!

 

 

 

거북이 이동 궤적이 모두 지워짐을 알 수 있음!

 

내가 입력한 명령어에는 "<arguments>"가 생략되었는데, 이는 std_srvs/srv/Empty라는 서비스 형태가 아무런 내용이 없는 형태로 사용할 수 있기 때문임!!!

 

 

이번에는 /kill 서비스를 요청해보자! 

 

/kill 서비스는 죽이고자 하는 거북이 이름을 서비스 요청의 내용으로 입력하면 되는데, 다음과 같이 turtle1이라고 지정하면 거북이가 사라짐!! 

 

 

 

 

이번에는 /reset 서비스를 요청해보자!

 

 

모든 것이 리셋되면서 새로운 거북이가 나타남! 

 

 

 

이번에는 /set_pen 서비스를 요청해 보자!! 

 

 

이 서비스는 다음과 같이 r, g, b 값을 조합하여 궤적의 색을 지정하고, width로 궤적의 크기를 지정할 수 있음. 

 

 

 

 

마지막으로 /spawn 서비스를 요청해보자!

 

이 서비스는 저장한 위치 및 자세로 저장한 이름의 거북이를 추가함.

이름을 옵션으로 지정하지 않으면 turtle 뒤의 숫자가 자동으로 지정됨. 동일한 이름은 사용할 수 없음!!

 

닌자거북이 4 총사인 leonardo, raffaello, michelangelo, donatello를 생성해 보자! 

 

기본으로 지정된 거북이 turtle1은 /kill 서비스를 이용해 먼저 없애자!