이번에 Service를 사용해보자
ROS의 service란?
대기/응답 (Request/Response) 통신으로 동기식 통신 방법을 ROS에서는 서비스라고 한다.
ROS 서비스는 노드들이 서로 통신하는 방법으로, 노드가 요청을 보내고 응답을 받는 것을 허용합니다.
대기/응답 (Request/Response) 으로 동기식 통신 방법을 말하며, 직렬적으로 지속적인 데이터 스트림에 적합한 통신을 할 때 사용됩니다.
ros2 service는 서비스를 통해 ROS의 클라이언트/서버 프레임워크를 쉽게 연결할 수 있습니다.
turtlesim에 클라이언트가 call을 통해 turtle을 움직이게 해보겠다.
즉 call이 request라고 생각하면 되겠다.
사용할 수 있는 서비스가 무엇이 있는지 먼저 확인해보자.
ros2 service list
그 다음 type을 확인한다.
ros2 service type /turtle1/teleport_absolute
그 다음 interface를 확인해보자.
ros2 interface show turtlesim/srv/TeleportAbsolute
그렇다면 이제 turtle을 움직여 보자.
call 사용 예시
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 2, y: 2, theta: 1.57}"
여기서 중요한점은 : 다음 한칸 뛰고 숫자 값을 써야한다.
다음 서비스 리스트에서 확인한 /reset 을 사용해보자.
마찬가지로 /reset의 service type을 확인해본다.
ros2 service type /reset
그러면 이 Empty의 interface를 확인해보자.
ros2 interface show std_srvs/srv/Empty
그러면 아래와 같은 명령어로 reset할 수 있다.
ros2 service call /reset std_srvs/srv/Empty {}
그럼 제자리에 오게 되어있다.
거북이 한마리 더 추가하기 (/spawn 사용하기)
서비스 리스트를 다시 한번 확인
/spawn의 type을 확인해보자.
ros2 service type /spawn
다음으로 spawn의 interface를 확인해보자.
ros2 interface show turtlesim/srv/Spawn
즉, x, y, theta로 초기 위치를 지정하고 string name으로 거북이 객체 이름을 정해주라는 것이다. 물론 string name은 Optinal하고 이름을 정하지 않을거면 비워두면 된다.
그럼 거북이 한마리 더 추가를 위한 service call를 추가한다.
ros2 service call /spawn turtlesim/srv/Spawn "{x: 1, y: 1, theta: 0, name: ''}"
service list를 다시 확인해보자.
turtle1과 turtl2로 각각 구분해서 서비스를 다룰 수 있다.
두 거북이를 이동시켜보면 아래와 같다.