ROS

ROS - 노드 통신을 위한 패키지 만들기

스테디음 2022. 3. 1. 21:47

Publisher가 topic을 보내면 Subscriber는 그 topic 안에 있는 데이터를 꺼내 읽는다.

 

 

사진 출처: 프로그래머스 자율주행 데브코스 강의자료

  • xycar_ws/src/ 내의 msg_send 디렉토리를 만들어주어야 한다.
$ catkin_create_pkg msg_send std_msgs rospy
  • msg_send 내의 src 디렉토리는 자동으로 만들어지지만 launch 디렉토리는 그렇지 않다.
  • 따라서 mkdir 명령어로 launch 디렉토리를 직접 만들어주어야 한다.
  • 그리고 나서 새로 만든 패키지를 빌드해 주어야 한다.
$ cd ~/xycar_ws && catkin_make

 

이런 식으로!

 

 

토픽을 발행하고 구독하는 파이썬 코드 예제

토픽 이름은 'my_topic'

 

 

teacher.py

 

Publisher: 토픽에 "call me please" 담아서 전송

#!/usr/bin/env python

import rospy
from std_msgs.msg import String  #string이라고 하는 데이터 메시지 타입을 사용하겠다!

rospy.init_node('teacher') # 노드 생성 (노드 이름은 teacher)

pub = rospy.Publisher('my_topic', String) # 얘는 publisher, 토픽 이름은 my_topic, 데이터 타입은 string

rate = rospy.Rate(2) # 1초에 2번 loop를 돌거다.

while not rospy.is_shutdown():
    pub.publish('call me please') # 메세지 발사
    rate.sleep() # 1초에 2번 돈다고 했으니깐 주어진 time slot은 o.5초! 그럼 그 o.5초 중에 윗 줄을 실행하고 남은 시간만큼 잠을 자겠다!

 

student.py

 

Subscriber: 토픽 받아서 내용을 꺼낸 다음 화면에 출력

#!/usr/bin/env python

import rospy
from std_msgs.msg import String

def callback(msg):
    print msg.data # 나한테 넘겨진 인자의 데이터를 그냥 화면에 출력하겠다
    
rospy.init_node('student') # student라는 이름을 가진 노드 생성

# my_topic이라는 이름의 토픽을 받을거고 
#그 토픽 안에 있는 데이터의 타입은 string이어야 해. 
#그리고 토픽을 받으면 callback함수를 실행할거야
sub = rospy.Subscriber('my_topic', String, callback) 

rospy.spin() # 이 자리에서 계속 무한 loop, 프로그램이 종료되지 않도록! 그럼 토픽이 도착할 때마다 ros system이 callback함수를 불러준다.

 

 

Launch 파일 만들고 실행하기

$ gedit m_send.launch
<launch>
	<node pkg="msg_send" type="teacher.py" name="teacher"/>
	<node pkg="msg_send" type="student.py" name="student" output="screen"/>
</launch>
$ cm (빌드하기)

 

파이썬 파일에 실행권한 부여

$ chmod +x teacher.py student.py

 

launch 파일 실행

$ roslaunch msg_send m_send.launch

 

이렇게!

 

이렇게 나온다.

 

$ rqt_graph (잘 되는지 확인)

 

 

 

 

 

 

'ROS' 카테고리의 다른 글

ROS - Custom Message  (0) 2022.03.01
ROS - 1:N, N:1, N:N 통신  (0) 2022.03.01
ROS - roslaunch  (0) 2022.03.01
ROS - turtlesim, publisher, subscriber  (0) 2022.03.01
ROS 설치 및 환경설정  (0) 2022.02.28