1291.42 Running 반환 상태의 의미

1. Running 상태의 정의

Running은 행동 트리(Behavior Tree, BT) 노드가 Tick 신호를 처리한 후, 위임된 작업이 아직 진행 중이며 최종 결과가 확정되지 않았음을 부모 노드에게 보고하는 반환 상태이다. Running은 행동 트리의 삼진 상태 체계 \mathcal{S} = \{\text{Success}, \text{Failure}, \text{Running}\}에서 비종결적(non-terminal) 과도 상태를 나타내는 유일한 상태이다.

Success와 Failure가 작업의 완료를 나타내는 종결 상태(terminal status)인 반면, Running은 작업이 완료와 실패 사이의 중간 과정에 있음을 나타낸다. 형식적으로 정의하면 다음과 같다.

\text{tick}_t(N) = \text{Running} \iff N\text{의 작업이 시각 } t \text{에서 미완료이며, 후속 Tick에서의 재평가가 필요함}

2. Running 상태의 설계 근거

Running 상태는 로봇 시스템의 물리적 시간 제약에 대응하기 위하여 설계된 상태이다. 로봇의 행동은 물리적 과정(physical process)이므로, 대부분의 행동은 단일 Tick 주기 내에 완료되지 않는다. 예를 들어, 지점 A에서 지점 B로의 이동은 수 초에서 수 분이 소요되며, 이 기간은 행동 트리의 Tick 주기(일반적으로 10ms~100ms)보다 훨씬 길다.

Running 상태가 존재하지 않는 이진 상태 체계에서는 다음 두 가지 방식 중 하나를 선택하여야 한다.

첫째, 행동이 완료될 때까지 호출 스레드를 차단(blocking)하는 방식이다. 이 경우 하나의 액션 노드가 실행되는 동안 행동 트리 전체의 Tick 순회가 중단되므로, 환경 변화에 대한 반응이 불가능해진다. 이는 행동 트리의 핵심 설계 목표인 반응성(reactivity)을 근본적으로 훼손한다.

둘째, 행동을 단일 Tick 내에 완료되는 미세 단위로 분할하는 방식이다. 이 경우 행동의 분할 단위가 지나치게 세밀해져야 하므로, 설계 복잡도가 급격히 증가하며 실용성이 저하된다.

Running 상태는 이 두 가지 방식의 한계를 해소한다. 노드가 Running을 반환하면 호출 스레드를 해제하여 Tick 순회가 계속될 수 있으며, 동시에 해당 행동은 백그라운드에서 계속 진행된다.

3. Running 상태의 동작 메커니즘

3.1 비차단 실행 모델

Running 상태는 비차단(non-blocking) 실행 모델을 구현하는 핵심 메커니즘이다. 액션 노드가 Running을 반환하면, 해당 노드의 행동은 별도의 실행 문맥(스레드, 코루틴, 또는 외부 프로세스)에서 계속 진행되며, 행동 트리의 Tick 순회는 중단 없이 부모 노드로 복귀한다.

이 과정을 시간 축에서 표현하면 다음과 같다. 시각 t_0에서 액션 노드 A에 최초 Tick이 인가되어 행동이 개시되고 Running이 반환된다. 이후 t_1, t_2, \ldots, t_{k-1}의 각 Tick에서 행동의 진행 상태를 확인하여 Running을 반환한다. 시각 t_k에서 행동이 완료되면 Success 또는 Failure를 반환한다.

\text{tick}_{t_0}(A) = \text{Running}, \quad \text{tick}_{t_1}(A) = \text{Running}, \quad \ldots, \quad \text{tick}_{t_k}(A) \in \{\text{Success}, \text{Failure}\}

3.2 Running 상태와 제어 흐름 노드

제어 흐름 노드는 자식이 Running을 반환하면 일반적으로 자신도 Running을 반환한다. 이는 Running 상태가 리프 노드로부터 루트 노드까지 상향 전파됨을 의미한다.

Sequence 노드: 특정 자식이 Running을 반환하면 나머지 자식에 Tick을 전달하지 않고 즉시 Running을 반환한다. 다음 Tick 시, 표준 Sequence 노드는 Running을 반환한 자식의 위치를 기억하여 해당 자식부터 실행을 재개한다.

Fallback 노드: 특정 자식이 Running을 반환하면 나머지 자식에 Tick을 전달하지 않고 즉시 Running을 반환한다. 다음 Tick 시, Running을 반환한 자식부터 실행을 재개한다.

Parallel 노드: 특정 자식이 Running을 반환하더라도, 다른 자식들에 대한 Tick 전달은 계속된다. 성공 또는 실패 임계값에 도달하지 않은 상태에서 Running인 자식이 존재하면 Running을 반환한다.

4. Running 상태의 메모리 메커니즘

Running 상태와 밀접하게 관련된 개념이 메모리(memory) 메커니즘이다. 표준 Sequence 노드와 Fallback 노드는 이전 Tick에서 Running을 반환한 자식의 인덱스를 기억하고, 다음 Tick에서 해당 자식부터 실행을 재개한다. 이를 SequenceWithMemory 또는 StatefulSequence라고도 칭한다.

반면, ReactiveSequence와 ReactiveFallback은 메모리 메커니즘을 사용하지 않으며, 매 Tick마다 첫 번째 자식부터 재평가를 수행한다. 이 차이는 Running 상태의 처리에서 결정적인 행동 차이를 유발한다. ReactiveSequence에서는 이전에 Success를 반환한 선행 조건 노드가 다음 Tick에서 Failure를 반환하면, Running 중인 후방 액션 노드가 중단(preempt)될 수 있다.

5. Running 상태와 노드의 중단

Running 상태에 있는 노드가 외부 조건의 변화에 의하여 더 이상 필요하지 않게 되면, 해당 노드의 실행을 중단(halt)하여야 한다. 중단은 다음과 같은 상황에서 발생한다.

  • ReactiveSequence의 선행 조건 노드가 Failure를 반환하여, Running 중인 후방 노드의 실행이 무효화된 경우
  • Fallback 노드에서 우선순위가 높은 대안이 Success를 반환하여, Running 중인 하위 대안의 실행이 불필요해진 경우
  • 외부 시스템이 행동 트리의 실행을 전면 중단한 경우

BehaviorTree.CPP 라이브러리에서는 halt() 가상 메서드를 통하여 노드의 중단 처리를 구현한다. Running 상태에 있는 노드가 중단될 때, halt() 메서드가 호출되어 진행 중인 비동기 작업의 취소, 자원의 해제, 상태의 초기화 등의 정리 작업을 수행한다.

void MyAsyncAction::halt() {
    // 진행 중인 ROS2 액션 목표를 취소
    action_client_->async_cancel_goal(goal_handle_);
    // 노드 상태를 IDLE로 초기화
    setStatus(BT::NodeStatus::IDLE);
}

6. Running 상태의 설계 고려 사항

6.1 진행 상태의 확인 비용

Running 상태에 있는 노드는 매 Tick마다 행동의 진행 상태를 확인하여야 한다. 이 확인 작업이 과도한 연산 비용을 수반하지 않도록 설계하여야 한다. ROS2 액션을 사용하는 경우, 피드백(feedback) 메시지의 수신 여부를 확인하는 것이 효율적인 방법이다.

6.2 Running 상태의 지속 시간

Running 상태가 무한히 지속되는 것을 방지하기 위하여, 시간 제한(timeout)을 설정하는 것이 바람직하다. Timeout Decorator 노드를 활용하면, 지정된 시간 내에 Success 또는 Failure를 반환하지 않는 노드를 강제로 Failure 처리할 수 있다.

6.3 안전한 중단 처리

Running 상태에 있는 액션 노드는 언제든지 중단될 수 있으므로, halt() 메서드의 구현에 각별한 주의가 필요하다. 특히, 로봇의 물리적 행동(이동, 파지 등)이 중단될 때, 로봇이 안전한 상태로 복귀하도록 보장하여야 한다. 예를 들어, 이동 중 중단 시에는 로봇을 즉시 정지시키고, 파지 중 중단 시에는 그리퍼를 안전하게 개방하여야 한다.

7. 참고 문헌

  • Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Faconti, D. (2022). BehaviorTree.CPP 4.x Documentation. https://www.behaviortree.dev/
  • Iovino, M., Scukins, E., Styrud, J., Ögren, P., & Smith, C. (2022). “A Survey of Behavior Trees in Robotics and AI.” Robotics and Autonomous Systems, 154, 104096.
  • Colledanchise, M., & Ögren, P. (2017). “How Behavior Trees Modularize Hybrid Control Systems and Generalize Sequential Behavior Compositions, the Subsumption Architecture, and Decision Trees.” IEEE Transactions on Robotics, 33(2), 372–389.

버전: 2026-03-31