1294.59 조건이 선행하는 Sequence 패턴

1. 패턴의 정의

조건이 선행하는 Sequence 패턴이란, Sequence 노드의 첫 번째(또는 앞쪽) 자식에 조건 노드를 배치하고 뒤쪽에 액션 노드를 배치하여, 조건이 충족된 경우에만 후속 액션을 실행하는 구조이다. 조건 노드는 Sequence의 단락 평가(short-circuit) 특성에 의해 가드(guard) 역할을 수행하며, 조건이 FAILURE를 반환하면 후속 액션은 평가되지 않는다(Colledanchise & Ogren, 2018).

2. 기본 구조

<Sequence>
    <Condition ID="Precondition"/>     <!-- 가드: 전제 조건 -->
    <Action ID="GuardedAction"/>        <!-- 보호된 액션 -->
</Sequence>
  • Precondition이 SUCCESS → GuardedAction 실행
  • Precondition이 FAILURE → Sequence 즉시 FAILURE (GuardedAction 미실행)

3. 다중 조건 선행 패턴

여러 조건을 Sequence의 앞쪽에 배치하면, 모든 조건이 순차적으로 충족될 때만 액션이 실행된다.

<Sequence>
    <Condition ID="IsSystemHealthy"/>
    <Condition ID="IsBatteryAbove20"/>
    <Condition ID="IsLocalized"/>
    <Action ID="StartMission"/>
</Sequence>

세 가지 조건이 모두 SUCCESS를 반환할 때만 StartMission이 실행된다. 앞쪽 조건이 FAILURE를 반환하면 뒤쪽 조건은 평가되지 않는다(조기 종료).

3.1 조건 순서의 최적화

조건의 배치 순서는 두 가지 관점에서 최적화할 수 있다.

  1. 실패 확률 기반: 실패 확률이 높은 조건을 앞에 배치하면, 평균적으로 더 적은 조건이 평가된다.
  2. 중요도 기반: 가장 중요한 조건(안전 관련)을 앞에 배치하면, 핵심 조건이 항상 먼저 확인된다.

4. SequenceWithMemory에서의 동작

SequenceWithMemory에서 조건이 선행하는 경우, 조건은 최초 한 번만 평가되고 이후 건너뛰어진다.

Tick 1: IsBatteryOK→S, Navigate→R (idx=1)
Tick 2: Navigate→R                 (IsBatteryOK 건너뜀)
Tick 3: Navigate→R                 (배터리 소진 미감지)

조건의 유효성이 시간에 따라 변할 수 있는 경우, 이 동작은 위험할 수 있다. 이런 경우에는 ReactiveSequence를 사용해야 한다.

5. ReactiveSequence에서의 동작

ReactiveSequence에서 조건이 선행하는 경우, 조건은 매 Tick마다 재평가된다.

Tick 1: IsBatteryOK→S, Navigate→R
Tick 2: IsBatteryOK→S, Navigate→R (조건 재확인)
Tick 3: IsBatteryOK→F             (배터리 소진 감지)
        Navigate→Halt
        → FAILURE

이 패턴은 조건이 비동기 액션의 “지속적 전제 조건(continuous precondition)“으로 기능하는 구조이다.

6. 로봇 공학에서의 적용 사례

6.1 사례 1: 안전 전제 조건

<ReactiveSequence>
    <Condition ID="IsEmergencyStopNotPressed"/>
    <Condition ID="IsSafetyZoneNotViolated"/>
    <Action ID="MoveJoint"/>
</ReactiveSequence>

비상 정지가 눌리거나 안전 영역이 위반되면 관절 이동이 즉시 중단된다.

6.2 사례 2: 센서 가용성 전제 조건

<Sequence>
    <Condition ID="IsLidarOnline"/>
    <Condition ID="IsIMUCalibrated"/>
    <Action ID="StartAutonomousNavigation"/>
</Sequence>

라이다가 온라인이고 IMU가 보정된 상태에서만 자율 네비게이션을 시작한다.

6.3 사례 3: 환경 조건 전제 조건

<ReactiveSequence>
    <Condition ID="IsWindSpeedAcceptable"/>
    <Condition ID="IsVisibilityGood"/>
    <Action ID="FlyToWaypoint"/>
</ReactiveSequence>

풍속과 가시성 조건이 모두 허용 범위일 때만 비행을 수행하며, 조건이 변하면 즉시 비행을 중단한다.

6.4 사례 4: 작업 전제 조건

<Sequence>
    <Condition ID="IsToolAttached"/>
    <Condition ID="IsWorkpieceSecured"/>
    <Action ID="StartMachining"/>
</Sequence>

공구가 장착되고 가공물이 고정된 상태에서만 가공을 시작한다.

7. Fallback 내부에서의 조건 선행 패턴

조건이 선행하는 Sequence를 Fallback의 자식으로 배치하면, 조건부 대안 선택 패턴이 구현된다.

<Fallback>
    <Sequence>
        <Condition ID="IsCondA"/>
        <Action ID="ActionA"/>
    </Sequence>
    <Sequence>
        <Condition ID="IsCondB"/>
        <Action ID="ActionB"/>
    </Sequence>
    <Action ID="DefaultAction"/>
</Fallback>

각 Sequence의 조건이 해당 대안의 적용 가능 여부를 결정하며, 조건이 FAILURE이면 Sequence가 FAILURE를 반환하여 Fallback이 다음 대안으로 진행한다.

8. 설계 원칙

  1. 조건은 즉시 반환: 조건 노드는 RUNNING을 반환하지 않고, SUCCESS 또는 FAILURE를 즉시 반환해야 한다.
  2. 조건은 부수 효과 없음: 조건 노드는 환경 상태를 변경하지 않아야 한다.
  3. 안전 조건 우선 배치: 가장 중요한 안전 조건을 가장 앞에 배치한다.
  4. 변형 선택: 조건의 지속적 감시가 필요하면 ReactiveSequence를, 일회성 확인이면 SequenceWithMemory를 사용한다(Faconti, 2022).

참고 문헌

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