본문 바로가기

카테고리 없음

[ROS: Robot Operating System] 2-4. ROS Service (서비스), Parameter (파라미터), Action (액션)의 이해

ROS에서, 마스터 (Master)는 노드 (Node)들의 중계기 역할만 하고, 실제 데이터는 노드 (Node)간에 직접 전송된다. 어떤 노드가 다른 노드에게 토픽을 전달할 때, 같은 토픽을 갖는 노드들을 연결해주는 것이 마스터의 역할이고, 실제로 데이터를 주고 받는 것은 노드 들만 관여한다. 

ROS는 몇 가지 통신 방식을 갖는다. 지난 포스팅에서 토픽 (Topic)에 대해서 공부했었는데, 토픽은 데이터가 지속적으로 전달되어지는 데이터 스트림에 적합한 비동기식 통신 방법이다. 반면, 대기/응답 (Request/Response) 통신으로 동기식 통신 방법을 ROS에서는 서비스 (Service)라고 한다. 여기서 동기식 방법 중에 직렬 방법과 병렬 방법이 존재하는데, 직렬 방법을 서비스, 병렬 방법을 액션 (Action)이라고 한다. 

1. 서비스 (Service)

- ROS 서비스는 노드들이 서로 통신하는 다른 방법으로, 노드가 요청을 보내고 응답을 받는 것을 허용한다. 대기/응답 (Request/Response)으로 동기식 통신 방법을 말하며, 직렬적으로 지속적인 데이터 스트림에 적합한 통신을 할 때 사용된다. 

- rosservice는 서비스를 통해 ROS의 클라이언트/서버 프레임워크를 쉽게 연결할 수 있다. 아래와 같이 입력하면 많은 명령어를 확인할 수 있다. 

- turtlesim 화면을 키고 (turtlesim 화면에 대한 예제 포스팅은 이전 포스팅을 참고 바란다. https://neosla.tistory.com/39?category=825336), rosservice의 list 옵션을 확인해본다. 

rosservice list

 

- 위의 화면과 같이, rosservice의 리스트를 확인할 수 있다. 현재 가동중인 노드의 활성화된 서비스에 대한 정보를 출력하는 것으로, 현재 "turtlesim_node" 노드가 가동 중이고, 이 노드가 활성화 하고 있는 서비스는 위의 목록과 같은 것이다. 여기서 spawn은 화면에 나타난 turtle의 갯수를 늘릴 수 있는 서비스이다. 

- /spawn의 서비스의 argument를 확인 하기 위해, 아래와 같이 입력해본다. 

rosservice type /spawn | rossrv show

- 이 서비스를 이용하여 주어진 위치와 방향에서 새로운 turtle을 생성시킬 수 있다. 이름 필드는 옵션으로 지정되어 있으므로, 공백일 경우 아래와 같이 turtle2로 생성된다.

rosservice call /spawn 2 2 2.0 ""

- rosservice call [서비스명] [arguments]에서 call 입력은 입력된 argument와 함께 서비스를 불러오는 명령어이다. 

- 2 2 2.0 으로 입력한 것은 /spawn 서비스 argument의 포맷이 float32 x, float32 y, float32 theta 이기 때문에 임의로 정한 것이고, ""는 새로 생성되는 turtlesim의 이름을 지정할 수 있으며 공백으로 지정하였다. 

 

- 지난 포스팅에서 다뤘던 키보드 방향키를 이용하여 거북이를 조정해보면, 아래의 왼쪽 그림과 같이 노선을 그리면서 거북이가 움직이는 것을 확인할 수 있다. (새로운 터미널을 열고, rosrun turtlesim teleop_key 를 입력시키면 된다. )

- 노선을 그리면서 움직인 경로를 지우려면, rosservice의 clear 서비스를 이용하여 명령을 주면 된다. 

rosservice call clear

- 위의 그림에서 오른쪽 그림과 같이 rosservice의 clear 서비스를 이용하여 거북이가 이동산 경로를 삭제할 수 있다. 

 

2. 파라미터 (Parameter)

- ROS의 파라미터는 전역변수 (Global variable)와 같은 역할을 한다. 

- rosparam은 사용자가 ROS 파라미터 서버시의 데이터를 저장하거나 조종하는 것을 허용하며 정수형, 부동소수점, 부울형, 리스트, 딕셔너리, 문자열 등을 저장할 수 있다. rosparam은 YAML syntax에 대한 마크업 언어를 사용한다. 

* YAML: YAML은 XMLC파이썬RFC2822에서 정의된 e-mail 양식에서 개념을 얻어 만들어진 '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식이다. YAML의 뜻은 “또 다른 마크업 언어 (Yet Another Markup Language)”였으나, YAML의 핵심은 문서 마크업이 아닌 데이터 중심에 있다는 것을 보여주기 위해 이름을 바꾸었다. 오늘날 XML과 JSON이 데이터 직렬화에 주로 쓰이기 시작하면서, 많은 사람들이 YAML을 '가벼운 마크업 언어'로 사용하려 하고 있다. [1] 

- rosparam 을 입력하면 아래 화면과 같이 다양한 옵션을 확인할 수 있다. 

- rosparam list을 입력하며 아래 화면과 같이 현재 노드에서 활성화 된 파라미터들을 확인할 수 있다. 

- rosparam의 간단한 예를 실행해보자면, rosparam setrosparam get이 있다. 

- turtlesim 화면이 켜진 background의 색을 불러오고자 하면, /rosparam get background_r (red 채널), /rosparam get background_g (green 채널), get background_b (blue 채널) 을 입력하면 된다. 

- 반대로, rosparam set을 이용하여 배경색을 바꾸고자 하면, rosparam set /background_r 150을 입력한다. 이 명령어를 입력하여 background_r의 파라미터 값을 150으로 변경했는데도, 화면에는 아무런 변화가 없다. 

- rosservice call /clear 을 입력하여 파라미터의 변경을 위해 clear 서비스를 호출해주어야 한다. 

- 아래 화면과 같이 성공적으로 변경된다. 

- 파라미터 정보를 모두 불러오려면, rosparam get / 을 입력한다. 

 

3. 액션 (Action)

- ROS 액션은 노드들이 통신하는 방법 중에 하나인데, 서비스의 경우 하나의 서비스가 실행 중이면 다른 서비스가 동시에 통신할 수 없지만, 액션은 병렬 (parallel)적인 특성을 가지고 있기 때문에 동시에 통신이 가능하다. 

- 액션에 대한 내용은 추후에 자세히 다룬다. 

 

 

[1] https://ko.wikipedia.org/wiki/YAML