Robot/Robot Program - ROS

[ROS2] 서비스 Service 한번 사용해보기

PinkWink 2020. 9. 28. 08:00

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를 사용할 수도 있지만, 그건 또 다음 기회가 있을 것 같습니다.~ 서비스든 토픽이든 어떻게 만들건가까지 공부하고 나면 꽤 쉽게 사용할 수 있을 겁니다.~

위 내용은 아래의 동영상으로 직접 보여드리고 있습니다.


반응형