ROS

ROS1-10 서비스 예제 - 서비스 메시지 준비하기

dkjeong 2022. 7. 27. 17:26

토픽은 일방적으로 데이터를 전달하기 때문에, 전달되는 데이터 형이 기본형 1개인 경우, 별도의 사용자 데이터 정의가 필요하지 않았다. 하지만, 서비스 부터는 '주고-받는' 약속이 필요하기 때문에, 기본형 1개의 데이터만 주고 받더라도, 사용자 데이터 정의가 필요하다. 그럼 사용자 데이터 정의를 통해 catkin_make가 어떤 것을 만들어 내는지 확인해 보자.

 

1. 서비스 메시지 파일 생성

- 토픽과 아주 비슷하지만, 문의를 할 데이터 형에 대한 선언과 문의를 처리한 다음 회신할 결과 데이터 형을 다음과 같이 프로젝트 폴더의 srv (폴더를 만들어 주어야 한다.) 안에 OOO.srv 로 만들어 주면 된다. 

 

srv/myServer.srv

int32 request_number
---
int32 response_number

 

앞서 토픽에서 만들었던 Message와 다르게, "---" 이 보인다. 이 구분자 위에 선언되는 데이터가 요청할 데이터 이고, 아래가 요청을 처리한 다음 회신할 결과 데이터 형이다. 본 예시에서는 코드를 단순화 하기 위해서, 요청할 데이터도 숫자형 데이터 한개, 회신할 데이터도 숫자형 데이터 1개로 하였다. 

 

이제 데이터 형을 수정하였으니, 필연적으로(= catkin에서 자료형 클래스를 만들라고 시키기 위해서!) CMakelist.txt 와 package.xml 을 수정해야 한다.

 

수정된 CMakellist.txt는 다음과 같다. (앞서 토픽과 비슷한 맥략이기 때문에 상세 설명은 생략!)

 

그럼 이제 package.xml을 확인해보자. ('사용자 메시지가 만들어졌다는 기록을 남겼으니, 빌드할 때랑 실행할 때 알아서 해라'는 뜻으로 이해하면 될것 같다. )

이제, 무엇을 해야 할까?

 

2. 서비스 메시지 클래스 만들기 

 

그렇다. catkin_make를 실행해서, 내가 만든 데이터 형을 소스코드에서 사용할 수 있도록 클래스를 만들어 주어야 한다. 

$cd ~/catkin_ws/src
$catkin_make --pkg 프로젝트폴더명

그럼 이제, catkin_make에서 어떤 훌륭한 일을 했는지 확인해보자. 토픽때와 마찬가지로, '/devel/lib/python2.7/dist-package' 폴더를 보면, 프로젝트이름으로 폴더가 만들어 진 것을 확인할 수 있다. 그 안에 바로 우리가 확인하고자 하는 클래스 선언 소스 코드가 만들어져 있다.

 

~/catkin_ws/devel/lib/python2.7/dist-packages/my_work_service/srv/_myService.py

 

토픽과 달리, 서비스메시지의 이름(= OOO.srv )으로 3개의 클래스가 만들어 진 것을 확인할 수 있다. 

   - 서비스메시지이름Request

   - 서비스메시지이름Response

   - 서비스메시지이름

 

서비스에서 요청할 때 사용할 데이터 명은 OOORequest 클래스로 선언되고, 처리 결과를 회신할 데이터 명은 OOOResponse로 구분하여 클래스가 만들어 진다. 그리고 두 클래스를 모두 포함하는 상위 클래스로 서비스명 이름으로된 클래스가 만들어진다. 

이제 이렇게 만들어진 클래스가 어떻게 실제 코드에서 사용되는지 다음 장에서 확인해보자.