WhileDoElse 데코레이터의 동작 (Operation of the WhileDoElse Decorator)

WhileDoElse 데코레이터의 동작 (Operation of the WhileDoElse Decorator)

1. 개요

WhileDoElse는 BehaviorTree.CPP에서 제공하는 특수 제어 노드로, 3개의 자식 노드를 가지며 “조건이 참인 동안 행동 A를 실행하고, 거짓이 되면 행동 B를 실행“하는 while-do-else 패턴을 구현한다. 엄밀한 의미에서 단일 자식만을 가지는 데코레이터와는 구분되나, 조건부 실행의 맥락에서 함께 다루어진다.

2. 구조

WhileDoElse는 정확히 3개의 자식을 가진다.

자식 번호역할설명
자식 1조건 (Condition)매 tick마다 평가되는 조건
자식 2Do 행동조건이 참일 때 실행
자식 3Else 행동조건이 거짓일 때 실행

3. 동작 규칙

3.1 tick 흐름

1. 조건(자식 1)을 tick
2. 조건 = SUCCESS → Do 행동(자식 2)을 tick
3. 조건 = FAILURE → Else 행동(자식 3)을 tick

3.2 상세 동작

조건 결과동작WhileDoElse 반환
SUCCESSDo 행동(자식 2) tick자식 2의 상태
FAILUREElse 행동(자식 3) tick자식 3의 상태

3.3 반응적 재평가

WhileDoElse는 매 tick마다 조건을 재평가한다. 이전 tick에서 Do 행동이 RUNNING 상태였더라도, 다음 tick에서 조건이 거짓이 되면 Do 행동을 halt하고 Else 행동으로 전환한다.

Tick N:   조건=SUCCESS → Do 행동 tick → RUNNING
Tick N+1: 조건=FAILURE → Do 행동 halt → Else 행동 tick

이 동작은 ReactiveSequence와 유사한 반응적 특성을 가진다.

4. XML에서의 사용

<WhileDoElse>
    <!-- 자식 1: 조건 -->
    <Condition ID="IsPathClear"/>
    <!-- 자식 2: Do 행동 -->
    <Action ID="FollowPath"/>
    <!-- 자식 3: Else 행동 -->
    <Action ID="AvoidObstacle"/>
</WhileDoElse>

경로가 비어있으면 경로를 추종하고, 장애물이 감지되면 회피 행동을 실행한다.

5. ReactiveSequence + Fallback과의 비교

WhileDoElse의 동작은 다음 구조와 동치이다.

<!-- WhileDoElse와 동치 구조 -->
<ReactiveFallback>
    <ReactiveSequence>
        <Condition ID="IsPathClear"/>
        <Action ID="FollowPath"/>
    </ReactiveSequence>
    <Action ID="AvoidObstacle"/>
</ReactiveFallback>

WhileDoElse는 이 패턴을 더 명시적이고 간결하게 표현한다.

6. 활용 사례

6.1 배터리 수준에 따른 행동 전환

<WhileDoElse>
    <Condition ID="IsBatteryAbove" min_percentage="0.2"/>
    <Action ID="ContinueMission"/>
    <Action ID="ReturnToBase"/>
</WhileDoElse>

6.2 통신 상태에 따른 운용 모드 전환

<WhileDoElse>
    <Condition ID="IsCommsConnected"/>
    <Action ID="TeleoperatedMode"/>
    <Action ID="AutonomousSafeMode"/>
</WhileDoElse>

6.3 GPS 상태에 따른 내비게이션 전환

<WhileDoElse>
    <Condition ID="IsGpsFixAvailable"/>
    <Action ID="GpsNavigation"/>
    <Action ID="LidarNavigation"/>
</WhileDoElse>

7. 설계 시 고려 사항

7.1 정확히 3개의 자식 필요

WhileDoElse는 반드시 3개의 자식을 가져야 한다. 2개 이하이거나 4개 이상이면 오류가 발생한다.

7.2 행동 전환 시의 halt

조건이 변경되어 Do에서 Else로(또는 Else에서 Do로) 전환될 때, 이전에 실행 중이던 행동의 halt()가 호출된다. 전환되는 행동의 halt 처리가 올바르게 구현되어야 한다.

7.3 조건 노드의 부작용 금지

첫 번째 자식(조건)은 매 tick마다 재평가되므로, 부작용이 없어야 한다. 조건 노드의 일반 설계 원칙을 준수하여야 한다.

8. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

버전날짜변경 사항
v0.12026-04-05초안 작성