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 |