글 / ROS 2 기초

Rclpy 발행·구독 노드

Node를 상속하여 발행자·구독자·타이머를 등록하며, 등록한 콜백은 rclpy.spin이 실행되는 동안에만 호출된다.

작성일 · 읽는 시간 2분 · ROS 2 Jazzy 기준

노드의 기본 구조

rclpy는 ROS 2의 Python 클라이언트 라이브러리이다. 노드는 Node를 상속하여 정의하고, 생성자에서 발행자·구독자·타이머를 등록한다. 등록한 콜백은 rclpy.spin이 실행되는 동안에만 호출된다.

발행 노드

pythontalker.py
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()

main의 실행 순서와 콜백이 호출되는 구간

구독 노드

import와 main의 형태는 발행 노드와 동일하다. 타이머는 사용하지 않으며, 메시지가 도착하면 콜백이 호출된다.

pythonlistener.py
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}')

chatter 토픽을 거치는 talker 노드와 listener 노드의 구성

인자

  • create_publisher(타입, 토픽, QoS): QoS 자리에 정수를 지정하면 큐 깊이만 그 값이 되고 나머지는 기본값이다.
  • create_subscription(타입, 토픽, 콜백, QoS): 메시지가 도착할 때마다 콜백을 호출한다.
  • create_timer(주기, 콜백): 주기의 단위는 초이다.