AND 복합 조건의 Sequence 기반 구현 (AND Compound Condition via Sequence)
1. 개요
AND 복합 조건은 복수의 조건이 모두 참(SUCCESS)일 때에만 전체 조건이 참이 되는 논리적 결합(conjunction)이다. 행동 트리에서는 Sequence 제어 노드를 사용하여 AND 복합 조건을 구현한다. Sequence 노드는 자식 노드를 순차적으로 평가하며, 모든 자식이 SUCCESS를 반환할 때에만 자신도 SUCCESS를 반환하므로, 논리 AND 연산과 동일한 의미론을 제공한다.
2. Sequence의 AND 의미론
2.1 진리표
n개의 조건 C_1, C_2, \ldots, C_n에 대한 AND 복합 조건의 진리표는 다음과 같다.
| C_1 | C_2 | \ldots | C_n | \text{Sequence}(C_1, C_2, \ldots, C_n) |
|---|---|---|---|---|
| S | S | \ldots | S | S |
| F | * | \ldots | * | F |
| S | F | \ldots | * | F |
| S | S | \ldots | F | F |
여기서 S는 SUCCESS, F는 FAILURE, *는 평가되지 않음을 나타낸다.
2.2 단락 평가
Sequence는 왼쪽에서 오른쪽으로 자식을 평가하며, FAILURE를 만나면 나머지 자식을 평가하지 않고 즉시 FAILURE를 반환한다. 이는 프로그래밍 언어의 논리 AND 연산자(&&)의 단락 평가(short-circuit evaluation)와 동일한 동작이다.
3. 구현 예시
3.1 비행 전 안전 점검
드론 이륙 전에 모든 안전 조건이 충족되었는지를 확인하는 AND 복합 조건이다.
<BehaviorTree ID="PreFlightCheck">
<Sequence name="AllPreFlightConditions">
<Condition ID="IsFcuConnected"
topic_name="/mavros/state"/>
<Condition ID="IsArmed"
topic_name="/mavros/state"/>
<Condition ID="IsGpsFixAvailable"
topic_name="/gps/fix"
min_status="0"/>
<Condition ID="IsBatteryAbove"
topic_name="/battery_state"
min_percentage="0.3"/>
<Condition ID="IsWindSpeedAcceptable"
topic_name="/wind_estimation"
max_wind_speed="8.0"/>
<Action ID="Takeoff"/>
</Sequence>
</BehaviorTree>
다섯 개의 조건이 모두 SUCCESS를 반환하여야만 이륙 액션이 실행된다.
3.2 안전 조건 지속 감시
ReactiveSequence를 사용하면 매 tick마다 모든 조건을 재평가하여, 실행 중에도 AND 조건을 지속적으로 감시한다.
<BehaviorTree ID="ContinuousSafetyCheck">
<ReactiveSequence>
<Condition ID="IsNotEmergencyStopped"
topic_name="/e_stop"/>
<Condition ID="IsBatteryAbove"
topic_name="/battery_state"
min_percentage="0.15"/>
<Condition ID="IsCommsConnected"
topic_name="/operator/heartbeat"
timeout_sec="3.0"/>
<Action ID="ContinueMission"/>
</ReactiveSequence>
</BehaviorTree>
ReactiveSequence에서는 매 tick마다 첫 번째 자식부터 재평가하므로, 비상 정지가 활성화되거나, 배터리가 부족하거나, 통신이 두절되면 즉시 ContinueMission 액션이 중단된다.
3.3 Sequence와 ReactiveSequence의 AND 의미론 차이
| 특성 | Sequence | ReactiveSequence |
|---|---|---|
| 재평가 | SUCCESS인 자식을 건너뜀 | 매 tick마다 처음부터 재평가 |
| 적합한 용도 | 순차적 전제 조건 확인 | 지속적 안전 조건 감시 |
| 조건 변화 반영 | 한 번 통과한 조건은 재검사하지 않음 | 항상 최신 상태 반영 |
AND 복합 조건이 한 번만 평가되면 충분한 경우(예: 초기화 점검) Sequence를, 지속적으로 모니터링되어야 하는 경우(예: 안전 감시) ReactiveSequence를 사용한다.
4. 조건 평가 순서의 최적화
4.1 비용 기반 정렬
계산 비용이 낮은 조건을 앞에 배치하면, FAILURE가 발생하는 경우 비용이 높은 조건의 불필요한 평가를 회피할 수 있다.
<!-- 최적화된 순서: 비용이 낮은 순 -->
<Sequence>
<Condition ID="IsBoolTrue" value="{flag}"/> <!-- 비용: 매우 낮음 -->
<Condition ID="IsBatteryAbove" min_percentage="0.2"/> <!-- 비용: 낮음 -->
<Condition ID="IsPathValid"/> <!-- 비용: 높음 (서비스 호출) -->
</Sequence>
4.2 실패 확률 기반 정렬
FAILURE 확률이 높은 조건을 앞에 배치하면, 평균적으로 평가하는 조건의 수가 줄어든다.
5. 중첩 AND 조건
AND 복합 조건을 계층적으로 중첩하여 구조적으로 분류할 수 있다.
<Sequence name="AllSystemsGo">
<Sequence name="SensorsReady">
<Condition ID="IsLidarReceived"/>
<Condition ID="IsImuNormal"/>
<Condition ID="IsGpsFixAvailable"/>
</Sequence>
<Sequence name="PowerOk">
<Condition ID="IsBatteryAbove"/>
<Condition ID="IsCurrentNormal"/>
</Sequence>
<Sequence name="SafetyOk">
<Condition ID="IsNotEmergencyStopped"/>
<Condition ID="IsCommsConnected"/>
</Sequence>
</Sequence>
외부 Sequence는 세 개의 내부 Sequence 그룹이 모두 SUCCESS를 반환하여야만 SUCCESS를 반환한다. 이 구조는 가독성을 높이고, 어떤 그룹의 조건이 실패하였는지를 로깅이나 디버깅 시 쉽게 파악할 수 있게 한다.
6. 설계 시 고려 사항
6.1 조건 수의 한계
AND 복합 조건에 포함된 조건의 수가 증가하면, 모든 조건이 SUCCESS를 반환하여야 하므로 전체 SUCCESS 확률이 감소한다. 독립적인 조건의 경우, n개 조건의 AND 복합 조건의 성공 확률은 개별 성공 확률의 곱이다.
P(\text{AND}) = \prod_{i=1}^{n} P(C_i = \text{SUCCESS})
과도하게 많은 조건을 AND로 결합하면 시스템이 지나치게 보수적으로 동작할 수 있으므로, 각 조건의 필요성을 신중히 판단하여야 한다.
부분 실패의 진단
AND 복합 조건이 FAILURE를 반환할 때, 어떤 조건이 FAILURE를 유발하였는지를 파악하기 위해 각 조건 노드의 평가 결과를 로깅하는 것이 유용하다.
참고 문헌
- 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 | 초안 작성 |