본문 바로가기
개발자 파헤치기/자율주행

[ROS] 노드 간 통신 : pubsiher, subcriber의 개념과 예제

by ddudidoobab 2023. 4. 12.
728x90

Publisher와 Subscriber는 ROS에서 가장 많이 사용되는 통신 메커니즘입니다.
Publisher는 ROS에서 정보를 발행하는 노드이며, Subscriber는 Publisher로부터 정보를 수신하는 노드입니다.
이러한 메커니즘은 다양한 유형의 데이터를 전송하고 처리하는 데 유용합니다.

예를 들어, 로봇이 다른 물체와 충돌하지 않도록 방향을 제어해야 할 때, LIDAR(Laser Imaging Detection and Ranging) 센서에서 정보를 수집하고 이를 Publisher를 통해 전송합니다.
다른 노드에서는 이러한 정보를 Subscriber로 받아 로봇의 이동 경로를 조정하여 충돌을 피할 수 있습니다.

이제 Publisher와 Subscriber의 예제를 작성해보겠습니다.

먼저, Publisher의 예제 코드입니다.

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

이 코드는 chatter라는 토픽에 "hello world"라는 문자열을 10Hz의 속도로 전송합니다. Publisher를 정의하고 초기화한 후, rate를 설정하고 while 루프를 실행합니다. rospy.is_shutdown() 함수는 ROS의 종료 여부를 확인하며, 종료되지 않은 경우에는 hello_str을 만들고 Publisher를 통해 전송합니다.

다음은 Subscriber의 예제 코드입니다.

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)

def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber('chatter', String, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()

이 코드는 chatter라는 토픽에서 메시지를 수신하고, callback 함수를 호출합니다.
rospy.loginfo 함수는 수신된 데이터를 로그에 기록하고, rospy.spin() 함수는 프로그램이 종료되지 않도록 유지합니다.

이러한 Publisher와 Subscriber의 예제를 이용하여, ROS에서 간단한 데이터 전송 및 처리를 구현할 수 있습니다.


300x250