[ROS] 커스텀 메시지(msg)와 커스텀 서비스(srv) 생성

HY K·2024년 8월 16일

ROS1

목록 보기
20/34

이것 역시 예전에 다루었지만, 복습 차원에서 한번 더 공부해보자.
참고한 링크는 다음과 같다.
https://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv


💡 ROS 메시지란?
노드 간의 데이터를 주고 받을 때 사용하는 형식으로, 기본적인 자료형, 간단한 자료구조 및 배열과 같은 구조를 사용하고 있다. 메시지를 통해서 통신을 할 때에는 TCPROS 혹은 UDPROS와 같은 프로토콜을 사용한다.

ROS의 메시지들은 다음과 같은 자료형, 자료구조를 사용한다.

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]

1. 커스텀 msg 사용하기

$ cd catkin_ws/src
$ cd my_first_ros_pkg  # 패키지 이름은 예시로 들은 것
$ mkdir -p msg  # 메시지 파일이 담길 폴더 생성
$ echo "int 64 num" > msg/Num.msg 

마지막에 echo 명령어와 파일 리디렉션을 통해서 msg 파일을 생성하긴 했는데, VScode와 같은 텍스트 에디터로 해도 무방하다.

이후 package.xml 파일과 CMakeLists.txt 파일을 수정해야한다.

package.xml

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
	roscpp
    rospy
    std_msgs
    message_generation
)
# 빌드 할 때의 구성 요소 넣어주기

...

catkin_package(
	...
    CATKIN_DEPENDS message_runtime ...
    ...
)
# catkin 빌드 의존성 패키지 기입

...

add_message_file(
	FILES
    Num.msg
)
# 내가 사용하고자 하는 메시지 파일을 추가한다.

...

generate_messages(
	DEPENDENCIES
    std_msgs
)
# 내가 작성한 커스텀 메시지 파일이 의존하는 메시지 파일을 작성하면 된다.
# 이 경우에는 std_msgs를 작성하였지만, 예를 들어서 PointCloud2 메시지를
# 사용하려면 sensor_msgs를 적어야 할 것이다.

2. 커스텀 srv 사용하기

srv는 서비스의 내용을 가지고 있는, 토픽의 msg에 해당하는 부분이다. 요청과 응답으로 구성되어 있다.
srv의 구성을 예시로 들어보면 다음과 같다.

int64 A
int64 B
---
int64 sum

이번에는 srv 파일을 만들어서 사용해보자.

$ cd catkin_ws/src/my_first_ros_pkg
$ mkdir -p srv
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

이러면 ROS 튜토리얼로부터 srv 파일을 copy해서 생성하게 된다. 그 다음 msg와 마찬가지로 package.xml 파일과 CMakeLists.txt 파일을 수정해주자.

package.xml

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
	roscpp
    rospy
    std_msgs
    message_generation
)

...

add_service_files(
	FILES
    AddTwoInts.srv
)

이후 해당 패키지를 catkin_make 혹은 catkin build를 통해서 빌드한 후 메시지나 서비스를 사용하면 될 것이다.


3. 다른 패키지의 msg나 srv를 가져오려면?

만약 내가 다른 패키지에 msg나 srv를 작성했다면, 어떻게 해야할까?
그러면 package.xml 파일과 CMakeLists.txt 파일에 의존성 내용을 추가해야한다.

package.xml

<build_depend>name_of_package_containing_custom_msg</build_depend>
<build_depend>message_generation</build_depend>

<exec_depend>name_of_package_containing_custom_msg</exec_depend>
<exec_depend>message_runtime</exec_depend>

커스텀 msg나 srv가 들어있는 패키지를 종속성으로 작성해줘야 한다.

CMakeLists.txt

find_package(... my_custom_msg_srv_package_name ...)
catkin_package(CATKIN_DEPENDS ... my_custom_msg_srv_package_name ...)
add_dependencies(your_program ${catkin_EXPORTED_TARGETS})

이러한 의존성 패키지들을 명시해줘야만 사용이 가능하다.

profile
로봇, 드론, SLAM, 제어 공학 초보

0개의 댓글