1292.52 WhileDoElse 제어 노드의 동작 원리

1. WhileDoElse 노드의 정의

WhileDoElse 노드는 행동 트리(Behavior Tree)의 제어 흐름 노드 중 하나로, 프로그래밍 언어의 while-do-else 구문과 유사한 의미론을 구현한다. 이 노드는 정확히 2개 또는 3개의 자식을 가지며, 매 tick마다 첫 번째 자식(조건)을 재평가하여 조건이 유지되는 동안 두 번째 자식(do 분기)을 실행하고, 조건이 실패하면 세 번째 자식(else 분기)을 실행한다. IfThenElse 노드와 달리, WhileDoElse 노드는 매 tick마다 조건을 재평가하는 반응형(reactive) 특성을 가진다 (Faconti, BehaviorTree.CPP Documentation, 2024).

2. 자식 구조

WhileDoElse 노드는 다음의 자식 구조를 가진다.

인덱스역할설명
0조건 (while)매 tick마다 재평가되는 조건 자식
1do 분기조건이 Success인 동안 실행되는 자식
2 (선택적)else 분기조건이 Failure일 때 실행되는 자식

3. 알고리즘

WhileDoElse 노드의 동작을 의사 코드로 표현하면 다음과 같다.

function WhileDoElse.tick():
    condition_status = child[0].tick()

    if condition_status == Success:
        halt_child_if_running(2)  // else 분기 중단
        return child[1].tick()     // do 분기 실행
    else if condition_status == Failure:
        halt_child_if_running(1)  // do 분기 중단
        if child[2] exists:
            return child[2].tick() // else 분기 실행
        else:
            return Failure
    else:
        return condition_status    // Running

이 알고리즘의 핵심적 특성은 조건 자식이 매 tick마다 재평가된다는 것이다. 조건의 결과에 따라 do 분기와 else 분기 사이의 전환이 매 tick마다 발생할 수 있으며, 전환 시 이전 분기에 halt가 요청된다 (Faconti, 2024).

4. IfThenElse 노드와의 차이

WhileDoElse 노드와 IfThenElse 노드의 근본적인 차이는 조건의 재평가 여부에 있다.

속성IfThenElseWhileDoElse
조건 평가 횟수한 번매 tick마다
분기 전환불가 (한 번 결정)매 tick마다 가능
halt 발생없음분기 전환 시 발생
반응성비반응형반응형

IfThenElse가 일반 Sequence/Fallback에 대응한다면, WhileDoElse는 ReactiveSequence/ReactiveFallback에 대응하는 반응형 변형이다.

5. 실행 흐름 예제

다음의 WhileDoElse 노드를 고려한다.

WhileDoElse [WDE1]
 ├─ Condition [C1: 배터리 잔량 > 10%]
 ├─ Action [A1: 임무 수행]          ← do 분기
 └─ Action [A2: 충전소로 복귀]      ← else 분기

5.1 조건 유지 상태

TickC1실행 분기WDE1 반환
t_1SuccessA1 (do)Running
t_2SuccessA1 (do)Running

매 tick마다 C1이 재평가되며, Success를 유지하는 동안 A1이 계속 실행된다.

5.2 조건 변화에 의한 분기 전환

TickC1실행 분기WDE1 반환비고
t_3FailureA2 (else)RunningA1에 halt 요청, A2 새로 시작

tick t_3에서 배터리 잔량이 10% 이하로 감소하여 C1이 Failure를 반환한다. Running 상태의 A1에 halt가 요청되고, else 분기인 A2가 새로 활성화된다.

5.3 조건 복원에 의한 재전환

TickC1실행 분기WDE1 반환비고
t_4SuccessA1 (do)RunningA2에 halt 요청, A1 새로 시작

배터리가 충전되어 C1이 다시 Success를 반환하면, A2에 halt가 요청되고 A1이 새로 활성화된다.

6. ReactiveSequence와의 관계

WhileDoElse의 do 분기 동작은 ReactiveSequence와 유사하다. 다음 두 구조는 기능적으로 동등하다.

// WhileDoElse (else 분기 없음)
WhileDoElse
 ├─ Condition [C1]
 └─ Action [A1]

// ReactiveSequence
ReactiveSequence
 ├─ Condition [C1]
 └─ Action [A1]

두 구조 모두 매 tick마다 C1을 재평가하고, C1이 Failure를 반환하면 A1에 halt를 요청하고 Failure를 반환한다. 그러나 WhileDoElse는 else 분기를 통해 조건 실패 시의 대안 행동을 명시적으로 지정할 수 있다는 점에서 ReactiveSequence보다 표현력이 높다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

7. 분기 전환 시의 Halt 처리

WhileDoElse에서 분기 전환이 발생하면, 이전 분기의 Running 상태 자식에 halt가 요청된다. 이 halt는 동일한 tick 내에서 동기적으로 처리되며, halt 완료 후 새로운 분기의 자식에 tick이 전달된다.

단일 tick 내의 처리 순서는 다음과 같다.

  1. 조건 자식 평가
  2. 이전 분기의 자식에 halt 요청 (분기 전환이 발생한 경우)
  3. 새로운 분기의 자식에 tick 전달
  4. 새로운 분기의 반환 상태를 WhileDoElse의 반환 상태로 전파

8. 로봇 공학에서의 활용

8.1 조건부 행동 유지와 대안 행동

WhileDoElse는 특정 조건이 유지되는 동안 주요 행동을 수행하되, 조건이 실패하면 즉시 대안 행동으로 전환하여야 하는 패턴에 적합하다. 배터리 잔량, 통신 상태, 안전 조건 등의 동적 조건에 따라 임무 수행과 복귀/대기 행동 사이를 전환하는 경우가 대표적이다.

8.2 모드 전환

로봇의 동작 모드를 조건에 따라 동적으로 전환하는 설계에 활용된다. 조건이 유지되는 동안 정상 모드로 동작하고, 조건이 실패하면 안전 모드 또는 퇴화 모드(degraded mode)로 전환한다.


참고 문헌

  • 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/