Rclpy 발행·구독 노드
Node를 상속하여 발행자·구독자·타이머를 등록하며, 등록한 콜백은 rclpy.spin이 실행되는 동안에만 호출된다.
노드의 기본 구조
rclpy는 ROS 2의 Python 클라이언트 라이브러리이다. 노드는 Node를 상속하여 정의하고, 생성자에서 발행자·구독자·타이머를 등록한다. 등록한 콜백은 rclpy.spin이 실행되는 동안에만 호출된다.
발행 노드
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class Talker(Node):
def __init__(self):
super().__init__('talker')
# 메시지 타입, 토픽 이름, 큐 깊이
self.pub = self.create_publisher(String, 'chatter', 10)
# 0.5초마다 콜백을 부른다
self.timer = self.create_timer(0.5, self.on_timer)
def on_timer(self):
msg = String()
msg.data = 'hello'
self.pub.publish(msg)
def main():
rclpy.init()
node = Talker()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
구독 노드
import와 main의 형태는 발행 노드와 동일하다. 타이머는 사용하지 않으며, 메시지가 도착하면 콜백이 호출된다.
class Listener(Node):
def __init__(self):
super().__init__('listener')
# 타입과 토픽 이름이 발행 쪽과 같아야 한다
self.sub = self.create_subscription(
String, 'chatter', self.on_message, 10)
def on_message(self, msg):
self.get_logger().info(f'받음: {msg.data}')
인자
create_publisher(타입, 토픽, QoS): QoS 자리에 정수를 지정하면 큐 깊이만 그 값이 되고 나머지는 기본값이다.create_subscription(타입, 토픽, 콜백, QoS): 메시지가 도착할 때마다 콜백을 호출한다.create_timer(주기, 콜백): 주기의 단위는 초이다.