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. 조건-행동 패턴의 설계 원칙
-
조건 노드는 부수 효과가 없어야 한다: 조건 노드는 환경 상태를 읽기만 하고 변경하지 않아야 한다. 부수 효과가 있는 조건은 Reactive 변형에서 매 Tick 재실행될 때 문제를 유발한다.
-
조건 노드는 즉시 반환해야 한다: 조건 노드는 RUNNING을 반환하지 않고, SUCCESS 또는 FAILURE를 즉시 반환해야 한다. 비동기 조건 확인이 필요한 경우에는 별도의 액션 노드로 구현한다.
-
조건과 행동의 의미적 일관성: 조건이 확인하는 상태와 행동이 수행하는 작업은 논리적으로 관련되어야 한다(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/