1292.17 Running 상태의 의미론적 정의
1. Running 상태의 기본 정의
행동 트리(Behavior Tree)에서 Running은 노드가 자신에게 부여된 작업의 실행을 시작하였으나 아직 완료하지 못하였음을 부모 노드에게 보고하는 반환 상태(Return Status)이다. Running은 노드의 작업이 현재 진행 중이며, 후속 tick에서 계속적인 실행이 필요함을 의미론적으로 표현한다.
Colledanchise와 Ogren(2018)의 형식적 정의에 따르면, 노드 N이 tick을 수신하였을 때 반환하는 상태 s \in \{Success, Failure, Running\} 중 Running은 유일한 비종결 상태(non-terminal status)에 해당한다. Success와 Failure가 노드 실행의 완결을 나타내는 종결 상태인 반면, Running은 실행의 지속을 나타내는 과도 상태(transient status)이다 (Colledanchise & Ogren, Behavior Trees in Robotics and AI, 2018).
2. Running의 의미론적 범주
2.1 비종결 상태로서의 Running
Running은 행동 트리의 반환 상태 체계에서 유일한 비종결 상태이다. 이 상태는 노드의 실행이 단일 tick 주기 내에 완료되지 않았으며, 결과의 확정을 위해 추가적인 tick의 수신이 필요함을 나타낸다. Running 상태의 존재는 행동 트리가 순수 불리언 논리(Boolean logic)를 넘어서 시간적 차원(temporal dimension)을 표현할 수 있게 하는 핵심 확장이다.
불리언 논리에서는 명제의 참/거짓이 즉시 결정되지만, 로봇 시스템에서의 행동은 물리적 시간을 소요한다. 로봇의 이동, 매니퓰레이션, 센서 데이터 처리 등의 작업은 단일 계산 주기 내에 완료될 수 없으며, Running 상태는 이러한 시간적 특성을 행동 트리의 형식 체계 내에서 표현하는 메커니즘이다.
2.2 삼치 논리로의 확장
Running 상태의 도입으로 행동 트리의 논리 체계는 이치 논리(two-valued logic)에서 삼치 논리(three-valued logic)로 확장된다. Success가 참(true), Failure가 거짓(false)에 대응하는 반면, Running은 “아직 결정되지 않음(undetermined)“에 대응한다. 이는 Kleene의 강한 삼치 논리(Kleene’s strong three-valued logic)와 구조적 유사성을 보이며, 제어 흐름 노드의 동작 규칙에서 이 유사성이 명확하게 드러난다 (Colledanchise & Ogren, 2018).
3. Running 상태와 비동기 실행
3.1 비동기 작업의 표현
Running은 본질적으로 비동기적(asynchronous) 작업을 동기적(synchronous) tick 메커니즘 내에서 표현하기 위한 의미론적 장치이다. 로봇 시스템에서 물리적 행위(예: 목표 지점으로의 이동, 물체 파지, 경로 계획)는 수 밀리초에서 수 분에 이르는 실행 시간을 필요로 한다. 행동 트리의 tick 주기는 일반적으로 수십 밀리초 단위로 설정되므로, 이러한 장기 실행 작업은 다수의 tick에 걸쳐 진행되어야 한다.
노드가 Running을 반환하면 행동 트리의 실행 엔진은 해당 노드가 다음 tick에서도 계속 실행되어야 함을 인지하고, 후속 tick에서 해당 노드에 다시 tick을 전달한다. 이 과정은 노드가 최종적으로 Success 또는 Failure를 반환할 때까지 반복된다.
3.2 Tick 주기와 Running의 관계
Running 상태는 tick 주기와 밀접하게 연결된 개념이다. 각 tick에서 Running을 반환한 노드는 자신의 작업 진행 상황을 내부적으로 갱신하고, 작업의 완료 여부를 판정한다. 작업이 완료되었으면 Success 또는 Failure를 반환하고, 아직 진행 중이면 다시 Running을 반환한다.
이 메커니즘을 통해 행동 트리는 블로킹(blocking) 없이 장기 실행 작업을 관리할 수 있다. 노드가 작업 완료를 기다리며 실행을 차단하는 대신 Running을 반환함으로써, 행동 트리의 상위 구조가 다른 노드의 상태를 확인하거나 반응적(reactive) 동작을 수행할 수 있는 기회를 제공한다.
4. 노드 유형별 Running의 의미
4.1 액션 노드에서의 Running
액션 노드(Action Node)가 Running을 반환하는 것은 해당 행위가 현재 수행 중이며 아직 결과가 확정되지 않았음을 의미한다. 이동 액션 노드의 경우 로봇이 목표 지점을 향해 이동 중이나 아직 도달하지 않은 상태를 나타낸다. 파지 액션 노드의 경우 그리퍼(gripper)가 대상 물체를 향해 접근 중이거나 파지 동작이 진행 중임을 의미한다.
동기 액션 노드(Synchronous Action Node)는 정의상 단일 tick 내에 실행이 완료되므로 Running을 반환하지 않는다. Running은 비동기 액션 노드(Asynchronous Action Node)에서만 발생하며, 이는 비동기 액션 노드의 본질적 특성이다.
4.2 조건 노드에서의 Running
조건 노드(Condition Node)는 일반적으로 Running을 반환하지 않는다. 조건 노드의 설계 원칙에 따르면, 조건의 평가는 즉각적(instantaneous)이어야 하며 부작용이 없어야 한다. 따라서 조건 노드는 tick을 수신하면 즉시 Success 또는 Failure를 반환한다. 이 원칙은 행동 트리의 반응성(reactivity)을 보장하는 데 핵심적인 역할을 수행한다.
4.3 제어 흐름 노드에서의 Running
제어 흐름 노드(Control Flow Node)가 Running을 반환한다는 것은 해당 노드의 자식 노드 중 하나가 Running을 반환하였음을 의미한다. 제어 흐름 노드는 자체적으로 장기 실행 작업을 수행하지 않으므로, Running은 항상 자식 노드로부터 전파(propagation)된 결과이다.
- Sequence 노드: 현재 실행 중인 자식 노드가 Running을 반환하면 Sequence 노드 자신도 Running을 반환하고, 해당 자식의 인덱스를 기억하여 다음 tick에서 같은 자식부터 실행을 재개한다.
- Fallback 노드: 현재 실행 중인 자식 노드가 Running을 반환하면 Fallback 노드 자신도 Running을 반환하고, 해당 자식의 인덱스를 기억한다.
- Parallel 노드: 자식 노드 중 하나 이상이 Running을 반환하고 성공/실패 임계값이 아직 충족되지 않으면 Running을 반환한다.
4.4 데코레이터 노드에서의 Running
대부분의 데코레이터 노드(Decorator Node)는 자식 노드의 Running 상태를 그대로 전파한다. 이는 Running이 작업의 진행 중 상태를 나타내므로, 이를 임의로 변환하면 실행의 의미론적 일관성이 훼손되기 때문이다. 다만, Timeout 데코레이터는 예외적으로 자식이 Running 상태에 머무는 시간을 감시하여, 지정된 시간이 초과되면 자식을 중단(halt)하고 Failure를 반환한다.
5. Running 상태의 전파 메커니즘
5.1 Running의 상향 전파
Running 상태는 리프 노드에서 루트 노드 방향으로 전파된다. 리프 노드의 비동기 액션이 Running을 반환하면, 이 상태는 부모 제어 흐름 노드를 통해 순차적으로 상위 계층으로 전달된다. 최종적으로 루트 노드가 Running을 수신하면, 행동 트리의 실행 엔진은 현재 tick 주기가 완료되었으며 다음 tick에서 트리의 재실행이 필요함을 인지한다.
5.2 Running과 실행 재개 지점
Running 상태의 핵심적 의미론적 기능은 실행 재개 지점(resumption point)의 표시이다. Sequence 노드나 Fallback 노드가 자식의 Running을 수신하면, 해당 자식의 인덱스를 내부 상태로 보존한다. 다음 tick에서는 첫 번째 자식부터 다시 실행하는 것이 아니라, Running을 반환한 자식부터 실행을 재개한다. 이 메커니즘은 이미 완료된 자식 노드의 불필요한 재실행을 방지하여 행동 트리의 실행 효율성을 보장한다.
단, ReactiveSequence와 ReactiveFallback 노드에서는 이 규칙이 적용되지 않는다. 반응형 노드는 Running 자식이 존재하더라도 매 tick마다 첫 번째 자식부터 재평가(re-evaluation)를 수행하여, 환경 변화에 대한 즉각적 반응성을 확보한다.
6. Running과 노드 생명주기의 관계
Running 상태에 있는 노드는 활성(active) 상태의 생명주기를 유지한다. BehaviorTree.CPP 라이브러리에서 노드가 처음 tick을 수신하면 onStart 콜백이 호출되고, Running을 반환한 후 다시 tick을 수신하면 onRunning 콜백이 호출된다. 이 두 콜백의 분리는 노드의 초기화 로직과 진행 중 로직을 명확히 구분할 수 있게 한다 (Faconti, BehaviorTree.CPP Documentation, 2024).
Running 상태의 노드가 외부 요인(부모 노드의 중단 요청 등)에 의해 중단될 경우, onHalted 콜백이 호출되어 진행 중이던 작업의 정리(cleanup)가 수행된다. 이는 Running 상태가 자원 점유(resource occupation)를 수반할 수 있으므로, 적절한 자원 해제 메커니즘이 필수적이기 때문이다.
7. Running의 형식적 표현
행동 트리의 형식적 의미론(formal semantics)에서 Running은 다음과 같이 정의된다. 노드 N의 실행 함수를 f_N이라 하고 환경 상태를 E라 하면, f_N(E) = Running은 노드 N이 환경 E하에서 실행을 개시하였으나 사후 조건(postcondition)의 충족 여부가 아직 결정되지 않았음을 나타낸다.
시간적 관점에서, Running은 노드 N의 실행이 시각 t_0에서 시작되어 현재 시각 t에서 아직 진행 중이며, 미래의 특정 시각 t_f > t에서 Success 또는 Failure로 종결될 것임을 나타내는 시간적 술어(temporal predicate)이다. 이를 선형 시간 논리(Linear Temporal Logic, LTL)의 형식으로 표현하면, Running은 \lnot terminated(N) \land \mathbf{F}(terminated(N)), 즉 “현재 종결되지 않았으나 미래에 종결될 것“이라는 시간적 속성에 대응한다 (Colledanchise & Ogren, 2018).
8. Running 상태의 설계적 함의
8.1 비블로킹 실행 모델
Running 상태의 도입은 행동 트리가 비블로킹(non-blocking) 실행 모델을 채택할 수 있게 한다. 전통적인 절차적 프로그래밍에서 장기 실행 함수는 완료될 때까지 호출자를 차단하지만, 행동 트리의 노드는 Running을 반환하여 제어권을 즉시 상위 구조에 반환한다. 이를 통해 행동 트리의 상위 계층은 다른 노드를 검사하거나, 환경 변화에 반응하는 등의 동작을 수행할 수 있다.
8.2 반응성과 Running의 관계
Running 상태는 행동 트리의 반응성(reactivity)과 직접적으로 연관된다. 반응형 제어 노드(ReactiveSequence, ReactiveFallback)는 Running 자식이 존재하는 동안에도 조건 노드를 재평가하여, 환경 변화에 즉각적으로 대응할 수 있다. 예를 들어, 이동 액션이 Running 상태에 있는 동안 장애물 감지 조건이 Failure로 변경되면, 반응형 노드는 이동 액션을 중단하고 대안적 행동을 실행할 수 있다.
참고 문헌
- Colledanchise, M. & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/