1295.34 안전 조건 모니터링과 주 행동의 동시 실행

1295.34 안전 조건 모니터링과 주 행동의 동시 실행

1. 동시 실행 모델의 구조

안전 조건 모니터링과 주 행동의 동시 실행은 Parallel 노드의 가장 핵심적인 안전 관련 적용 구조이다. 이 구조에서 주 행동(primary action) 노드는 로봇의 실질적인 임무를 수행하고, 안전 조건 모니터링(safety condition monitoring) 노드는 임무 수행 중 안전 불변 조건(safety invariant)의 충족 여부를 매 Tick마다 점검한다.

Parallel (success_policy: SUCCESS_ALL, failure_policy: FAILURE_ONE)
├── PrimaryAction         →  주 행동 (RUNNING 유지, 완료 시 SUCCESS)
├── SafetyCondition_1     →  안전 조건 1 감시 (정상: RUNNING, 위반: FAILURE)
├── SafetyCondition_2     →  안전 조건 2 감시
└── SafetyCondition_N     →  안전 조건 N 감시

이 구조의 의미론은 다음과 같이 정의된다. 주 행동이 실행되는 모든 시간 단계에서, 모든 안전 조건 S_1, S_2, \ldots, S_N이 동시에 충족되어야 한다. 시간 t에서의 안전 불변 조건은 다음과 같다.

\forall t \in [t_{start}, t_{end}],\quad \bigwedge_{i=1}^{N} S_i(t) = \text{true}

Parallel 노드의 FAILURE_ONE 정책이 이 불변 조건의 위반을 감지하면, 즉시 주 행동을 포함한 모든 자식에 Halt를 전파하여 행동을 중단시킨다.

주 행동 노드의 설계 요구 사항

Halt 즉시 응답성

주 행동 노드는 Halt 호출을 수신하면 가능한 한 빠르게 현재 동작을 중단하고 안전한 상태로 전이하여야 한다. 안전 조건 위반에 의해 Halt가 호출되는 것이므로, Halt 처리의 지연은 안전 위험에 대한 대응 지연을 직접적으로 의미한다.

ROS2 액션 서버를 통해 실행되는 주 행동의 경우, Halt 호출 시 다음 절차를 수행하여야 한다.

function PrimaryAction.halt():
    if action_client.is_goal_active():
        action_client.cancel_goal()
    cleanup_resources()
    reset_internal_state()

액션 목표 취소(cancel goal) 요청의 처리 시간이 보장되지 않으므로, 취소 요청 발행과 동시에 로컬에서도 즉각적인 안전 조치(속도 0 명령 발행, 브레이크 활성화 등)를 수행하는 것이 권장된다.

주 행동의 복합 구조

주 행동이 단일 액션이 아닌 복합적인 행동 시퀀스인 경우, 서브트리로 감싸서 Parallel 노드의 자식으로 배치한다.

Parallel (success_policy: SUCCESS_ALL, failure_policy: FAILURE_ONE)
├── SubTree: MissionSequence
│   └── Sequence
│       ├── NavigateToPickPosition
│       ├── PickObject
│       ├── NavigateToPlacePosition
│       └── PlaceObject
├── SafetyMonitor_CollisionRisk
├── SafetyMonitor_BatteryLevel
└── SafetyMonitor_SystemHealth

서브트리 내의 어떤 단계를 실행 중이든, 안전 조건 위반이 감지되면 Parallel 노드의 Halt가 서브트리로 전파되고, 서브트리 내에서 현재 실행 중인 노드에까지 Halt가 재귀적으로 전파된다.

안전 조건 모니터링 노드의 설계 요구 사항

상태 전이 모델

안전 조건 모니터링 노드의 상태 전이는 다음과 같이 정의된다.

function SafetyCondition.tick():
    sensor_data ← acquireSensorData()
    
    if sensor_data is invalid or stale:
        blackboard.set("safety_violation", "SENSOR_DATA_INVALID")
        return FAILURE    // 안전 방향 실패 원칙
    
    if evaluateCondition(sensor_data) == SAFE:
        return RUNNING
    else:
        blackboard.set("safety_violation", describe_violation())
        return FAILURE

안전 조건 모니터링 노드는 세 가지 경우에 FAILURE를 반환한다: (1) 센서 데이터가 유효하지 않은 경우, (2) 센서 데이터가 갱신되지 않아 유효 기간이 경과한 경우, (3) 안전 조건이 위반된 경우. 이 세 경우 모두 안전 방향 실패(fail-safe) 원칙에 의해 동일하게 행동 중단을 유발한다.

센서 데이터 유효성 검증

안전 조건 모니터링에 사용되는 센서 데이터의 유효성을 검증하는 것은 신뢰할 수 있는 안전 감시의 전제 조건이다.

검증 항목검증 방법실패 시 동작
데이터 수신 여부토픽 구독 상태 확인FAILURE 반환
데이터 신선도타임스탬프와 현재 시각 비교FAILURE 반환
데이터 범위물리적 타당 범위 확인FAILURE 반환
센서 자체 진단센서 상태 필드 확인FAILURE 반환
function validateSensorData(data, max_age):
    if data is null:
        return INVALID    // 데이터 미수신
    
    age ← current_time() - data.timestamp
    if age > max_age:
        return INVALID    // 데이터 유효 기간 경과
    
    if not isPhysicallyPlausible(data.value):
        return INVALID    // 물리적 비타당 값
    
    return VALID

안전 조건의 실행 시간 적응

동적 임계값 조정

안전 조건의 임계값은 로봇의 현재 운용 상태에 따라 동적으로 조정될 수 있다. 예를 들어, 충돌 방지를 위한 안전 거리는 로봇의 현재 속도에 비례하여 증가하여야 한다.

Parallel (success_policy: SUCCESS_ALL, failure_policy: FAILURE_ONE)
├── NavigateToGoal
│   output: "current_velocity"
└── DynamicCollisionMonitor
    input: "current_velocity", "base_safety_distance"

DynamicCollisionMonitor 노드는 블랙보드에서 현재 속도 v를 읽어, 안전 거리를 d_{safe}(v) = d_{base} + \frac{v^2}{2a_{max}}로 동적으로 산출한다. 여기서 d_{base}는 기본 안전 거리, a_{max}는 최대 감속도이다.

운용 모드에 따른 안전 조건 변경

로봇의 운용 모드(자율 모드, 원격 조작 모드, 유지 보수 모드 등)에 따라 적용되는 안전 조건의 집합이 달라질 수 있다. 이를 행동 트리에서 구현하기 위해, 안전 조건 모니터링 노드 내에서 현재 운용 모드를 확인하고 해당 모드에 적합한 임계값과 판정 기준을 적용한다.

function SafetyMonitor_CollisionRisk.tick():
    mode ← blackboard.get("operation_mode")
    
    if mode == AUTONOMOUS:
        safety_distance ← 1.5  // 자율 모드: 넓은 안전 거리
    elif mode == TELEOPERATION:
        safety_distance ← 0.5  // 원격 조작 모드: 좁은 안전 거리
    
    min_distance ← getMinObstacleDistance()
    
    if min_distance < safety_distance:
        return FAILURE
    else:
        return RUNNING

안전 조건 위반 정보의 기록

안전 조건 위반 시, 위반의 종류, 측정값, 임계값, 시각 등의 상세 정보를 블랙보드에 기록하는 것은 사후 분석과 복구 전략 수립에 필수적이다.

function SafetyCondition.onViolation(measured, threshold):
    violation_info ← {
        "type": self.condition_type,
        "measured_value": measured,
        "threshold": threshold,
        "timestamp": current_time(),
        "robot_state": blackboard.get("robot_state")
    }
    blackboard.set("last_safety_violation", violation_info)
    return FAILURE

상위 행동 트리에서 Parallel 노드의 실패 후 분기하는 복구 노드는 last_safety_violation을 읽어 위반 유형에 적합한 복구 전략을 선택할 수 있다.

XML 정의 예시

<Parallel success_count="4" failure_count="1">
    <SubTree ID="PickAndPlaceMission" 
             target="{pick_target}" 
             place="{place_position}" />
    <MonitorCollisionRisk safety_dist="{dynamic_safety_dist}" 
                          output="{violation_info}" />
    <MonitorBatteryLevel threshold="{min_battery}" 
                         output="{violation_info}" />
    <MonitorSystemHealth output="{violation_info}" />
</Parallel>

success_count="4"는 주 행동 서브트리와 모든 안전 감시 노드가 완료되어야 전체가 성공으로 종료됨을 의미한다. failure_count="1"은 어느 하나라도 실패하면 전체가 즉시 실패로 종료됨을 보장한다.

행동 트리 수준 안전 감시의 한계와 보완

행동 트리를 통한 안전 조건 모니터링은 소프트웨어 수준의 안전 계층(safety layer)이다. 행동 트리의 Tick 주기에 의해 안전 조건 점검의 시간 해상도가 제한되며, 소프트웨어 장애 시 안전 감시 자체가 동작하지 않을 수 있다. 따라서 행동 트리 수준의 안전 감시는 단독으로 안전을 보장하는 것이 아니라, 하드웨어 수준의 안전 시스템(E-Stop 회로, 안전 제어기, 전류 제한기 등)과 함께 다중 방호 계층(defense-in-depth)을 구성하는 하나의 계층으로 위치하여야 한다.

행동 트리의 안전 감시가 담당하는 역할은 임무 수준의 안전 판단(이 작업을 계속해도 안전한가?)이며, 물리적 수준의 즉각적 보호(과전류 차단, 충돌 시 토크 제한 등)는 하드웨어 안전 시스템이 담당하여야 한다.