이것 역시 예전에 다루었지만, 복습 차원에서 한번 더 공부해보자.
참고한 링크는 다음과 같다.
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]
$ 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 파일을 수정해야한다.
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
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를 적어야 할 것이다.
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 파일을 수정해주자.
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
...
add_service_files(
FILES
AddTwoInts.srv
)
이후 해당 패키지를 catkin_make 혹은 catkin build를 통해서 빌드한 후 메시지나 서비스를 사용하면 될 것이다.
만약 내가 다른 패키지에 msg나 srv를 작성했다면, 어떻게 해야할까?
그러면 package.xml 파일과 CMakeLists.txt 파일에 의존성 내용을 추가해야한다.
<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가 들어있는 패키지를 종속성으로 작성해줘야 한다.
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})
이러한 의존성 패키지들을 명시해줘야만 사용이 가능하다.