1294.58 조건-행동 패턴 (Condition-Action Pattern)

1. 조건-행동 패턴의 정의

조건-행동 패턴(Condition-Action Pattern)은 행동 트리에서 가장 기본적이고 빈번하게 사용되는 설계 패턴으로, 조건 노드와 액션 노드를 Sequence 또는 Fallback 내부에 조합하여 “조건이 충족될 때만 행동을 수행“하는 구조를 구현한다. 이 패턴은 프로덕션 규칙(production rule) 시스템의 “if-then” 규칙에 대응하며, 행동 트리의 기본 구성 요소(building block)로 기능한다(Colledanchise & Ogren, 2018).

2. 두 가지 기본 형태

2.1 형태 1: Sequence 기반 조건-행동

<Sequence>
    <Condition ID="IsConditionMet"/>
    <Action ID="PerformAction"/>
</Sequence>

의미: “조건이 참이면 행동을 수행하라.”

  • 조건이 SUCCESS → 행동 실행
  • 조건이 FAILURE → Sequence 즉시 FAILURE (행동 미실행)

이 형태는 “가드(guard)” 패턴으로도 불리며, 조건이 행동의 전제 조건(precondition) 역할을 수행한다.

2.2 형태 2: Fallback 기반 조건-행동

<Fallback>
    <Condition ID="IsGoalAchieved"/>
    <Action ID="AchieveGoal"/>
</Fallback>

의미: “목표가 이미 달성되어 있으면 아무것도 하지 않고, 아니면 달성하라.”

  • 조건이 SUCCESS → Fallback 즉시 SUCCESS (행동 미실행)
  • 조건이 FAILURE → 행동 실행

이 형태는 “목표 달성(goal achievement)” 패턴으로 불리며, 조건이 목표 상태의 확인 역할을 수행한다.

3. 두 형태의 의미론적 차이

특성Sequence 기반Fallback 기반
조건의 역할행동의 전제 조건목표 달성 확인
조건 SUCCESS 시행동 실행행동 미실행 (이미 달성)
조건 FAILURE 시행동 미실행행동 실행 (달성 필요)
조건의 논리적 위치“이 조건이면 하라”“이미 되어 있지 않으면 하라”
프로그래밍 대응if (cond) action()if (!done) action()

4. Reactive 변형에서의 조건-행동 패턴

4.1 ReactiveSequence 기반

<ReactiveSequence>
    <Condition ID="IsBatteryOK"/>
    <Action ID="PerformTask"/>
</ReactiveSequence>

배터리가 충분한 동안만 작업을 수행한다. 배터리가 부족해지면 즉시 작업을 중단한다. 조건이 매 Tick 재평가되므로, 행동 실행 중 조건의 변화를 즉시 감지한다.

4.2 ReactiveFallback 기반

<ReactiveFallback>
    <Condition ID="IsAtDestination"/>
    <Action ID="NavigateToDestination"/>
</ReactiveFallback>

목적지에 도착하지 않은 동안 네비게이션을 수행한다. 네비게이션 중 외부 요인에 의해 목적지에 도달하면 즉시 네비게이션을 중단한다.

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

5.1 사례 1: 전제 조건 패턴

<Sequence>
    <Condition ID="IsArmCalibrated"/>
    <Action ID="PickObject"/>
</Sequence>

로봇 팔이 보정된 상태에서만 물체 파지를 수행한다.

5.2 사례 2: 목표 달성 패턴

<Fallback>
    <Condition ID="IsObjectGrasped"/>
    <Action ID="GraspObject"/>
</Fallback>

물체를 아직 잡지 않았으면 파지 동작을 수행한다.

5.3 사례 3: 안전 감시 패턴

<ReactiveSequence>
    <Condition ID="IsNotEmergency"/>
    <Action ID="ContinueOperation"/>
</ReactiveSequence>

비상 상황이 아닌 동안만 운행을 계속한다.

5.4 사례 4: 동적 목표 확인 패턴

<ReactiveFallback>
    <Condition ID="IsCharged"/>
    <Action ID="GoToCharger"/>
</ReactiveFallback>

충전이 완료되지 않은 동안 충전소로 이동한다.

6. 다중 조건-행동 패턴

6.1 다중 전제 조건

<Sequence>
    <Condition ID="IsCalibrated"/>
    <Condition ID="IsObjectDetected"/>
    <Condition ID="IsWorkspaceClean"/>
    <Action ID="PickAndPlace"/>
</Sequence>

모든 전제 조건이 충족될 때만 행동을 수행한다.

6.2 조건부 대안 선택

<Fallback>
    <Sequence>
        <Condition ID="IsNearby"/>
        <Action ID="DirectApproach"/>
    </Sequence>
    <Sequence>
        <Condition ID="IsPathKnown"/>
        <Action ID="FollowPath"/>
    </Sequence>
    <Action ID="Explore"/>
</Fallback>

여러 조건-행동 쌍을 Fallback으로 조합하여, 조건에 따른 행동 선택을 구현한다.

7. 조건-행동 패턴의 설계 원칙

  1. 조건 노드는 부수 효과가 없어야 한다: 조건 노드는 환경 상태를 읽기만 하고 변경하지 않아야 한다. 부수 효과가 있는 조건은 Reactive 변형에서 매 Tick 재실행될 때 문제를 유발한다.

  2. 조건 노드는 즉시 반환해야 한다: 조건 노드는 RUNNING을 반환하지 않고, SUCCESS 또는 FAILURE를 즉시 반환해야 한다. 비동기 조건 확인이 필요한 경우에는 별도의 액션 노드로 구현한다.

  3. 조건과 행동의 의미적 일관성: 조건이 확인하는 상태와 행동이 수행하는 작업은 논리적으로 관련되어야 한다(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/