NOT 조건의 Inverter 데코레이터 기반 구현 (NOT Condition via Inverter Decorator)

NOT 조건의 Inverter 데코레이터 기반 구현 (NOT Condition via Inverter Decorator)

1. 개요

NOT 조건은 단일 조건의 결과를 반전(negation)시키는 논리 연산이다. 행동 트리에서는 Inverter 데코레이터 노드를 사용하여 NOT 조건을 구현한다. Inverter는 자식 노드의 SUCCESSFAILURE로, FAILURESUCCESS로 반전시키며, 조건의 의미를 뒤집어 사용할 수 있게 한다.

2. Inverter의 동작 원리

2.1 반전 규칙

자식 반환Inverter 반환
SUCCESSFAILURE
FAILURESUCCESS
RUNNINGRUNNING (변환 없음)

조건 노드는 RUNNING을 반환하지 않으므로, 조건 노드에 적용된 Inverter는 항상 SUCCESSFAILURE의 반전만 수행한다.

2.2 수학적 표현

조건 C에 대해 Inverter가 적용된 결과는 다음과 같다.

\text{Inverter}(C) = \neg C

활용 예시

장애물이 없는 경우에만 전진

“장애물이 감지되었는가?“라는 조건을 반전하여 “장애물이 없는가?“로 사용한다.

<BehaviorTree ID="SafeForward">
    <Sequence>
        <Inverter>
            <Condition ID="IsObstacleDetected"
                       topic_name="/scan"
                       detection_range="0.5"/>
        </Inverter>
        <Action ID="DriveForward"/>
    </Sequence>
</BehaviorTree>

비상 정지가 활성화되지 않은 경우에만 운용

<ReactiveSequence>
    <Inverter>
        <Condition ID="IsEmergencyStopActive"
                   topic_name="/e_stop"/>
    </Inverter>
    <Action ID="ContinueOperation"/>
</ReactiveSequence>

타임아웃이 경과하지 않은 동안 대기

<Sequence>
    <Inverter>
        <Condition ID="HasTimeoutElapsed"
                   timeout_sec="30.0"/>
    </Inverter>
    <Action ID="WaitForEvent"/>
</Sequence>

Inverter와 복합 조건의 결합

드모르간 법칙의 적용

드모르간 법칙(De Morgan’s laws)을 활용하여 복합 조건을 변환할 수 있다.

\neg(A \wedge B) = \neg A \vee \neg B
\neg(A \vee B) = \neg A \wedge \neg B

예를 들어, “모든 센서가 정상이 아닌 경우“는 다음과 같이 표현된다.

\neg(\text{SensorA\_OK} \wedge \text{SensorB\_OK}) = \neg\text{SensorA\_OK} \vee \neg\text{SensorB\_OK}

<!-- 방법 1: AND의 반전 -->
<Inverter>
    <Sequence>
        <Condition ID="SensorA_OK"/>
        <Condition ID="SensorB_OK"/>
    </Sequence>
</Inverter>

<!-- 방법 2: 드모르간 법칙 적용 (동치) -->
<Fallback>
    <Inverter><Condition ID="SensorA_OK"/></Inverter>
    <Inverter><Condition ID="SensorB_OK"/></Inverter>
</Fallback>

2.3 NAND 조건

\neg(A \wedge B): 두 조건이 동시에 참이 아닌 경우 SUCCESS를 반환한다.

<Inverter>
    <Sequence>
        <Condition ID="A"/>
        <Condition ID="B"/>
    </Sequence>
</Inverter>

2.4 NOR 조건

\neg(A \vee B): 어떤 조건도 참이 아닌 경우에만 SUCCESS를 반환한다.

<Inverter>
    <Fallback>
        <Condition ID="A"/>
        <Condition ID="B"/>
    </Fallback>
</Inverter>

3. 이중 반전의 제거

Inverter가 중첩 적용되면 원래 결과로 복귀한다.

\neg(\neg A) = A

<!-- 불필요한 이중 반전: 제거하여야 한다 -->
<Inverter>
    <Inverter>
        <Condition ID="A"/>
    </Inverter>
</Inverter>

<!-- 위와 동치: 단순히 A를 사용 -->
<Condition ID="A"/>

이중 반전은 행동 트리의 구조적 복잡도만 증가시키므로, 코드 검토 시 제거하여야 한다.

설계 시 고려 사항

명확한 조건 명명

Inverter를 사용하면 조건의 의미가 반전되므로, 행동 트리의 가독성이 저하될 수 있다. 가능한 한 조건 노드의 이름을 명확하게 지어 Inverter 없이도 의도를 파악할 수 있도록 하는 것이 바람직하다.

방식XML 표현가독성
Inverter 사용<Inverter><Condition ID="IsObstacleDetected"/></Inverter>보통
반대 의미의 조건<Condition ID="IsPathClear"/>높음

반대 의미의 조건 노드를 별도로 구현하면 Inverter가 불필요해지나, 조건 노드의 수가 증가한다. 빈번히 반전하여 사용하는 조건에 대해서만 반대 의미의 조건 노드를 구현하는 것이 실용적이다.

Inverter와 RUNNING 상태

조건 노드에 Inverter를 적용하는 경우 RUNNING 상태의 처리는 문제가 되지 않는다. 그러나 액션 노드에 Inverter를 적용하면 RUNNING 상태가 그대로 전달되므로, 의도하지 않은 동작이 발생할 수 있다. Inverter는 조건 노드에만 적용하는 것이 일반적이다.

참고 문헌

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

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