ROS에서 node간 통신은 메시지를 통해서 이루어진다. 개발을 하다보면 ROS에서 제공하는 메시지 외에 개발에 필요한 메시지 타입이 필요할 수 있다. 이번 글에서는 ROS 통신에 사용되는 새로운 타입의 메시지를 정의하는 방법에 대해서 다룬다.
메시지 파일은 src/msg
디렉터리 안에 *.msg
파일로 작성한다.
├── ros_ws
├── build
├── devel
├── .catkin_workspace
└── src
├── CMakeLists.txt
├── package_1
│ ├── launch
│ │ └── *.launch
│ │ └── ...
│ ├── src
│ │ ├── *.py
│ │ └── ...
│ ├── msg (폴더는 직접 만든다.)
│ │ └── *.msg (정의하고자 하는 메시지 파일을 생성한 후 아래 내용을 추가한다.)
│ │ └── ...
│ ├── rviz
│ │ └── *.rviz
│ │ └── ...
│ ├── ufdf
│ │ └── *.ufdf
│ │ └── ...
│ ├── CMakeList.txt
│ └── package.xml
└── package_2
...
msg 파일의 내용은 다음과 같이 메시지 타입과 변수 이름으로 구성된 텍스트이다.
# example *.msg file
data_type variable_name
# my_msg.msg
string first_name
string last_name
int32 age
int32 score
string phone_number
int32 id_number
message 타입을 정의하기 위해서는 package.xml 파일을 다음 요소를 추가한다.
# package.xml
...
<build_depend> message_generation </build_depend>
<exec_depend> message_runtime </exec_depend>
...
주의!
처음 패키지를 만들 때, dependencise에rospy
std_msgs
를 추가하지 않은 경우에 빌드 과정에서 오류가 날 수 있다. 이러한 경우package.xml
에 아래 요소들을 추가해 주면된다.... <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <build_export_depend>rospy</build_export_depend> <build_export_depend>std_msgs</build_export_depend> <exec_depend>rospy</exec_depend> <exec_depend>std_msgs</exec_depend> ...
정의된 메시지 파일을 사용하기 위해서 CMakeList.txt 파일을 다음과 같이 수정한다.
# CMakeList.txt
# message_generation을 추가한다.
find_package(catkin REQUIRED COMPONENTS
rospy
std_msgs
message_generation
)
...
# add_message_files의 주석을 풀고 수정한다.
add_message_files(
FILES
my_msg.msg (새로 추가한 메시지 파일)
)
...
# generate_messages의 주석을 푼다.
generate_messages(
DEPENDENCIES
std_msgs
)
...
# LIBRARIES와 CATKIN_DEPENDS의 주석을 푼다.
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES package_1 (새로운 메시지 파일을 가지고 있는 패키지 이름)
CATKIN_DEPENDS rospy std_msgs message_runtime
# DEPENDS system_lib
)
$ cd ~/ros_ws
$ catkin_make
패키지를 빌드 한 후 정상적으로 메시지가 정의 되었는지 확인한다.
$ rosmsg show my_msg
[msg_send/my_msg]:
string first_name
string last_name
int32 age
int32 score
string phone_number
int32 id_number
또는
~/ros_workspace/devel/lib/python2.7/dist_packages/msg_send/msg
에서 확인이 가능하다.
msg_send 패키지에 정의한 msg는 다음과 같은 방법으로 소스 코드에서 사용이 가능하다.
from msg_send.msg import my_msg
...
msg = my_msg()
msg.first_name = "nayoung"
msg.last_name = "Choi"
msg.id_number = 20210815
msg.phone_number = "010-9072-7247"