조건 지속 감시 패턴 (Continuous Condition Monitoring Pattern)
1. 개요
조건 지속 감시 패턴은 행동의 실행 중에도 조건을 지속적으로 재평가하여, 조건이 위반되면 즉시 행동을 중단하는 행동 트리 설계 패턴이다. 이 패턴은 ReactiveSequence를 활용하여 구현되며, 안전 조건 감시, 전제 조건 유지 확인, 환경 변화에 대한 즉각적 대응 등에 핵심적으로 사용된다.
2. 패턴의 구조
2.1 기본 구조
<ReactiveSequence>
<Condition ID="MonitoredCondition"/>
<Action ID="GuardedAction"/>
</ReactiveSequence>
MonitoredCondition은 매 tick마다 재평가되며, FAILURE를 반환하는 순간 GuardedAction이 중단(halt)된다. GuardedAction이 RUNNING 상태로 수 초에 걸쳐 실행되는 동안에도, 조건은 매 tick마다 감시된다.
2.2 패턴의 의미론
이 패턴은 다음 의미론을 표현한다.
“조건이 유지되는 동안에만 행동을 수행하라. 조건이 위반되면 행동을 즉시 중단하라.”
이는 가드(guard) 조건 또는 불변 조건(invariant)의 개념에 해당한다.
3. 실용적 변형
3.1 다중 조건 감시
<ReactiveSequence>
<Condition ID="IsBatteryAbove" min_percentage="0.15"/>
<Condition ID="IsNotEmergencyStopped"/>
<Condition ID="IsScanReceived" max_age_sec="0.5"/>
<Action ID="NavigateToGoal"/>
</ReactiveSequence>
세 개의 조건이 모두 유지되는 동안에만 내비게이션을 수행한다.
3.2 조건 위반 시 대체 행동 실행
<Fallback>
<ReactiveSequence>
<Condition ID="IsAllClear"/>
<Action ID="NormalOperation"/>
</ReactiveSequence>
<Action ID="FallbackBehavior"/>
</Fallback>
조건이 유지되면 정상 운용, 위반되면 대체 행동을 실행한다.
3.3 계층적 감시
<ReactiveSequence name="SafetyGuard">
<Condition ID="IsNotEmergencyStopped"/>
<ReactiveSequence name="OperationalGuard">
<Condition ID="IsBatteryAbove" min_percentage="0.2"/>
<ReactiveSequence name="MissionGuard">
<Condition ID="IsInsideGeofence"/>
<Action ID="ExecuteMission"/>
</ReactiveSequence>
</ReactiveSequence>
</ReactiveSequence>
안전 조건 → 운용 조건 → 임무 조건의 계층적 감시 구조를 형성한다. 상위 조건이 위반되면 하위의 모든 행동이 중단된다.
4. 감시 패턴의 변형: 단발 확인 후 감시
일부 조건은 최초에 한 번 확인하면 되고, 다른 조건은 지속적으로 감시하여야 한다. 이 경우 두 가지 패턴을 결합한다.
<Sequence>
<!-- 일회성 전제 조건 (Sequence: 한 번만 확인) -->
<Condition ID="IsSystemInitialized"/>
<Condition ID="IsCalibrationComplete"/>
<!-- 지속적 감시 조건 (ReactiveSequence: 매 tick 재평가) -->
<ReactiveSequence>
<Condition ID="IsBatteryAbove" min_percentage="0.15"/>
<Condition ID="IsSensorDataFresh"/>
<Action ID="PerformMission"/>
</ReactiveSequence>
</Sequence>
외부 Sequence에서 초기화와 캘리브레이션을 한 번 확인하고, 내부 ReactiveSequence에서 배터리와 센서를 지속적으로 감시한다.
5. Nav2에서의 조건 감시 패턴
Nav2의 기본 행동 트리는 조건 지속 감시 패턴을 광범위하게 활용한다.
<!-- Nav2의 전형적 내비게이션 행동 트리 구조 (간략화) -->
<ReactiveSequence>
<RateController hz="1.0">
<Condition ID="GoalUpdated"/>
</RateController>
<Fallback>
<ReactiveSequence>
<Condition ID="IsPathValid"/>
<Action ID="FollowPath"/>
</ReactiveSequence>
<Action ID="ComputePathToPose"/>
</Fallback>
</ReactiveSequence>
경로가 유효한 동안에는 경로를 추종하고, 유효하지 않으면 경로를 재계산한다. 목표가 갱신되면 전체 내비게이션 로직이 재시작된다.
6. 설계 시 고려 사항
6.1 감시 빈도와 tick 주기
조건 감시의 빈도는 행동 트리의 tick 주기에 의해 결정된다. tick 주기가 100ms이면 조건은 초당 10회 재평가된다. 안전 요구에 따라 더 높은 감시 빈도가 필요한 경우 tick 주기를 줄여야 한다.
6.2 행동 중단의 안전성
조건 위반으로 액션이 중단될 때, 액션이 안전한 상태에서 종료되도록 하여야 한다. halt() 메서드에서 적절한 정리 작업(속도 0 설정, 그리퍼 유지 등)을 수행하여야 한다.
6.3 조건 진동에 의한 반복 중단/재개
조건 결과가 빠르게 SUCCESS와 FAILURE 사이를 진동하면, 행동이 반복적으로 시작과 중단을 반복하여 시스템이 불안정해질 수 있다. 히스테리시스를 적용하여 조건 전환에 필요한 변화량을 증가시키면 이 문제를 방지할 수 있다.
7. 참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Macenski, S., et al. (2020). “The Marathon 2: A Navigation System.” arXiv preprint arXiv:2003.00368.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |