1294.65 안전 조건이 선행하는 ReactiveSequence 패턴

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. 안전 조건 노드의 구현 요구사항

  1. 즉시 반환: SUCCESS 또는 FAILURE를 즉시 반환해야 한다. RUNNING을 반환하면 안 된다.
  2. 부수 효과 없음: 센서 값 읽기와 비교만 수행하며, 상태를 변경하지 않는다.
  3. 경량 구현: 매 Tick마다 실행되므로, 계산 비용이 최소화되어야 한다.
  4. 결정론적 동작: 동일한 입력에 대해 항상 동일한 결과를 반환해야 한다(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/