ROS에서는 robot과 robot의 움직임을 기술하는 데 필요한 많은 data type을 제공한다. 이는 std_msgs 패키지와 std_srvs 패키지에 담겨있고, 직접 정의하기 전에 이들을 살펴보면 필요한 건 웬만하면 정의되어 있다. 그럼에도 불구하고 사용자의 환경에 맞춰 data type을 정의해주면 편리한 경우가 있다. 오늘은 이러한 data type을 정의하는 방법을 알아보도록 하겠다.
msg(topic에 쓰는 자료형)와 srv(service에 쓰는 자료형) 모두 pkg를 통해 정의해야 한다. 다음을 통해 pkg를 build 해준다.
ros2 pkg create --build-type ament_cmake --license Apache-2.0 tutorial_interfaces
cd tutorial_interfaces
현재 ros tutorial 글에서 모두 python을 쓰고 있지만, 여기서는 cmake로 build해야 한다.
mkdir msg srv
msg와 srv는 각각 이름의 폴더에 저장해야 한다. 따라서 폴더를 만들어준다.
그리고 CMakeLists.txt를 다음과 같이 수정해준다.
find_package(geometry_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Num.msg"
"msg/Sphere.msg"
"srv/AddThreeInts.srv"
DEPENDENCIES geometry_msgs # Add packages that above messages depend on, in this case geometry_msgs for Sphere.msg
)
여기서 geometry_msgs는 정의하는 자료형이 geometry_msgs를 포함하기 때문이고,
project name의 아래에는 정의하는 자료형 이름을 써주면 된다.
package.xml도 다음과 같이 수정해주면 된다.
<depend>geometry_msgs</depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
geometry_msgs는 안 쓰면 안 넣으면 된다.
이제 파일을 만들어보자.
int64 num
msg/Num.msg 파일이다. msg 자료형은 msg 확장자로 끝내야하고, 정의하고 싶은 자료형 이름으로 파일을 저장한다.
geometry_msgs/Point center
float64 radius
msg/Sphere.msg 파일이다. 이렇게 원래 정의된 자료형을 이용할 수 있고, 구성 요소는 원하는 만큼 써주면 된다.
int64 a
int64 b
int64 c
---
int64 sum
srv/AddThreeInts.srv 파일이다. srv 자료형은 srv 확장자로 끝나야한다. 또, request와 response 자료형을 ---로 구분해준다.
colcon build 해주면 이제 사용해줄 수 있다. 사용하고자 하는 패키지의 package.xml 파일에 다음을 추가해주면 이제 자료형을 자유롭게 사용할 수 있다.
<depend>tutorial_interfaces</depend>
https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Custom-ROS2-Interfaces.html
자료형 정의는 다른 tutorial에 비해 아주 단순했다. 공식 사이트를 참고하면 예제 전체를 확인해볼 수 있다.