1294.65 안전 조건이 선행하는 ReactiveSequence 패턴
1. 패턴의 정의
안전 조건이 선행하는 ReactiveSequence 패턴은 ReactiveSequence의 앞쪽 자식에 안전 관련 조건 노드를 배치하여, 비동기 액션이 RUNNING 상태에서 진행되는 동안에도 안전 조건이 매 Tick마다 재검사되는 구조이다. 안전 조건이 FAILURE를 반환하면, 진행 중인 모든 작업이 즉시 Halt된다. 이 패턴은 안전 우선 패턴의 구체적 구현 형태이다(Colledanchise & Ogren, 2018).
2. SequenceWithMemory와의 차이
2.1 SequenceWithMemory (안전 위험)
<Sequence> <!-- WithMemory -->
<Condition ID="IsSafe"/>
<Action ID="PerformTask"/>
</Sequence>
Tick 1: IsSafe→S, PerformTask→R (idx=1)
Tick 2: PerformTask→R (IsSafe 건너뜀 — 위험!)
Tick 3: PerformTask→R (안전 상태 변화 미감지)
SequenceWithMemory는 IsSafe가 한 번 SUCCESS를 반환한 후 건너뛰므로, 이후 안전 상태가 변하더라도 감지하지 못한다.
2.2 ReactiveSequence (안전 보장)
<ReactiveSequence>
<Condition ID="IsSafe"/>
<Action ID="PerformTask"/>
</ReactiveSequence>
Tick 1: IsSafe→S, PerformTask→R
Tick 2: IsSafe→S, PerformTask→R (매 Tick 안전 재확인)
Tick 3: IsSafe→F (안전 위반 즉시 감지)
PerformTask→Halt
→ FAILURE
ReactiveSequence는 매 Tick마다 IsSafe를 재평가하므로, 안전 위반을 즉시 감지하고 작업을 중단한다.
3. 다중 안전 조건의 배치
3.1 우선순위 기반 안전 조건 체인
<ReactiveSequence>
<!-- 최우선 안전 조건 -->
<Condition ID="IsEmergencyStopNotPressed"/>
<!-- 2순위 안전 조건 -->
<Condition ID="IsSafetyPerimeterNotViolated"/>
<!-- 3순위 안전 조건 -->
<Condition ID="IsBatteryAboveCritical"/>
<!-- 4순위 안전 조건 -->
<Condition ID="IsTemperatureNormal"/>
<!-- 보호되는 행동 -->
<Action ID="PerformOperation"/>
</ReactiveSequence>
조기 종료 특성에 의해, 비상 정지가 눌리면 나머지 조건은 평가되지 않고 즉시 작업이 중단된다.
3.2 안전 조건의 분류
| 범주 | 예시 | 전형적 우선순위 |
|---|---|---|
| 비상 정지 | 비상 버튼, 하드웨어 인터록 | 최우선 |
| 물리적 안전 | 충돌 감지, 안전 구역 위반 | 높음 |
| 시스템 건강 | 센서 오류, 통신 두절 | 중간 |
| 자원 상태 | 배터리 부족, 과열 | 낮음 |
4. 동작 흐름의 상세 분석
4.1 정상 운영 흐름
Tick 1: E-Stop→S, Perimeter→S, Battery→S, Temp→S, Action→R → RUNNING
Tick 2: E-Stop→S, Perimeter→S, Battery→S, Temp→S, Action→R → RUNNING
...
Tick N: E-Stop→S, Perimeter→S, Battery→S, Temp→S, Action→S → SUCCESS
모든 안전 조건이 매 Tick 통과하는 동안 작업이 정상 진행된다.
4.2 안전 위반 흐름
Tick K: E-Stop→S, Perimeter→F (안전 구역 위반!)
Battery→(미평가), Temp→(미평가) (조기 종료)
Action→Halt (작업 즉시 중단)
→ FAILURE
4.3 안전 복구 후 재시작 흐름
Tick K: Perimeter→F → FAILURE (Action Halt → IDLE)
Tick K+1: Perimeter→F → FAILURE (Action 미실행)
Tick K+2: Perimeter→S, Battery→S, Temp→S → Action→R (onStart() 재시작)
안전 위반이 해소되면, Halt된 액션은 IDLE 상태에서 onStart()부터 다시 시작된다.
5. 로봇 공학에서의 적용 사례
5.1 사례 1: 협동 로봇의 안전 감시
<ReactiveSequence>
<Condition ID="IsHumanDistanceAboveThreshold"/>
<Condition ID="IsJointVelocityBelowLimit"/>
<Condition ID="IsContactForceNormal"/>
<Action ID="CollaborativeTask"/>
</ReactiveSequence>
사람과의 거리, 관절 속도, 접촉력 중 하나라도 기준을 초과하면 협동 작업이 중단된다.
5.2 사례 2: 자율 주행의 안전 감시
<ReactiveSequence>
<Condition ID="IsLidarOperational"/>
<Condition ID="IsCameraOperational"/>
<Condition ID="IsLocalizationConfident"/>
<Condition ID="IsNoObstacleInPath"/>
<Action ID="AutonomousDrive"/>
</ReactiveSequence>
5.3 사례 3: 수중 로봇의 안전 감시
<ReactiveSequence>
<Condition ID="IsDepthWithinLimit"/>
<Condition ID="IsHullIntegrityOK"/>
<Condition ID="IsTetherTensionNormal"/>
<Condition ID="IsBatteryAbove15Percent"/>
<Action ID="UnderwaterMission"/>
</ReactiveSequence>
6. 안전 조건 노드의 구현 요구사항
- 즉시 반환: SUCCESS 또는 FAILURE를 즉시 반환해야 한다. RUNNING을 반환하면 안 된다.
- 부수 효과 없음: 센서 값 읽기와 비교만 수행하며, 상태를 변경하지 않는다.
- 경량 구현: 매 Tick마다 실행되므로, 계산 비용이 최소화되어야 한다.
- 결정론적 동작: 동일한 입력에 대해 항상 동일한 결과를 반환해야 한다(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/