1292.16 Failure 상태의 의미론적 정의

1. Failure 상태의 기본 정의

행동 트리(Behavior Tree)에서 Failure는 노드가 자신에게 부여된 작업을 완료하지 못하였거나, 평가 대상 조건이 충족되지 않았음을 부모 노드에게 보고하는 반환 상태(Return Status)이다. Failure는 노드의 실행이 종결(termination)되었으나 기대된 목표가 달성되지 않았다는 의미론적 판단을 전달한다.

Colledanchise와 Ogren(2018)의 형식적 정의에 의하면, 노드 N이 tick을 수신하였을 때 반환하는 상태 s \in \{Success, Failure, Running\} 중 Failure는 Success와 함께 종결 상태(terminal status)에 속하며, 해당 노드의 실행이 완전히 종료되었음을 나타낸다 (Colledanchise & Ogren, Behavior Trees in Robotics and AI, 2018).

2. Failure의 의미론적 범주

2.1 종결 상태로서의 Failure

Failure는 Success와 동일하게 종결 상태(terminal status)의 범주에 해당한다. 노드가 Failure를 반환하면 해당 tick 주기 내에서 노드의 실행이 완료된 것으로 간주되며, 더 이상의 tick 수신을 필요로 하지 않는다. 이는 Running 상태가 후속 tick에서의 계속적 실행을 요구하는 것과 본질적으로 구분된다.

Failure가 종결 상태라는 사실은 중요한 설계적 함의를 갖는다. Failure는 시스템의 오류(error)나 예외(exception)와는 근본적으로 상이한 개념이다. 오류가 시스템의 비정상적 상태를 의미하는 반면, Failure는 정상적인 실행 흐름의 일부로서 예측된 결과 중 하나에 해당한다.

2.2 논리적 거짓 값으로서의 Failure

행동 트리의 의미론에서 Failure는 불리언 논리(Boolean logic)의 거짓(false) 값과 유사한 의미를 갖는다. 이러한 대응 관계는 제어 흐름 노드의 동작 규칙에서 체계적으로 드러난다.

Sequence 노드는 논리곱(logical conjunction, AND)에 대응하므로, 자식 노드 중 하나가 Failure를 반환하면 즉시 Failure를 반환하고 나머지 자식의 실행을 중단한다. 이는 논리곱에서 하나의 피연산자가 거짓이면 전체 식이 거짓이 되는 단락 평가(short-circuit evaluation)와 동일한 원리이다. Fallback 노드는 논리합(logical disjunction, OR)에 대응하므로, 모든 자식 노드가 Failure를 반환해야 비로소 Failure를 반환한다 (Colledanchise & Ogren, 2018).

3. Failure와 오류의 구분

3.1 예측된 실패로서의 Failure

행동 트리에서 Failure는 시스템 오류나 프로그래밍 결함을 의미하지 않는다. Failure는 노드가 정상적으로 실행되었으나 원하는 결과를 얻지 못한 경우에 반환되는 합법적(legitimate) 상태이다. 예를 들어, 로봇이 목표 지점으로의 경로를 탐색하였으나 유효한 경로가 존재하지 않는 경우, 경로 계획 액션 노드는 Failure를 반환한다. 이는 경로 계획 알고리즘이 정상적으로 동작한 결과이며, 알고리즘 자체의 오류가 아니다.

이러한 의미론적 구분은 행동 트리가 대안적 행동(alternative behavior)을 자연스럽게 표현할 수 있는 핵심 원리이다. Fallback 노드는 자식 노드의 Failure를 대안 탐색의 신호로 해석하여, 첫 번째 자식이 실패하면 두 번째 자식을 시도하는 방식으로 행동 대안을 순차적으로 탐색한다.

3.2 시스템 오류의 처리

시스템 수준의 예외(exception)나 하드웨어 장애(hardware fault)는 행동 트리의 Failure 의미론과는 별개의 층위에서 처리되어야 한다. BehaviorTree.CPP 라이브러리에서는 C++ 예외가 노드 실행 중에 발생하면 이를 포착(catch)하여 Failure로 변환하거나, 별도의 예외 처리 메커니즘으로 전달하는 방식을 채택한다 (Faconti, BehaviorTree.CPP Documentation, 2024). 이를 통해 행동 트리의 의미론적 순수성(semantic purity)을 유지하면서도 실제 시스템의 견고성(robustness)을 확보한다.

4. 노드 유형별 Failure의 의미

4.1 액션 노드에서의 Failure

액션 노드(Action Node)가 Failure를 반환한다는 것은 해당 노드가 수행하도록 설계된 작업이 목표를 달성하지 못하고 종결되었음을 의미한다. 로봇 매니퓰레이터의 파지(grasping) 액션 노드가 Failure를 반환하면 대상 물체의 파지가 성공적으로 이루어지지 않았음을 나타낸다. 이동 액션 노드의 경우 목표 지점에 도달하지 못하고 경로 추종이 중단되었음을 의미한다.

동기 액션 노드(Synchronous Action Node)에서는 단일 tick 내에서 작업 실패가 판정되어 Failure가 즉시 반환된다. 비동기 액션 노드(Asynchronous Action Node)에서는 이전 tick에서 Running을 반환한 이후, 작업의 실패가 확정된 tick에서 Failure가 반환된다.

4.2 조건 노드에서의 Failure

조건 노드(Condition Node)가 Failure를 반환한다는 것은 해당 노드가 평가하는 조건 술어(predicate)가 거짓(false)으로 판정되었음을 의미한다. 조건 노드는 환경의 상태나 블랙보드(Blackboard)의 값을 부작용 없이 검사하므로, Failure는 단순히 현재 시점에서 조건이 충족되지 않았다는 사실의 보고이다.

예를 들어, 배터리 잔량 확인 조건 노드가 Failure를 반환하면 배터리 잔량이 설정된 임계값 미만임을 나타낸다. 이 Failure는 충전 행동이나 귀환 행동을 유발하는 제어 흐름의 분기 신호로 활용될 수 있다.

4.3 제어 흐름 노드에서의 Failure

제어 흐름 노드(Control Flow Node)의 Failure는 해당 노드의 제어 정책(control policy)이 실패 조건을 충족하였음을 의미한다.

  • Sequence 노드: 자식 노드 중 하나가 Failure를 반환하면 즉시 Failure를 반환하고 후속 자식의 실행을 중단한다. 이는 선행 조건이 충족되지 않으면 후속 행동을 수행하지 않는 논리적 전제 관계를 표현한다.
  • Fallback 노드: 모든 자식 노드가 Failure를 반환하였을 때 비로소 Failure를 반환한다. 이는 모든 대안적 행동이 실패하여 더 이상 시도할 수 있는 방안이 없음을 의미한다.
  • Parallel 노드: 실패 임계값(failure threshold) 정책에 의해 지정된 수 이상의 자식 노드가 Failure를 반환하면 Failure를 반환한다.

4.4 데코레이터 노드에서의 Failure

데코레이터 노드(Decorator Node)는 자식 노드의 반환 상태를 변환할 수 있으므로, Failure의 의미가 데코레이터 유형에 따라 재정의된다. Inverter 데코레이터는 자식 노드의 Success를 Failure로 변환하며, ForceFailure 데코레이터는 자식 노드의 반환 상태와 무관하게 항상 Failure를 반환한다. 이러한 변환은 행동 트리의 제어 논리를 유연하게 구성할 수 있는 메커니즘을 제공한다.

5. Failure 상태의 전파와 제어 흐름에의 영향

5.1 Failure의 상향 전파

Failure 상태는 Success와 마찬가지로 트리의 하위에서 상위로 전파(propagation)된다. 그러나 Failure의 전파는 제어 흐름 노드의 유형에 따라 상이한 행동을 유발한다는 점에서 Success 전파와 구별된다.

Sequence 노드에서 자식의 Failure는 조기 종료(early termination)를 유발하여 후속 자식의 실행을 차단한다. 반면 Fallback 노드에서 자식의 Failure는 다음 자식의 실행을 촉발하는 대안 탐색(alternative search)의 신호로 작용한다. 이러한 비대칭적 전파 의미론이 행동 트리의 핵심적 표현력을 구성한다.

5.2 Failure와 행동 대안 탐색

Failure의 가장 중요한 의미론적 기능은 대안적 행동의 탐색을 촉발하는 것이다. Fallback 노드 구조에서 Failure는 “현재 방법이 효과가 없으므로 다른 방법을 시도하라“는 의미를 전달한다. 이 메커니즘을 통해 행동 트리는 단일 실패에 대해 여러 복구 전략(recovery strategy)을 계층적으로 배치할 수 있다.

6. Failure와 노드 생명주기의 관계

노드가 Failure를 반환하면 해당 노드의 생명주기(lifecycle)는 Success 반환 시와 동일하게 실행 단계에서 종결 단계로 전이(transition)된다. BehaviorTree.CPP 라이브러리의 구현에서는 Failure를 반환한 노드의 상태가 IDLE로 재설정되며, 내부 상태의 초기화와 자원 해제가 수행된다 (Faconti, 2024).

Failure 반환 후의 자원 정리는 특히 비동기 액션 노드에서 중요하다. 장기 실행 작업이 실패로 판정된 경우, 해당 작업에 할당된 스레드, 소켓, 하드웨어 자원 등의 적절한 해제가 노드의 생명주기 관리를 통해 보장되어야 한다.

7. Failure의 형식적 표현

행동 트리의 형식적 의미론(formal semantics)에서 Failure는 다음과 같이 정의된다. 노드 N의 실행 함수를 f_N이라 하고, 환경 상태를 E라 하면, f_N(E) = Failure는 노드 N이 환경 E하에서 사후 조건(postcondition) Q를 충족시키지 못하는 방식으로 실행이 종결되었음을 나타낸다.

호어 논리(Hoare logic)의 관점에서, \{P\}\ N\ \{\neg Q\}로 표현될 수 있으며, 사전 조건 P가 성립하는 상태에서 노드 N이 실행된 후 사후 조건 Q가 성립하지 않을 때 N은 Failure를 반환한다. 이때 Failure는 사전 조건 P 자체가 위반된 것이 아니라, 노드의 실행 결과가 기대에 부합하지 않았음을 의미한다는 점에 유의하여야 한다 (Colledanchise & Ogren, 2018).


참고 문헌

  • Colledanchise, M. & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Faconti, D. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/