ROS

ROS1-09 토픽 예제2 - 사용자가 정의한 자료형

dkjeong 2022. 7. 26. 17:37

1. 자료형 만들기

 

기본 자료형을 사용하는 경우, 한번에 하나의 기본자료 밖에 처리하지 못한다. 따라서 예를 들어, 나이, 성별, 이름과 같은 자료의 묶음을 전달하고 전달 받기 위해서는 (또는 기본 자료형이 아닌 패키지 자료형) 사용자 정의 자료형을 먼저 만들어야 한다. int16 으로된 나이(age)와 String으로된 이름(name)과 int32로 된 송출횟수(pub_count) 을 Publish 해본다면 자료형은 다음과 같아지고, 이러한 자료형은 src 폴더 안에, msg 라는 서브 폴더를 만들어서 그 안에 파일이름.msg 로 저쟝해야 한다. 

 

msg/student.msg

int16 age
string name
int32 pub_count

이렇게 간단한 선언만으로 사용자 정의 자료형이 만들어지진 않는다. 이제 컴퓨터에게 내가 만들고 싶은 자료형으로 소스코드에서 진짜 사용할 수 있는 자료형(=클래스!)를 만들라고 지시를 해야한다. 

이를 위해서 앞서 ROS1-07에서 설명했던, CMakelist.txt와 package.xml을 수정해 주어야 한다. 

 

 

이렇게 만들어진 CMakelist.txt와 package.xml을 catking_make 로 빌드 해주면 아래와 같이 소스코드에서 사용할 수 있는 (해당 프로그래밍 언어에 맞는) 클래스가 자동 생성된다. 

 

/my_work_topic/CMakelist.txt

/my_work/topic/package.xml

두 파일의 수정이 완료되면, 이제 catkin_make를 통해서, 빌드를 해보자

중략.

 

출력되는 글자를 보면 뭔가 열심히 만드는 것을 확인할 수 있다. (사실 catkin_make는 컴파일 언어인 cpp로 작성된 코드에서 진가가 발휘된다. interpreter 언어인 python 에서는 이번과 같이 메시지를 만드는 경우에만 큰 의미를 가진다. 

제일 마지막 문장을 봐도, generate_messages 라는 글자가 나오는 것으로 보아, 무엇인가 만든 모양이다. 

 

 

이 파일 중 우리가 만든 메시지로 클래스를 만들어주는 코드를 찾아 보았다. 

 

~/catkin_ws/devel/lib/python2.7/dist-packages/my_work_topic/msg/_student.py

 

이제 소스코드에서 student 클래스로 인스턴스를 만들어 사용할 수 있게 되었다.

 

2. 이제, ROS1-08 예제를 조금 수정하여, student 자료형을 사용해보고자 한다. 

#!/usr/bin/python3

import rospy
import sys
from std_msgs.msg import String

# 아래가 우리가 만든 메시지를 임포트 하는 문장임. 
# 간단하게 [프로젝트이름].[msg가 저장된 폴더] 에서 student 라고 하는 사용자 정의 자료형을 가져온다고 이해하면 됨.
from my_work_topic.msg import student

rospy.init_node('pub_student')  

# 퍼블리시 하는 자료형을 student로 수정 하였다.
pub = rospy.Publisher('student_information',student, queue_size=10)

rate = rospy.Rate(2) 

#  퍼블리시를 위해 student자료형으로 변수 a를 선언하고, 초기화 하였다.
a = student()
a.pub_count=0
a.age=20
a.name="smith"

while not rospy.is_shutdown():
    a.pub_count += 1 # 동적인 결과를 보여주기 위해 루프를 돌때마다, pub_count 값을 하나씩 늘려주었다. 

    pub.publish(a)    
    rate.sleep()

 

이제 rosrun 으로 위 코드를 실행하고, rostopic echo로 배포되고 있는 데이터를 확인해보자.

$rosrun my_work_topic my_publish.py