1292.51 IfThenElse 제어 노드의 동작 원리
1. IfThenElse 노드의 정의
IfThenElse 노드는 행동 트리(Behavior Tree)의 제어 흐름 노드 중 하나로, 프로그래밍 언어의 조건 분기(conditional branching) 구문과 동일한 의미론을 구현한다. 이 노드는 정확히 2개 또는 3개의 자식을 가지며, 첫 번째 자식의 반환 상태에 따라 두 번째 자식(then 분기) 또는 세 번째 자식(else 분기)을 실행한다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 자식 구조
IfThenElse 노드는 다음의 자식 구조를 가진다.
| 인덱스 | 역할 | 설명 |
|---|---|---|
| 0 | 조건 (if) | 분기 조건을 평가하는 자식 |
| 1 | then 분기 | 조건이 Success일 때 실행되는 자식 |
| 2 (선택적) | else 분기 | 조건이 Failure일 때 실행되는 자식 |
3. 알고리즘
IfThenElse 노드의 동작을 의사 코드로 표현하면 다음과 같다.
function IfThenElse.tick():
if child_selected == NONE:
condition_status = child[0].tick()
if condition_status == Success:
child_selected = 1 // then 분기
else if condition_status == Failure:
if child[2] exists:
child_selected = 2 // else 분기
else:
return Failure
else:
return condition_status // Running
return child[child_selected].tick()
이 알고리즘의 핵심은 조건 자식(인덱스 0)의 평가가 한 번만 수행된다는 것이다. 조건이 평가되어 분기가 선택되면, 이후의 tick에서는 선택된 분기의 자식만이 tick을 수신한다. 조건 자식은 재평가되지 않는다 (Faconti, 2024).
4. 실행 흐름
4.1 조건이 Success를 반환하는 경우
IfThenElse [ITE1]
├─ Condition [C1: 목표 근접 여부]
├─ Action [A1: 정밀 접근] ← then 분기
└─ Action [A2: 고속 이동] ← else 분기
| Tick | C1 | 선택된 분기 | 실행 자식 | ITE1 반환 |
|---|---|---|---|---|
| t_1 | Success | then (A1) | A1 | Running |
| t_2 | (미평가) | then (A1) | A1 | Running |
| t_3 | (미평가) | then (A1) | A1 | Success |
tick t_1에서 C1이 Success를 반환하면, then 분기(A1)가 선택된다. tick t_2 이후에는 C1이 재평가되지 않고, A1만이 tick을 수신한다.
4.2 조건이 Failure를 반환하는 경우
| Tick | C1 | 선택된 분기 | 실행 자식 | ITE1 반환 |
|---|---|---|---|---|
| t_1 | Failure | else (A2) | A2 | Running |
| t_2 | (미평가) | else (A2) | A2 | Success |
C1이 Failure를 반환하면, else 분기(A2)가 선택되어 실행된다.
4.3 else 분기가 없는 경우
else 분기(세 번째 자식)가 정의되지 않은 상태에서 조건이 Failure를 반환하면, IfThenElse 노드는 즉시 Failure를 반환한다.
5. 조건의 일회성 평가
IfThenElse 노드의 중요한 특성은 조건 자식이 한 번만 평가된다는 것이다. 분기가 선택된 이후에는 환경이 변화하여 조건의 결과가 달라질 수 있더라도, 이미 선택된 분기가 유지된다. 이 특성은 ReactiveSequence나 ReactiveFallback과 같은 반응형 노드와 대조적이며, 한 번 결정된 분기를 안정적으로 수행하여야 하는 경우에 적합하다.
분기가 완료(Success 또는 Failure 반환)되면 IfThenElse 노드의 내부 상태가 초기화되며, 다음 tick에서 조건이 다시 평가된다.
6. Sequence-Fallback 조합과의 비교
IfThenElse의 동작은 Sequence와 Fallback의 조합으로도 구현할 수 있다.
// IfThenElse와 동등한 구조
Fallback
├─ Sequence
│ ├─ Condition [C1]
│ └─ Action [A1: then 분기]
└─ Action [A2: else 분기]
그러나 이 조합은 일반 Fallback을 사용할 경우 A1이 Running을 반환한 후 다음 tick에서 C1이 재평가되지 않으므로, IfThenElse와 동일한 동작을 보장하기 위해서는 추가적인 고려가 필요하다. IfThenElse 노드는 이러한 패턴을 단일 노드로 명시적으로 표현하여 설계 의도의 명확성을 높인다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
7. 로봇 공학에서의 활용
7.1 모드 기반 행동 전환
로봇이 특정 조건에 따라 서로 다른 행동 모드를 수행하는 경우에 IfThenElse 노드가 활용된다.
IfThenElse
├─ Condition: 실내 환경 여부
├─ Action: 실내 항법 수행 ← then
└─ Action: 실외 항법 수행 ← else
7.2 초기 조건에 따른 행동 분기
임무 시작 시 한 번 평가되는 초기 조건에 따라 이후의 행동이 결정되는 경우에 적합하다. 조건이 한 번만 평가되므로, 임무 수행 중 조건이 변하더라도 이미 선택된 행동이 안정적으로 수행된다.
참고 문헌
- 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/