1297.4 조건 노드의 반환 상태 규칙

1. 행동 트리의 노드 상태 체계

행동 트리(Behavior Tree)에서 모든 노드는 tick을 수신한 후 세 가지 상태(NodeStatus) 중 하나를 반환한다(Colledanchise & Ogren, 2018):

  • SUCCESS: 노드의 목적이 성공적으로 달성되었음을 나타낸다.
  • FAILURE: 노드의 목적이 달성되지 못하였음을 나타낸다.
  • RUNNING: 노드의 실행이 아직 진행 중이며, 후속 tick에서 계속될 것임을 나타낸다.

이 세 가지 상태는 행동 트리의 실행 흐름을 제어하는 기본 신호이며, 제어 노드는 자식 노드의 반환 상태에 기반하여 다음 실행 경로를 결정한다.

2. 조건 노드의 반환 상태 제한

조건 노드는 세 가지 노드 상태 중 SUCCESSFAILURE만을 반환할 수 있다. RUNNING 상태의 반환은 원칙적으로 금지된다. 이 제한은 조건 노드의 본질적 특성에서 비롯된다.

조건 노드는 현재 시점의 환경 상태에 대한 논리적 명제를 평가하는 노드이다. “배터리 잔량이 20% 이상인가?”, “장애물까지의 거리가 1.0m 미만인가?“와 같은 명제는 현재 상태에서 즉시 참 또는 거짓으로 결정될 수 있다. 비동기적 대기나 장시간의 계산이 필요하지 않으므로, RUNNING 상태를 반환할 논리적 근거가 없다.

형식적으로, 조건 노드 c의 반환 함수는 다음과 같이 정의된다:

f_c: \mathcal{S} \rightarrow \{\text{SUCCESS}, \text{FAILURE}\}

여기서 \mathcal{S}는 시스템의 상태 공간이다. 공역(codomain)에 RUNNING이 포함되지 않으므로, 조건 노드는 항상 이진(binary) 결과를 반환한다.

3. SUCCESS 반환 규칙

조건 노드는 평가 대상 조건이 **충족(satisfied)**되었을 때 SUCCESS를 반환한다. SUCCESS는 조건이 참(true)임을 의미하며, 부모 제어 노드에 조건 충족 사실을 전달한다.

NodeStatus IsBatteryOk::tick()
{
    double battery_level;
    getInput("battery_level", battery_level);

    if (battery_level >= threshold_)
    {
        return NodeStatus::SUCCESS;  // 조건 충족: 배터리 충분
    }
    return NodeStatus::FAILURE;
}

SUCCESS 반환 후, 부모 제어 노드의 동작은 노드 유형에 따라 결정된다:

부모 제어 노드조건 노드가 SUCCESS 반환 시 동작
Sequence다음 자식 노드로 진행
Fallback해당 분기에서 즉시 SUCCESS 반환 (후속 자식 평가 중단)
ReactiveSequence다음 자식 노드로 진행
ReactiveFallback해당 분기에서 즉시 SUCCESS 반환

4. FAILURE 반환 규칙

조건 노드는 평가 대상 조건이 **미충족(unsatisfied)**되었을 때 FAILURE를 반환한다. FAILURE는 조건이 거짓(false)임을 의미한다. 여기서 주의할 점은, 조건 노드의 FAILURE는 오류(error)나 예외(exception)를 나타내는 것이 아니라, 단순히 조건이 현재 시점에서 만족되지 않음을 나타내는 정상적인 반환값이라는 것이다.

NodeStatus IsObstacleDetected::tick()
{
    double distance;
    getInput("obstacle_distance", distance);

    if (distance < safe_distance_)
    {
        return NodeStatus::SUCCESS;   // 장애물 감지됨
    }
    return NodeStatus::FAILURE;       // 장애물 미감지 (정상 상태)
}

FAILURE 반환 후 부모 제어 노드의 동작:

부모 제어 노드조건 노드가 FAILURE 반환 시 동작
Sequence해당 분기에서 즉시 FAILURE 반환 (후속 자식 평가 중단)
Fallback다음 자식 노드로 진행
ReactiveSequence진행 중인 자식 노드를 halt하고 FAILURE 반환
ReactiveFallback다음 자식 노드로 진행

5. RUNNING 반환 금지 규칙

조건 노드에서 RUNNING의 반환은 금지된다. BehaviorTree.CPP 라이브러리에서 ConditionNode를 상속한 노드가 RUNNING을 반환하면, 런타임(runtime)에서 논리 오류로 처리된다.

RUNNING 금지 규칙의 근거는 다음과 같다:

  1. 의미론적 근거: 조건 평가는 현재 상태에 대한 즉각적 판정이므로, “평가가 진행 중“이라는 상태는 조건 노드의 의미론(semantics)에 부합하지 않는다.

  2. 제어 흐름 근거: 제어 노드는 조건 노드의 결과를 기반으로 즉시 분기 결정을 내려야 한다. RUNNING이 반환되면 제어 노드가 분기 결정을 보류해야 하며, 이는 행동 트리의 결정론적(deterministic) 실행 흐름을 저해한다.

  3. 반응성 근거: ReactiveSequence에서 조건 노드가 RUNNING을 반환하면, 반응적 재평가 메커니즘이 정상적으로 동작하지 않는다. 조건 노드는 매 tick마다 확정적인 결과를 반환해야 반응적 제어가 성립한다.

6. BehaviorTree.CPP에서의 반환 상태 강제

BehaviorTree.CPP 라이브러리는 조건 노드의 반환 상태 규칙을 다음과 같이 강제한다.

첫째, ConditionNode 클래스의 halt() 메서드가 final로 선언되어 있어, 조건 노드는 진행 중인 동작을 가질 수 없다. 이는 RUNNING 상태가 불필요함을 구조적으로 반영한다.

둘째, 노드의 tick() 메서드가 RUNNING을 반환하면, 트리 실행 엔진이 해당 노드가 조건 노드인지 확인하고 적절한 경고 또는 오류를 발생시킨다.

// BehaviorTree.CPP 내부의 반환 상태 검증 (개념적 표현)
NodeStatus status = child_node->executeTick();
if (child_node->type() == NodeType::CONDITION && status == NodeStatus::RUNNING)
{
    throw LogicError("Condition node must not return RUNNING");
}

7. 반환 상태와 조건 의미론의 대응

조건 노드를 설계할 때, SUCCESSFAILURE의 의미를 명확히 정의하는 것이 중요하다. 조건 노드의 이름은 SUCCESS 반환 시의 의미를 직관적으로 나타내도록 명명하는 것이 관례이다.

조건 노드 이름SUCCESS 의미FAILURE 의미
IsBatteryOk배터리 잔량 충분배터리 잔량 부족
IsPathClear경로 상 장애물 없음경로 상 장애물 존재
IsGoalReached목표 지점 도달목표 지점 미도달
IsLocalized위치 추정 품질 양호위치 추정 품질 불량

이러한 명명 규칙을 따르면, 조건 노드의 반환 상태가 트리 구조 내에서 직관적으로 해석되며, 트리의 가독성과 유지보수성이 향상된다.

8. 예외 상황에서의 반환 규칙

센서 데이터를 읽을 수 없거나 블랙보드 키가 존재하지 않는 등의 예외 상황에서도 조건 노드는 SUCCESS 또는 FAILURE 중 하나를 반환해야 한다. 일반적으로 예외 상황은 조건 미충족으로 간주하여 FAILURE를 반환하는 것이 안전한 설계이다.

NodeStatus CheckSensorData::tick()
{
    auto result = getInput<double>("sensor_value");
    if (!result)
    {
        // 블랙보드에서 값을 읽을 수 없는 경우 FAILURE 반환
        return NodeStatus::FAILURE;
    }

    double value = result.value();
    return (value > threshold_) ? NodeStatus::SUCCESS : NodeStatus::FAILURE;
}

이 접근 방식은 실패 안전(fail-safe) 원칙에 부합한다. 데이터가 불완전한 상태에서 조건을 참으로 판정하는 것보다, 거짓으로 판정하여 후속 행동의 실행을 차단하는 것이 로봇 시스템의 안전성 관점에서 바람직하다.

9. 참고 문헌

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

version: 0.1.0