Inverter의 활용 사례 (Use Cases of the Inverter Decorator)

1. 개요

Inverter 데코레이터는 행동 트리에서 가장 빈번히 사용되는 데코레이터이며, 조건 반전, 행동 분기 제어, 안전 가드 구현 등 다양한 실용적 패턴에서 핵심적으로 활용된다. 본 절에서는 로봇 공학에서의 구체적인 Inverter 활용 사례를 다룬다.

2. 사례 1: 안전 조건 가드

비상 정지, 장애물, 배터리 부족 등의 위험 조건이 비활성 상태일 때에만 행동을 허용하는 가드 패턴이다.

<ReactiveSequence>
    <Inverter>
        <Condition ID="IsEmergencyStopActive"/>
    </Inverter>
    <Inverter>
        <Condition ID="IsBatteryCritical"/>
    </Inverter>
    <Action ID="ContinueMission"/>
</ReactiveSequence>

“비상 정지가 활성화되지 않았고, 배터리가 위험 수준이 아닌 경우에만 임무를 수행하라.”

3. 사례 2: 장애물 비감지 시 전진

장애물이 감지되지 않은 경우에만 전진 행동을 실행한다.

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

IsObstacleDetectedFAILURE(장애물 없음) → Inverter가 SUCCESSDriveForward 실행.

4. 사례 3: Fallback 내 조건부 분기

시간대에 따른 운용 모드 전환이다.

<Fallback>
    <Sequence>
        <Inverter>
            <Condition ID="IsNightTime"/>
        </Inverter>
        <Action ID="DaytimePatrol"/>
    </Sequence>
    <Action ID="NighttimeStandby"/>
</Fallback>

낮이면 순찰, 밤이면 대기 모드를 실행한다.

5. 사례 4: 타임아웃 미경과 확인

타임아웃이 아직 경과하지 않은 동안 대기 행동을 수행한다.

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

HasTimeoutElapsedFAILURE(아직 안 됨) → Inverter가 SUCCESS → 대기 계속.

6. 사례 5: 복합 조건의 부정 (드모르간 법칙)

모든 센서가 정상이 아닌 경우(즉, 하나 이상의 센서에 이상이 있는 경우)를 감지한다.

<!-- ¬(SensorA_OK ∧ SensorB_OK) = 하나 이상 비정상 -->
<Inverter>
    <Sequence>
        <Condition ID="IsSensorA_OK"/>
        <Condition ID="IsSensorB_OK"/>
    </Sequence>
</Inverter>

7. 사례 6: 행동 성공 시 Fallback 진행 방지

Fallback 내에서 특정 행동이 성공하더라도 다음 분기로 진행하도록 강제한다.

<Fallback>
    <Inverter>
        <Action ID="TryMethod_A"/>
    </Inverter>
    <Action ID="TryMethod_B"/>
</Fallback>

Method_A가 SUCCESS → Inverter가 FAILUREFallback이 Method_B를 시도. 이 패턴은 Method_A를 시도한 후 그 결과에 관계없이 Method_B도 시도하는 효과를 가진다. 다만 이 패턴은 직관적이지 않으므로 주의하여 사용하여야 한다.

8. 사례 7: GPS 신호 부재 시 대체 내비게이션

<Fallback>
    <Sequence>
        <Inverter>
            <Condition ID="IsGpsSignalLost"/>
        </Inverter>
        <Action ID="GpsNavigation"/>
    </Sequence>
    <Action ID="LidarNavigation"/>
</Fallback>

GPS 신호가 유실되지 않았으면 GPS 내비게이션을, 유실되었으면 라이다 기반 내비게이션을 수행한다.

9. 사례 8: ReactiveSequence에서의 지속적 안전 감시

<ReactiveSequence>
    <Inverter>
        <Condition ID="IsCollisionRisk"
                   topic_name="/scan"
                   risk_distance="0.3"/>
    </Inverter>
    <Action ID="FollowPath"/>
</ReactiveSequence>

매 tick마다 충돌 위험을 감시하며, 위험이 감지되면 경로 추종을 즉시 중단한다.

10. 활용 시 주의 사항

10.1 가독성 고려

Inverter를 과도하게 사용하면 행동 트리의 논리를 이해하기 어려워진다. 특히 이중 부정이나 Inverter 중첩은 지양하여야 한다. 빈번히 반전하여 사용하는 조건에 대해서는 반대 의미의 전용 조건 노드를 구현하는 것이 가독성 측면에서 유리하다.

10.2 안전 관련 사용의 검증

안전 조건에 Inverter를 적용할 때, 반전된 의미가 의도한 바와 정확히 일치하는지를 엄격히 검증하여야 한다. 조건의 의미가 잘못 해석되면 안전 보호가 무력화될 수 있다.

11. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Macenski, S., et al. (2020). “The Marathon 2: A Navigation System.” arXiv preprint arXiv:2003.00368.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

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