관리 메뉴

개발자비행일지

[ROS] spin()과 spinOnce() 본문

▶ROS

[ROS] spin()과 spinOnce()

Cyber0946 2023. 12. 4. 18:02

ROS(로봇 운영 체제)에서 spin()과 spinOnce()은 노드(Node)가 실행될 때 사용되는 함수입니다. 

spin():

spin()은 노드(Node)가 계속해서 동작하도록 하는 함수입니다.
예를 들어, 로봇이 이동하거나 센서 데이터를 읽고 다른 노드와 통신하는 동안 노드가 중단되지 않고 계속 실행됩니다.
spin() 함수를 사용하면 노드가 자체적으로 루프(loop)를 돌면서 작업을 수행하며, 이벤트가 발생할 때까지 대기합니다.
노드가 계속해서 실행되어야 할 때 사용합니다.
spinOnce():

spinOnce()은 한 번만 노드(Node)를 실행하는 함수입니다.
노드가 실행되고 나면 프로그램의 제어가 다시 메인 루프로 돌아가기 때문에 노드가 한 번 실행된 후에는 멈출 수 있습니다.
예를 들어, 특정 이벤트가 발생할 때만 노드를 실행하고자 할 때 사용합니다.
spinOnce() 함수를 사용하면 노드가 한 번 실행된 후 다른 작업을 수행할 수 있습니다.
간단히 말하면, spin()은 계속해서 노드를 실행시키고, spinOnce()은 한 번만 실행시킨 후 다른 작업을 할 수 있게 해줍니다. 

spin()와 spinOnce()의 차이를 예시를 통해 더 자세히 설명해보겠습니다.

예시 1: spin()
가정: 로봇이 계속해서 움직이고 센서 데이터를 읽는 ROS 노드가 있다고 가정합니다.

while True:
    # 로봇 이동
    move_robot()
    
    # 센서 데이터 읽기
    sensor_data = read_sensor()
    
    # 다른 노드와 통신
    communicate_with_other_nodes()
    
    # 여기서 `spin()`을 호출하여 다른 이벤트를 기다립니다.
    rospy.spin()

이 예시에서 spin() 함수는 노드를 계속해서 실행시킵니다. 노드는 로봇을 움직이고 센서 데이터를 읽고 다른 노드와 통신하는 작업을 반복하면서, 중간에 spin()을 호출하여 다른 ROS 이벤트를 기다립니다. 로봇이 계속해서 동작하며 노드가 중단되지 않습니다.

예시 2: spinOnce() 가정: 로봇이 움직이다가 특정 이벤트(예: 버튼을 누를 때)가 발생했을 때만 노드를 실행해야 합니다.

while True:
    # 로봇 이동
    move_robot()
    
    # 센서 데이터 읽기
    sensor_data = read_sensor()
    
    # 다른 노드와 통신
    communicate_with_other_nodes()
    
    # 버튼 누를 때만 노드를 실행
    if button_is_pressed():
        # `spinOnce()` 함수를 호출하여 한 번만 노드를 실행시킵니다.
        rospy.spinOnce()

이 예시에서 spinOnce() 함수는 버튼을 누를 때만 노드를 한 번 실행시킵니다. 로봇은 계속해서 움직이고 센서 데이터를 읽지만, 노드가 실행되는 시점은 버튼을 눌렀을 때만입니다. 이후에는 다시 메인 루프로 돌아가서 다른 작업을 수행할 수 있습니다.

요약하면, spin()은 노드를 계속해서 실행시키며 이벤트가 발생할 때까지 대기하고, spinOnce()은 한 번만 노드를 실행시킵니다.

'▶ROS' 카테고리의 다른 글

Locomotion  (2) 2023.12.06