1292.33 Sequence 노드의 성공 조건
1. 성공 조건의 정의
Sequence 노드의 성공 조건(success condition)은 명확하고 단일하다: Sequence 노드가 Success를 반환하기 위해서는 자신의 모든 자식 노드가 예외 없이 Success를 반환하여야 한다. 이 조건은 Sequence 노드의 논리곱(logical AND) 의미론에서 직접적으로 도출되며, 자식 노드가 하나라도 Failure 또는 Running을 반환하면 Sequence 노드는 Success를 반환할 수 없다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
2. 형식적 정의
Sequence 노드 S가 자식 노드 c_1, c_2, \ldots, c_N을 가질 때, S가 Success를 반환하기 위한 필요충분조건은 다음과 같다.
\text{status}(S) = Success \iff \forall\, i \in \{1, 2, \ldots, N\} : \text{status}(c_i) = Success
이 조건은 보편 양화(universal quantification)로 표현되며, 모든 자식이 성공하여야 한다는 전칭 조건(universal condition)이다. 자식이 하나도 없는 Sequence 노드(N = 0)의 경우, 공허한 참(vacuous truth)에 의해 Success를 반환한다.
단일 Tick 내에서의 성공
모든 자식이 단일 tick 내에서 즉시 Success를 반환하는 경우, Sequence 노드도 동일한 tick 내에서 Success를 반환한다. 이 경우의 실행 흐름은 다음과 같다.
c_1(S) \rightarrow c_2(S) \rightarrow c_3(S) \rightarrow \cdots \rightarrow c_N(S) \rightarrow S(Success)
이 실행 흐름에서 모든 자식에 대한 tick 전달과 반환 상태 수신이 단일 tick 내에 동기적으로 완료된다. 조건 노드와 같이 즉시 반환되는 노드만으로 구성된 Sequence 노드에서 이 패턴이 전형적으로 나타난다.
3. 다중 Tick에 걸친 성공
자식 노드 중 하나 이상이 Running을 반환하는 경우, Sequence 노드의 성공은 다수의 tick에 걸쳐 달성된다. 상태 기억형 Sequence 노드에서 이 과정은 다음과 같이 진행된다.
Tick t_1: c_1(Success) \rightarrow c_2(Running) \rightarrow S(Running)
Tick t_2: c_2(Success) \rightarrow c_3(Running) \rightarrow S(Running)
Tick t_3: c_3(Success) \rightarrow S(Success)
이 예제에서 Sequence 노드는 tick t_3에서 비로소 Success를 반환한다. 성공 조건의 충족이 시간적으로 분산되어 있으나, 최종적으로 모든 자식이 Success를 반환하였다는 조건은 동일하게 충족된다 (Faconti, BehaviorTree.CPP Documentation, 2024).
4. 성공 조건과 자식 노드의 실행 보장
Sequence 노드의 성공 조건이 충족되었다는 것은, 해당 Sequence 노드의 모든 자식이 최소 한 번 이상 tick을 수신하여 실행되었음을 보장한다. 이는 성공 조건의 정의로부터 필연적으로 도출되는 성질이다. 자식 c_i가 Success를 반환하기 위해서는 반드시 tick을 수신하여 실행되어야 하기 때문이다.
\text{status}(S) = Success \implies \forall\, i \in \{1, \ldots, N\} : \text{ticked}(c_i)
이 성질은 Sequence 노드를 다단계 임무(multi-step mission)의 모델링에 활용할 때 중요한 의미를 가진다. Sequence 노드가 Success를 반환하였다면, 설계된 모든 단계가 성공적으로 수행되었음이 보장되기 때문이다.
성공 조건의 순서 의존성
Sequence 노드의 성공은 자식의 실행 순서에 의존한다. 자식 c_i가 Success를 반환한 시점에서 c_{i+1}에 tick이 전달되므로, 선행 자식의 성공이 후행 자식의 실행을 위한 전제 조건이 된다. 이 순서 의존성에 의해, Sequence 노드의 성공은 단순히 “모든 자식이 성공하였다“는 조건을 넘어서 “모든 자식이 정해진 순서대로 성공하였다“는 강화된 조건을 내포한다.
이를 형식적으로 표현하면 다음과 같다. Sequence 노드가 Success를 반환한 경우, 각 자식 c_i(i \geq 2)의 onStart() 또는 onRunning() 콜백은 c_{i-1}가 Success를 반환한 이후에 호출되었다.
\text{completed}(c_{i-1}, Success) \prec \text{started}(c_i) \quad \forall\, i \in \{2, \ldots, N\}
여기서 \prec는 시간적 선행 관계(temporal precedence relation)를 나타낸다.
5. 로봇 공학에서의 성공 조건 활용
5.1 다단계 임무의 완료 확인
로봇이 수행하는 다단계 임무를 Sequence 노드로 모델링하면, Sequence 노드의 Success 반환이 곧 전체 임무의 성공적 완료를 의미한다. 예를 들어, “목표 지점으로 이동 → 물체 인식 → 물체 파지 → 복귀“라는 임무를 Sequence 노드로 구성하면, Sequence가 Success를 반환한 경우 네 단계가 모두 순서대로 성공적으로 수행되었음이 보장된다.
5.2 선행 조건의 누적적 검증
복수의 조건 노드를 Sequence 노드의 자식으로 배치하면, 모든 조건이 동시에 성립하는 경우에만 Sequence가 Success를 반환하는 복합 조건(compound condition)을 구현할 수 있다. 이는 논리곱 연산의 직접적 구현이다.
Sequence
├─ Condition: 배터리 잔량 > 20%
├─ Condition: GPS 신호 수신 중
└─ Condition: 긴급 정지 명령 없음
이 구조에서 Sequence가 Success를 반환하면, 세 조건이 모두 충족되었음이 보장된다 (Colledanchise & Ögren, 2018).
5.3 성공 후의 상태 초기화
Sequence 노드가 Success를 반환하면 내부의 자식 인덱스 포인터가 0으로 초기화된다. 따라서 다음 tick에서 Sequence는 다시 첫 번째 자식부터 실행을 시작한다. 이 초기화는 Sequence 노드가 반복적으로 사용될 수 있도록 보장하며, 이전 실행 주기의 성공 결과가 다음 실행 주기에 잔존하지 않도록 한다.
참고 문헌
- Colledanchise, M. & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/