Precondition의 조건 미충족 시 동작 (Precondition's Behavior When Condition Is Not Met)

Precondition의 조건 미충족 시 동작 (Precondition’s Behavior When Condition Is Not Met)

1. 개요

Precondition 데코레이터의 스크립트 표현식이 거짓으로 평가되면, 자식 노드를 tick하지 않고 사전에 지정된 반환 상태를 즉시 반환한다. 반환되는 상태는 사용된 스크립트 속성의 유형에 따라 결정되며, SKIPPED, FAILURE, SUCCESS 중 하나이다.

2. 속성별 조건 미충족 시 반환 상태

2.1 _skipIf 속성

조건이 이면 자식을 skip한다.

조건 결과동작반환 상태
true자식 skipSKIPPED
false자식 tick자식의 상태
<Action ID="ComputePath"
        _skipIf="path_already_valid == true"/>

2.2 _failureIf 속성

조건이 이면 FAILURE를 반환한다.

조건 결과동작반환 상태
true자식 skipFAILURE
false자식 tick자식의 상태
<Action ID="Navigate"
        _failureIf="battery_level < 0.1"/>

2.3 _successIf 속성

조건이 이면 SUCCESS를 반환한다.

조건 결과동작반환 상태
true자식 skipSUCCESS
false자식 tick자식의 상태
<Action ID="WaitForEvent"
        _successIf="event_received == true"/>

2.4 _while 속성

조건이 거짓이면 자식을 skip한다.

조건 결과동작반환 상태
true자식 tick자식의 상태
false자식 skipSKIPPED
<Action ID="FollowPath"
        _while="is_path_valid == true"/>

3. SKIPPED 상태의 제어 노드에서의 처리

BehaviorTree.CPP 4.x에서 SKIPPED 상태는 제어 노드에서 다음과 같이 처리된다.

제어 노드SKIPPED 처리
Sequence해당 자식을 건너뛰고 다음 자식으로 진행
Fallback해당 자식을 건너뛰고 다음 자식으로 진행
ReactiveSequence해당 자식을 건너뛰고 다음 자식으로 진행

SKIPPEDSUCCESSFAILURE도 아닌 제3의 상태로, “이 노드는 실행되지 않았다“는 의미를 전달한다.

4. 자식이 RUNNING 상태일 때의 조건 미충족

자식이 이전 tick에서 RUNNING을 반환한 상태에서, 다음 tick에서 Precondition 조건이 미충족되면 자식을 halt하여야 한다.

Tick N:   조건 충족 → 자식 tick → RUNNING
Tick N+1: 조건 미충족 → 자식 halt → SKIPPED/FAILURE 반환

이는 _while 속성에서 특히 중요하다. _while 조건이 거짓이 되면, 실행 중인 자식을 halt하고 SKIPPED를 반환한다.

5. 활용 사례

5.1 조건부 경로 재계산

<Sequence>
    <Action ID="ComputePath"
            _skipIf="path_valid == true"
            goal="{target}" path="{current_path}"/>
    <Action ID="FollowPath" path="{current_path}"/>
</Sequence>

경로가 유효하면 재계산을 skip하고 기존 경로를 추종한다.

5.2 배터리 부족 시 즉시 실패

<Action ID="StartMission"
        _failureIf="battery_level < 0.15"/>

5.3 조건 유지 중에만 실행

<Action ID="FollowPath"
        _while="is_localized == true"/>

위치 추정이 유효한 동안에만 경로를 추종한다.

6. 설계 시 고려 사항

6.1 SKIPPED와 FAILURE의 의미론적 차이

_skipIf에 의한 SKIPPED는 “조건에 의해 실행이 불필요“하다는 의미이며, _failureIf에 의한 FAILURE는 “조건에 의해 실행이 불가“하다는 의미이다. 상위 제어 노드에서의 처리가 다르므로 적절한 속성을 선택하여야 한다.

6.2 자식 halt의 안전성

_while 조건이 거짓이 되어 자식을 halt할 때, 자식의 halt() 메서드가 올바르게 구현되어 있어야 한다.

7. 참고 문헌

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

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