rclpy는 Python을 위한 ROS 클라이언트 라이브러리로, Python을 사용하여 ROS2 노드를 개발하고 상호작용할 수 있도록 지원하는 라이브러리이다.
ROS2의 구조는 다음과 같다.

✔ User code
✔ rclcpp / rclpy
✔ rcl (ROS Client Support Library)
✔ rmw (ROS Middleware Interface)
✔ rmw adapter
✔ Middleware
우리는 rlcpy를 통해 퍼블리셔/서브스크라이버, 서비스, 액션, 파라미터 등 통신에 필요한 로직을 구현할 수 있다. 노드에서 어떻게 실행이 되고 있는지 살펴보자.
import rclpy
from rclpy.node import Node
from std_msgs.msg import String # 추가: 메시지 타입을 임포트
class MyNode(Node):
def __init__(self):
super().__init__('my_node_name')
self.publisher = self.create_publisher(String, 'topic_name', 10)
self.timer = self.create_timer(1.0, self.timer_callback)
def timer_callback(self):
msg = String()
msg.data = 'Hello, ROS2!'
self.publisher.publish(msg)
self.get_logger().info('Publishing: "%s"' % msg.data)
def main(args=None):
rclpy.init(args=args)
node = MyNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == "__main__":
main()
1. rclpy.init(args=args) : 초기화
2. node = MyNode(): 노드 생성 및 설정
MyNode클래스의 인스턴스 생성create_publisher()를 통해 topic_name이라는 토픽에 String 타입의 메시지를 발행할 퍼블리셔 생성create_timer()를 사용해 1초마다 timer_callback 함수를 호출하여 메시지를 주기적으로 발행3. rclpy.spin(node) : 이벤트 루프 실행
4. node.destroy_node() : 노드 종료
5. rclpy.shutdown() : 클라이언트 라이브러리 종료
rclpy를 종료하고 노드와 관련된 모든 리소스를 해체하여 메모리 누수 방지 Executor는 rclpy에서 콜백함수를 관리하고 실행하는 역할을 한다. ROS2는 노드의 다양한 콜백 함수가 특정 이벤트를 발생할 때 실행한다. Executor는 이러한 이벤트를 감지하고, 적절한 콜백을 호출하여 실행하는 역할을 담당한다. 이를 통해 ROS2는 노드 시스템에서 비동기적으로 이벤트를 처리할 수 있다.

이벤트 감지 - 콜백을 큐에 수집 - 콜백 실행 순으로 동작
from rclpy.executors import SingleThreadedExecutor
executor = SingleThreadedExecutor()
executor.add_node(my_node)
executor.spin()
from rclpy.executors import MultiThreadedExecutor
executors = MultiThreadedExecutor(num_threads=4)
executor.add_node(my_node)
executor.spin()
Exectutor 는 콜백을 처리하는 관리자로, 콜백을 실행하는 규칙과 방식 정의spin은 해당 콜백을 계속 처리하도록 하는 루프 역할로, 규칙에 따라 Executor가 동작해주도록 해주는 역할
def main(args=None):
rclpy.init(args=args)
node = MyNode()
executor = rclpy.executors.SingleThreadedExecutor()
executor.add_node(node)
try:
executor.spin()
except KeyboardInterrupt:
pass
finally:
node.destroy_node()
rclpy.shutdown()
if __name == "__main__":
main()
SingleThreadedExecutor를 생성하여 콜백을 순차적으로 실행하여 executor.spin()으로 노드가 종료될때까지 콜백을 처리되도록 하였다.
| 구분 | Executor | spin |
|---|---|---|
| 역할 | 콜백 함수 관리 및 실행을 담당 | 이벤트 루프를 시작하여 노드가 종료될 때까지 콜백을 처리 |
| 설명 | 콜백을 스케줄링하고 처리할 스레드 방식을 결정 (SingleThreaded 또는 MultiThreaded) | Executor를 사용하여 이벤트 처리를 수행하고 노드를 활성화 상태로 유지 |
| 종류 | SingleThreadedExecutor, MultiThreadedExecutor | spin(), spin_once() |