들어가기 전에
rclpy.spin
rclpy.spin(node) 함수는 주어진 노드를 실행하여, ROS 2 시스템에서 이벤트(메시지 수신, 서비스 요청 등)를 처리할 수 있게 합니다.
- 이 함수는
단일 스레드에서 실행되며, 지정된 노드에 대한 콜백만 처리
spin은 실행되는 동안 해당 노드의 콜백을 계속해서 폴링하며, 새로운 이벤트가 발생하면 해당 콜백을 실행합니다.
spin은 단순한 사용 사례에 적합하며, 복잡한 멀티태스킹이 필요하지 않은 경우 사용됩니다.
SingleThreadedExecutor
SingleThreadedExecutor는 rclpy.spin과 유사하게 작동하지만, 명시적으로 Executor 인스턴스를 생성하고 관리할 수 있는 더 많은 제어를 제공
- 이 Executor는
단일 스레드로 운영되어 여러 노드의 콜백을 순차적으로 처리
- 사용자는 여러 노드를 Executor에 추가할 수 있으며, Executor는 등록된 노드의 콜백을 차례로 실행
- 복수의 노드를 관리하지만, 멀티스레딩을 필요로 하지 않는 상황에 적합
MultiThreadedExecutor
MultiThreadedExecutor는 여러 스레드를 사용하여 동시에 여러 노드의 콜백을 처리
- 이는
SingleThreadedExecutor와 비슷하지만, 병렬 실행을 통해 더 높은 처리량과 반응성을 제공
- 복잡한 애플리케이션에서 여러 노드가 동시에 빠르게 응답해야 하는 경우에 이상적입니다.
MultiThreadedExecutor는 사용자가 스레드의 개수를 설정할 수 있어, 자원 사용과 성능 사이의 균형을 맞출 수 있습니다.
비교 요약
rclpy.spin은 간단한 사용 사례에 적합하며, 단일 노드의 이벤트를 처리하는 데 사용됩니다.
SingleThreadedExecutor는 여러 노드를 관리할 수 있지만, 모든 작업을 단일 스레드에서 순차적으로 처리합니다.
MultiThreadedExecutor는 복잡한 애플리케이션에 적합하며, 여러 노드의 이벤트를 동시에 처리할 수 있는 병렬 처리 능력을 제공합니다.
본문
SingleThreadedExecutor
SingleThreadedExecutor는 이름에서 알 수 있듯이 단일 스레드에서 콜백을 실행
- 이는 모든 콜백이 순차적으로 실행됨을 의미하며, 동시성이 필요하지 않은 간단한 어플리케이션에 적합
- 콜백이 긴 작업을 수행하지 않도록 주의해야 합니다.
- 그렇지 않으면 다른 콜백의 실행이 지연될 수 있습니다.
import rclpy
from rclpy.executors import SingleThreadedExecutor
def main(args=None):
rclpy.init(args=args)
executor = SingleThreadedExecutor()
executor.add_node(your_node)
try:
executor.spin()
finally:
executor.remove_node(your_node)
rclpy.shutdown()
MultiThreadedExecutor
MultiThreadedExecutor는 여러 스레드에서 콜백을 동시에 실행할 수 있음
- 이를 통해 높은 수준의 동시성을 달성할 수 있으며, 복잡한 어플리케이션 또는 높은 처리량이 요구되는 시스템에 적합
MultiThreadedExecutor를 사용하면 각 콜백이 별도의 스레드에서 실행될 수 있어, 하나의 콜백이 긴 작업을 수행하는 동안 다른 콜백이 대기하지 않고 실행될 수 있습니다.
import rclpy
from rclpy.executors import MultiThreadedExecutor
def main(args=None):
rclpy.init(args=args)
executor = MultiThreadedExecutor()
executor.add_node(your_node)
try:
executor.spin()
finally:
executor.remove_node(your_node)
rclpy.shutdown()
MultiThreadedExecutor의 생성자는 선택적으로 num_threads 인자를 받아 실행에 사용할 스레드의 수를 지정할 수 있습니다. 지정하지 않으면 기본적으로 사용 가능한 CPU 코어 수에 비례하여 스레드 수가 결정됩니다.
What are the advantages and limitations of using the rclpy.spin() function in ROS 2 for processing events and executing callbacks compared to more complex multitasking approaches?
poppy playtime chapter 3