[ROS] 나만의 메시지 타입 정의하기 (Define custom message types)

Sinaenjuni·2023년 3월 28일
0

ROS

목록 보기
4/12

Custom message

ROS에서 node간 통신은 메시지를 통해서 이루어진다. 개발을 하다보면 ROS에서 제공하는 메시지 외에 개발에 필요한 메시지 타입이 필요할 수 있다. 이번 글에서는 ROS 통신에 사용되는 새로운 타입의 메시지를 정의하는 방법에 대해서 다룬다.

1. msg 파일 생성

메시지 파일은 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

2. package.xml 수정

message 타입을 정의하기 위해서는 package.xml 파일을 다음 요소를 추가한다.

# package.xml 
...

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

3. CMakeList.txt 수정

주의!
처음 패키지를 만들 때, 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
)

4. build

$ cd ~/ros_ws
$ catkin_make

5. msg check

패키지를 빌드 한 후 정상적으로 메시지가 정의 되었는지 확인한다.

$ 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 사용하기

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"

0개의 댓글