
| 이름 | 설명 |
|---|---|
| 노드 | ROS2 시스템의 기본 실행 단위, 각각 고유의 이름을 가짐 |
| 퍼블리셔와 서브스크라이버 | 퍼블리셔는 데이터를 토픽을 통해 전송하고, 서브스크라이버는 이를 수신, rclpy에서는 간단한 API로 pub/sub를 설정 |
| 서비스와 클라이언트 | 서비스는 요청-응답 방식의 통신을 처리하며, 클라이언트는 특정 요청을 보내고 응답 대기 |
| 액션 | 긴 시간 동안 실행되는 작업을 요청하고 결과를 받을 수 있는 기능, motion planning과 같은 작업에 사용 |
| 파라미터 서버 | ROS2 시스템에서 전역적 혹은 로컬 파라미터를 설정하고 가져올 수 있는 시스템 |
멀티스레드 지원
- rclpy 멀티스레드 실행 지원
- MultiThreadExecutor
from rclpy.executors import MultiThreadedExecutor
executor = MultiThreadedExecutor()
executor.add_node(node)
executor.spin()
비동기 서비스 호출
- rclpy는 asyncio와 통합 가능 --> 비동기적으로 서비스를 호출하고 처리
from rclpy.executors import MultiThreadedExecutor
executor = MultiThreadedExcutor()
executor.add_node(node)
executor.spin()

ROS2에서 callback을 관리하고 실행하는 중요한 개념
Executor가 콜백을 모니터링하고 적절한 시점에 실행하는 역할 수행

역할
종류
SingleThreadedExecutor : 단일 스레드에서 콜백을 실행
- 하나의 스레드만 사용하여 이벤트를 처리, 콜백 완료 전까지 다른 작업을 처리x
- 콜백 충돌을 방지하기 위해서 사용, 처리 속도 중요 x
from rclpy.executors
import SingleThreadedExecutor
excutor = SingleThreadedExecutor()
executor.add_node(my_node)
executor.spin()
MultiThreadedExecutor: 여러 스레드에서 콜백을 병렬로 실행
from rclpy.executors import MultiThreadedExecutor
executor = MultiThreadedExecutor(num_threads = 4)
executor.add_node(my_node)
executor.spin()
동작 순서

관계
멀티스레드와의 연관성
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
from rclpy.executors import MultiThreadedExecutor
import time
class PublisherNode(Node):
def __init__(self):
super().__init__('example_publisher')
self.publisher_ = self.create_publisher(String, 'example_topic', 10)
self.timer = self.create_timer(1.0, self.timer_callback) # 1초마다 콜백
self.get_logger().info('Publisher Node has been started.')
def timer_callback(self):
msg = String()
msg.data = 'Hello, ROS 2 with Executor!'
self.publisher_.publish(msg)
self.get_logger().info(f'Published: "{msg.data}"')
def main(args=None):
rclpy.init(args=args)
# 퍼블리셔 노드 생성
publisher_node = PublisherNode()
# MultiThreadedExecutor 생성
executor = MultiThreadedExecutor()
# 퍼블리셔 노드를 Executor에 추가
executor.add_node(publisher_node)
try:
# executor를 사용해 노드를 실행
executor.spin()
except KeyboardInterrupt:
pass
finally:
# 노드와 executor 종료 처리
executor.shutdown()
publisher_node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()