반응형

msg와 srv 파일, rosmsg, rossrv, roscp commandline tools를 어떻게 생성하고 빌드하는지 다룬다.

메시지는 publish, subscribe되는 단방향성 데이터 전송을 나타낸다. 따라서 전송되는 데이터의 타입과 데이터 갯수 등을 정의해주게 되고 서비스는 request와 reponse의 양방향성 통신이므로 두 부분을 따로 정의해주게 된다.

 

1. Introduction to msg and srv

msg: msg파일은 ROS message를 나타내는 간단한 텍스트파일이다. 이는 다른 언어들의 소스코드들을 실행시키는데 사용된다.

 

srv: srv파일은 서비스를 나타내는 파일로 request와 response의 2가지로 분류된다.

(msg파일은 해당 패키지의 msg dictionary에 저장되고 srv는 srv dictionary에 저장된다.)

 

msg는 field type과 field name으로 구성된 한 줄로 구성된 텍스트파일로 field type은 다음과 같이 사용 가능하다.

 

ROS에는 header라는 특별한 타입이 있는데 헤더는 ROS에서 자주 사용되는 타임스탬프와 좌표 정보를 포함하게 된다.

다음은 Header, 문자열, 그리고 2개의 다른 msgs를 사용하는 msg를 나타내었다.

srv파일은 request와 reponse가 있는 것만 제외하고 msg와 거의 동일하다. 두 파트는 '--'로 구분되게 된다.

아래는 srv파일의 예이다.

여기서 request는 64bit integer 형태의 A, B 출력은 Sum 으로 A, B를 요청하여 값을 받으면 Sum이라는 결과를 reponse하게 된다.

 

2. Using msg

2.1 Create a msg

 

이전에 다룬 패키지의 새로운 msg를 정의한다.

위의 내용을 통해 msg디렉터리의 Num.msg 파일에 "int64 num" 이라는 문구가 적힌 파일이 생성된다.

아래와 같이 한 줄에 하나의 요소씩 추가하여 파일을 수정할 수 있다.

 

이제 이 msg파일을 C++이나 python 등의 코드로 변경하는 과정을 진행해야한다.

package.xml 파일을 열어 아래의 두 문장이 주석처리되지 않았음을 확인하자.

catkin_ws/src/beginner_tutorials/ 디렉터리로 이동하여 package.xml파일을 열어보자.

위와 같이 주석처리가 되어있으면 주석을 풀어주자.

(빌드를 진행할땐 message_generation이 필요하고 실행을 할땐 message_runtime이 필요하다.)

 

이제 CMakeLists.txt를 열어보자.

 

다음과 같이 message_generation을 dependency에 추가하여(find_package를 찾아 수정하자) 메시지를 시작할 수 있다.

가끔씩 find_package의 모든 dependencies를 호출(call)하지 않아도 잘 빌드될때가 있는데 이는 catkin이 모든 프로젝트를 한번에 묶어 이전에 find_package를 호출한 적이 있다면 같은 값이 들어가기 때문이다. 하지만 이를 독립적으로 실행하게 되면 문제가 발생할 수 있다.

 

그리고 아래와 같이 catkin_package부분에 message runtime dependency를 추가하도록 하자.

 

다음으로 아래 부분을 수정하도록 하자.

.msg파일을 직접 추가해줌으로써 다른 .msg파일들이 추가될때 CMake가 확실히 이를 적용시킬 수 있도록 한다.

 

이제 generate_message() 함수가 확실히 호출될 수 있도록 하자.

이제 msg정의를 통해 source 파일을 실행시킬 준비가 되었다.

 

 

 

3. Using rosmsg

msg가 생성되어있다면 rosmsg 명령을 통해 이를 확인할 수 있다.

그럼 다음의 결과를 확인할 수 있다.

메시지 타입은 크게 2개의 파트로 분류된다.

   * beginner_tutorials -- the package where the message is defined

   * Num -- The name of the msg Num

 

혹시 어떤 msg가 있는 패키지가 생각나지 않는다면 다음의 코드를 통해 msg파일이 있는 패키지를 확인할 수 있다.

 

 

4. Using srv

4.1 Creating a srv

 

앞에서 사용한 패키지에 srv를 만들어보자.

새로운 srv 정의를 직접 작성하는 대신 다른 패키지에 존재하는 내용을 복사하여 사용하겠다.

다른 패키지에서 파일을 복사하여 사용하기 위해선 roscp 명령어를 사용할 수 있다.

 

그리고 아래와 같이 package.xml 파일을 수정한다(이 부분은 위에서 다룬 내용으로 이미 진행하였으면 넘어간다).

CMakeLists.txt파일도 아래와 같이 수정하는데 위에서 진행하였다면 넘어가도록 하자.

추가적으로 아래의 부분도 수정하도록 하자.

 

4.2 Using rossrv

 

rossrv show 명령어를 통해 해당 파일의 내용을 살펴볼 수 있다.

그럼 다음과 같은 결과를 확인할 수 있다.

그리고 rosmsg와 같이 패키지 이름 없이 service file을 찾을 수 있다.

 

 

5. Common step for msg and srv

CMakeLists.txt 파일을 아래와 같이 수정한다(이전에 완료했으면 하지않아도 된다).

이제 새로운 메시지를 생성하였으므로 패키지를 다시 make하자.

 

 

6. Getting help

 

대부분의 ROS 명령어는 -h라는 help 옵션이 존재하여 사용법을 잊었을 때 유용하게 사용할 수 있다.

 

반응형

+ Recent posts