[ROS2] 서비스 Service 한번 사용해보기
ROS2에서 노드와 토픽에 대한 이야기를 앞서서 했었습니다. 이제 서비스에 대한 이야기를 해야겠네요. 우리나라 ROS 생태계에 지대한 영향을 끼치고 있는 표윤석 박사님의 ROS 서비스에 대한 글을 읽으면 도움이 크게 됩니다.^^ 저는 그저 어떻게 하면 쉽게 따라하는 법을 보여 드릴까하는 생각에서 가볍게 시작했으니까요^^
위 그림은 ROS의 공식 페이지에 나타나있는 ROS service에 대한 그림입니다. 서비스는 방송의 형태와 비슷한 Topic과 달리 위 그림처럼 요청(request)하면 응답(response)하는 방식입니다. 어떤 노드는 서비스 서버를 구성하고 그 노드에게 다른 노드가 요청하면 그에 맞는 응답을 보내는 형태입니다. 토픽은 누가 들을지 모르지만 막~ 발행하는 것이라면 서비스는 요청이 있어야 응답을 그것도 비공개로 하는 것입니다. 그래서 토픽과 달리 외부에서 데이터의 흐름을 관찰할 수가 없습니다.
일단 서비스 체험(^^)을 먼저해보죠. 제 계획에는 이제 토픽이든 서비스든 다시 만드는 법에 대해 이야기를 할 것입니다.
먼저 turtlesim 패키지의 turtlesim_node를 실행해서 turtle 한 마리 가지고 오구요. turtlesim 패키지가 제공하는 turtle_teleop_key 노드도 실행합니다. 이 노드는 화살표키를 이용해서 turtle을 움직일 수 있습니다. 그리고 뭐 적당히 움직여 보죠~~
이제 turtlesim 패키지의 두 노드를 실행했고, 이 상태에서 실행가능한 서비스의 목록을 service list 명령으로 조회할 수 있습니다. 하나씩 실행해보면 어떤건지 알 수 있고, 또 turtlesim의 문서를 확인해도 설명이 있습니다.
여기서 -t 옵션을 사용하면 서비스의 데이터 타입(type)도 같이 표현해 줍니다. 데이터 타입에 대해서는 직접 서비스나 토픽 등을 만드는 과정을 해보면 금새 이해할 수 있을 것 같습니다.
ROS2 dashing 버전에서는 srv 명령이었는데, foxy에서는 interface 입니다. interface show 명령은 definition이라고 하는 정의파일을 찾아서 그 내용을 보여줍니다. 예를 들어서 turtlesim 패키지는 TeleportAbsolute라는 서비스의 데이터 형을 정의했고 이를 관찰하고 싶으면 위 그림의 명령을 인가하면 됩니다. 그러면 정의된 데이터형이 나타납니다. ROS 서비스 정의 파일은 확장명이 srv이고 보통 패키지내에서 srv 폴더에 위치합니다. 이 파일은 간단하게 대쉬 세 개 ( - - - )를 연달아 입력하는 것을 기준으로 그 위에 있는 데이터형은 요청(request)에서, 그 아래는 응답(response)에서 사용합니다. 지금 TeleportAbsolute는 지정된 위치(x, y)와 자세(theta)를 요청하면 실행만 할 뿐 반환하는 데이터가 없기 때문에 --- 밑줄 세 개 아래에는 데이터가 없습니다.~
실행은 이렇게 합니다. service call 명령으로 해당 서비스 이름을 부르고, 그 뒤에 데이터형(type)을 지정하고, 그 데이터형에 맞춰 데이터를 입력하게 됩니다. 그러면 turtle이 지정된 위치에 지정된 자세를 취하고 있습니다.
turtlesim이 제공하는 서비스 중에는 turtle이 지나간 경로를 표시해주는 선이 있는데 이 선의 색상과 굵기를 조절하는 서비스가 있습니다. 이를 위 그림처럼 이용할 수 있습니다.
clear 서비스는 turtle이 이동한 경로표시를 모두 지우는 것입니다.
reset은 turtle을 완전히 다시 실행하는 것입니다. 서비스는 이렇게 call 명령으로 사용할 수 있습니다. rqt를 이용해서 service caller를 사용할 수도 있지만, 그건 또 다음 기회가 있을 것 같습니다.~ 서비스든 토픽이든 어떻게 만들건가까지 공부하고 나면 꽤 쉽게 사용할 수 있을 겁니다.~
위 내용은 아래의 동영상으로 직접 보여드리고 있습니다.