Inverter의 Running 통과 규칙 (Inverter’s Running Pass-Through Rule)
1. 개요
Inverter 데코레이터의 Running 통과 규칙은 자식 노드가 RUNNING 상태를 반환할 때, Inverter가 이를 변환하지 않고 그대로 부모 노드에 전달하는 규칙이다. 이 규칙은 Inverter뿐만 아니라 모든 반환 상태 변환 데코레이터에 공통으로 적용되는 핵심 원칙이며, 행동 트리의 비동기 실행 메커니즘을 보존하는 데 필수적이다.
2. 규칙의 정의
2.1 형식적 표현
\iota(\text{RUNNING}) = \text{RUNNING}
Inverter는 SUCCESS와 FAILURE만을 변환하며, RUNNING은 항등 변환(identity transformation)을 적용한다.
변환 테이블에서의 위치
| 자식 반환 | Inverter 반환 | 변환 여부 |
|---|---|---|
| SUCCESS | FAILURE | 변환됨 |
| FAILURE | SUCCESS | 변환됨 |
| RUNNING | RUNNING | 통과 |
RUNNING 통과의 필요성
비동기 실행의 보존
RUNNING 상태는 자식 노드가 비동기적으로 실행 중이며 아직 완료되지 않았음을 나타내는 신호이다. 이 신호가 부모 노드에 정확히 전달되어야 다음 tick에서 자식 노드가 다시 tick되어 실행을 계속할 수 있다.
만약 RUNNING이 SUCCESS나 FAILURE로 변환되면, 부모 노드는 자식의 실행이 완료된 것으로 인식하여 다음 tick에서 자식을 tick하지 않는다. 이 경우 자식 노드는 RUNNING 상태에 영원히 머물러, 리소스가 해제되지 않고 비동기 작업이 완료되지 않는 상태가 된다.
halt 메커니즘의 정합성
행동 트리는 RUNNING 상태인 노드만을 halt 대상으로 식별한다. RUNNING이 다른 상태로 변환되면, 행동 트리가 실행 중인 노드를 정확히 추적하지 못하여, halt 호출이 누락되고 리소스 누수가 발생한다.
tick 전파 연쇄의 유지
행동 트리의 tick 메커니즘에서, RUNNING 상태는 “다음 tick에서 이 노드를 다시 방문하라“는 신호이다. 이 신호가 트리의 루트까지 정확히 전파되어야 tick 연쇄(chain)가 유지된다.
자식(RUNNING) → Inverter(RUNNING) → 부모(RUNNING) → ... → 루트(RUNNING)
이 연쇄가 어느 한 지점에서 끊기면, 자식의 비동기 실행이 중단된다.
조건 노드와 액션 노드에서의 차이
조건 노드에 적용된 Inverter
조건 노드는 RUNNING을 반환하지 않으므로, 조건 노드에 적용된 Inverter에서 Running 통과 규칙이 실제로 발동되는 경우는 없다. 따라서 조건 노드에 대한 Inverter는 순수한 SUCCESS↔FAILURE 반전만 수행한다.
액션 노드에 적용된 Inverter
액션 노드는 비동기 실행 중 RUNNING을 반환할 수 있다. 이 경우 Running 통과 규칙이 적용되어, 액션이 실행 중인 동안 Inverter도 RUNNING을 반환한다. 액션이 최종적으로 SUCCESS 또는 FAILURE를 반환할 때에만 반전이 적용된다.
Tick 1: Action=RUNNING → Inverter=RUNNING
Tick 2: Action=RUNNING → Inverter=RUNNING
Tick 3: Action=SUCCESS → Inverter=FAILURE
위반 시의 문제
가상 시나리오: RUNNING을 반전한 경우
만약 Inverter가 RUNNING을 SUCCESS로 변환한다면:
- 자식 액션이 비동기 실행 중(
RUNNING) - Inverter가
SUCCESS를 반환 - 부모
Sequence가 다음 자식으로 진행 - 자식 액션은 여전히 실행 중이나, 아무도 tick하지 않음
- 자식 액션의 halt()가 호출되지 않음
- 리소스 누수, 비동기 작업 미완료
가상 시나리오: RUNNING을 FAILURE로 변환한 경우
- 자식 액션이 비동기 실행 중(
RUNNING) - Inverter가
FAILURE를 반환 - 부모
Sequence가 전체를FAILURE로 반환 - 자식 액션은 실행 중이나 halt되지 않음
- 동일한 리소스 누수 문제 발생
BehaviorTree.CPP의 보증
BehaviorTree.CPP 라이브러리에서 제공하는 InverterNode의 구현은 RUNNING 통과를 보증한다. 사용자 정의 데코레이터를 구현할 때에도 이 규칙을 반드시 준수하여야 한다.
// 올바른 구현
BT::NodeStatus tick() override
{
auto status = child_node_->executeTick();
switch (status)
{
case BT::NodeStatus::SUCCESS: return BT::NodeStatus::FAILURE;
case BT::NodeStatus::FAILURE: return BT::NodeStatus::SUCCESS;
case BT::NodeStatus::RUNNING: return BT::NodeStatus::RUNNING;
default: throw BT::LogicError("Invalid status");
}
}
참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |