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에서 간단한 데이터 전송 및 처리를 구현할 수 있습니다.
'개발자 파헤치기 > 자율주행' 카테고리의 다른 글
[자율주행] Motion Planning이란? - 개념과 중요성 (1) | 2023.05.31 |
---|---|
[자율주행] Localization이란? (0) | 2023.05.19 |
[ROS] ROS Node(노드)란? (0) | 2023.04.12 |
[자율주행] 자율주행 드론: 미래 비행기 산업의 핵심 기술 (0) | 2023.04.11 |
[자율주행] Path Planning 알고리즘 종류와 특성 (0) | 2023.04.11 |