조건 노드와 ReactiveFallback의 조합 (Condition Nodes with ReactiveFallback)
1. 개요
ReactiveFallback과 조건 노드의 조합은 우선순위 기반의 반응적 행동 선택을 구현하는 핵심 패턴이다. ReactiveFallback은 매 tick마다 첫 번째 자식부터 재평가하므로, 높은 우선순위의 조건이 충족되면 현재 실행 중인 낮은 우선순위의 행동을 즉시 선점(preempt)할 수 있다. 이 패턴은 비상 대응, 동적 행동 전환, 우선순위 기반 임무 관리 등에 활용된다.
2. ReactiveFallback의 동작 원리
2.1 일반 Fallback과의 차이
| 특성 | Fallback | ReactiveFallback |
|---|---|---|
| 재평가 | SUCCESS인 자식을 기억하고, 다음 tick에서 해당 자식부터 평가 | 매 tick 첫 번째 자식부터 재평가 |
| 선점 | 불가: 한 번 시작된 행동이 완료될 때까지 유지 | 가능: 상위 우선순위 조건 충족 시 현재 행동 중단 |
2.2 tick 흐름 예시
ReactiveFallback(C1→A1, C2→A2, A3) 구조에서:
Tick N: C1=FAILURE → C2=SUCCESS → A2 시작 → RUNNING
Tick N+1: C1=SUCCESS → A1 시작 (A2.halt() 호출) → RUNNING
Tick N+2: C1=FAILURE → C2=SUCCESS → A2 재시작 → RUNNING
C1 조건이 SUCCESS로 변하면, 실행 중인 A2가 중단되고 A1이 시작된다. 이것이 선점의 핵심이다.
3. 기본 패턴: 우선순위 기반 행동 선택
<ReactiveFallback>
<!-- 최고 우선순위: 비상 상황 -->
<Sequence>
<Condition ID="IsEmergencyDetected"/>
<Action ID="EmergencyResponse"/>
</Sequence>
<!-- 중간 우선순위: 장애물 회피 -->
<Sequence>
<Condition ID="IsObstacleNear"/>
<Action ID="AvoidObstacle"/>
</Sequence>
<!-- 기본 행동: 정상 내비게이션 -->
<Action ID="NavigateToGoal"/>
</ReactiveFallback>
비상 상황이 감지되면 현재 행동(내비게이션 또는 장애물 회피)을 중단하고 비상 대응을 실행한다. 비상 상황이 해소되면 장애물 상태에 따라 회피 또는 내비게이션을 재개한다.
4. 실용적 패턴
4.1 배터리 수준에 따른 행동 전환
<ReactiveFallback>
<Sequence>
<Condition ID="IsBatteryCritical"
topic_name="/battery_state"
threshold="0.05"/>
<Action ID="EmergencyLand"/>
</Sequence>
<Sequence>
<Condition ID="IsBatteryLow"
topic_name="/battery_state"
threshold="0.15"/>
<Action ID="ReturnToBase"/>
</Sequence>
<Action ID="ContinueMission"/>
</ReactiveFallback>
배터리가 5% 미만이면 긴급 착륙, 15% 미만이면 기지 귀환, 그 외에는 임무 수행을 계속한다. 배터리 수준이 변화함에 따라 행동이 자동으로 전환된다.
4.2 ReactiveSequence와 결합한 복합 패턴
<ReactiveSequence>
<!-- 시스템 수준 안전 가드 -->
<Condition ID="IsNotEmergencyStopped"/>
<!-- 우선순위 기반 행동 선택 -->
<ReactiveFallback>
<Sequence>
<Condition ID="IsObstacleDetected"
detection_range="0.5"/>
<Action ID="AvoidObstacle"/>
</Sequence>
<Sequence>
<Condition ID="IsBatteryLow"
threshold="0.2"/>
<Action ID="ReturnToCharge"/>
</Sequence>
<Action ID="PerformMission"/>
</ReactiveFallback>
</ReactiveSequence>
외부 ReactiveSequence는 비상 정지를 감시하고, 내부 ReactiveFallback은 우선순위에 따라 행동을 선택한다.
5. ReactiveFallback과 일반 Fallback의 선택 기준
| 상황 | 적합한 노드 |
|---|---|
| 조건 변화에 즉시 반응하여야 하는 경우 | ReactiveFallback |
| 한 번 시작된 행동이 완료될 때까지 유지되어야 하는 경우 | Fallback |
| 비상 대응, 우선순위 기반 행동 선택 | ReactiveFallback |
| 복구 전략의 순차적 시도 | Fallback |
6. 설계 시 고려 사항
6.1 선점의 안전성
높은 우선순위의 행동이 활성화되면 낮은 우선순위의 행동이 중단된다. 중단된 행동이 안전한 상태에서 종료되도록 halt() 메서드를 적절히 구현하여야 한다.
6.2 빈번한 행동 전환 방지
조건이 빠르게 변동하면 행동 전환이 빈번하게 발생하여 시스템이 불안정해진다. 조건에 히스테리시스를 적용하거나, 행동 전환 후 최소 실행 시간을 보장하는 쿨다운 로직을 추가하여야 한다.
6.3 조건의 평가 비용
ReactiveFallback은 매 tick마다 높은 우선순위의 조건부터 재평가하므로, 이 조건들의 평가 비용이 tick 주기에 직접적으로 영향을 미친다. 높은 우선순위에 비용이 높은 조건을 배치하면 성능 저하가 발생할 수 있다.
7. 참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |