1294.64 안전 우선 패턴 (Safety-First Pattern)

1. 안전 우선 패턴의 정의

안전 우선 패턴(Safety-First Pattern)은 ReactiveSequence의 앞쪽에 안전 조건 노드를 배치하고 뒤쪽에 임무 행동을 배치하여, 모든 행동이 안전 조건의 지속적 감시 하에 수행되도록 보장하는 설계 패턴이다. 안전 조건이 위반되면 어떤 행동을 수행 중이든 즉시 중단된다. 이 패턴은 로봇 안전 설계의 핵심 원칙인 “안전 우선(safety first)“을 행동 트리 수준에서 구현한 것이다(Colledanchise & Ogren, 2018).

2. 기본 구조

<ReactiveSequence>
    <!-- 안전 조건: 매 Tick 재검사 -->
    <Condition ID="SafetyCondition1"/>
    <Condition ID="SafetyCondition2"/>
    ...
    <!-- 임무 행동: 안전 감시 하에 수행 -->
    <SubTree ID="MissionBehavior"/>
</ReactiveSequence>

ReactiveSequence의 매 Tick 재평가 특성에 의해, 안전 조건이 매 Tick마다 재검사된다. 안전 조건 중 하나라도 FAILURE를 반환하면 MissionBehavior가 즉시 Halt된다.

3. 안전 조건의 배치 원칙

3.1 우선순위 기반 배치

가장 중요한 안전 조건을 가장 왼쪽에 배치한다. ReactiveSequence의 조기 종료(short-circuit) 특성에 의해, 앞쪽 조건이 FAILURE를 반환하면 뒤쪽 조건은 평가되지 않는다.

<ReactiveSequence>
    <Condition ID="IsEmergencyStopNotPressed"/>   <!-- 1순위: 비상 정지 -->
    <Condition ID="IsSafetyZoneNotViolated"/>      <!-- 2순위: 안전 구역 -->
    <Condition ID="IsBatteryAboveCritical"/>        <!-- 3순위: 배터리 -->
    <Condition ID="IsCommsAlive"/>                  <!-- 4순위: 통신 -->
    <SubTree ID="Mission"/>
</ReactiveSequence>

비상 정지 버튼이 눌리면 나머지 조건은 평가되지 않고 즉시 임무가 중단된다.

3.2 비용 기반 배치

동일한 중요도의 조건인 경우, 평가 비용이 낮은 조건을 앞에 배치하여 전체 Tick 비용을 최소화한다.

4. 다중 계층 안전 구조

4.1 시스템-임무-행동 3계층

<!-- 계층 1: 시스템 수준 안전 -->
<ReactiveSequence>
    <Condition ID="IsHardwareHealthy"/>
    <Condition ID="IsNotEmergency"/>
    <!-- 계층 2: 임무 수준 안전 -->
    <ReactiveSequence>
        <Condition ID="IsMissionAuthorized"/>
        <Condition ID="IsBatteryOK"/>
        <!-- 계층 3: 행동 수준 -->
        <SubTree ID="MissionExecution"/>
    </ReactiveSequence>
</ReactiveSequence>

시스템 수준의 안전 위반은 모든 임무를 중단시키고, 임무 수준의 안전 위반은 해당 임무만 중단시킨다.

5. 로봇 공학에서의 적용 사례

5.1 사례 1: 이동 로봇의 안전 감시

<ReactiveSequence>
    <Condition ID="IsEmergencyStopNotPressed"/>
    <Condition ID="IsBatteryAbove10Percent"/>
    <Condition ID="IsMotorTemperatureNormal"/>
    <Condition ID="IsNoCollisionImminent"/>
    <Fallback>
        <Sequence>
            <Condition ID="HasMission"/>
            <Action ID="ExecuteMission"/>
        </Sequence>
        <Action ID="Idle"/>
    </Fallback>
</ReactiveSequence>

5.2 사례 2: 산업용 매니퓰레이터의 안전 감시

<ReactiveSequence>
    <Condition ID="IsHumanNotInWorkspace"/>
    <Condition ID="IsJointTorqueNormal"/>
    <Condition ID="IsToolSecured"/>
    <Action ID="PerformManipulation"/>
</ReactiveSequence>

사람이 작업 공간에 진입하거나, 관절 토크가 비정상이거나, 공구가 해제되면 조작이 즉시 중단된다.

5.3 사례 3: 드론의 비행 안전 감시

<ReactiveSequence>
    <Condition ID="IsGeofenceNotViolated"/>
    <Condition ID="IsAltitudeBelowCeiling"/>
    <Condition ID="IsWindSpeedAcceptable"/>
    <Condition ID="IsBatteryAbove20Percent"/>
    <Condition ID="IsGPSFixValid"/>
    <Action ID="FlyMission"/>
</ReactiveSequence>

6. 안전 위반 시의 복구 패턴

안전 우선 패턴에 복구 행동을 결합하면, 안전 위반 시 자동 복구를 시도하는 구조를 구현할 수 있다.

<Fallback>
    <ReactiveSequence>
        <Condition ID="IsNotEmergency"/>
        <Condition ID="IsBatteryOK"/>
        <SubTree ID="NormalMission"/>
    </ReactiveSequence>
    <!-- 안전 위반 시 복구 행동 -->
    <Fallback>
        <Sequence>
            <Condition ID="IsBatteryLow"/>
            <Action ID="ReturnToCharge"/>
        </Sequence>
        <Action ID="EmergencyStop"/>
    </Fallback>
</Fallback>

정상 임무가 안전 위반으로 중단되면, 배터리 부족인 경우 충전소로 복귀하고, 그 외에는 비상 정지한다.

7. 안전 우선 패턴의 설계 원칙

  1. ReactiveSequence 필수: 안전 조건의 지속적 감시를 위해 반드시 ReactiveSequence를 사용한다. SequenceWithMemory는 안전 조건을 건너뛸 수 있으므로 부적합하다.

  2. 조건 노드의 순수성: 안전 조건 노드는 부수 효과가 없어야 하며, SUCCESS 또는 FAILURE를 즉시 반환해야 한다.

  3. 계층적 분리: 시스템 수준, 임무 수준, 행동 수준의 안전 조건을 별도의 ReactiveSequence로 분리하여 관리한다.

  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/