1295.66 Parallel과 Reactive 노드의 조합 패턴

1. 조합의 동기

Parallel, ReactiveSequence, ReactiveFallback은 각각 고유한 실행 의미론을 가진다. 단일 노드로는 표현할 수 없는 복합적인 행동 요구 사항이 로봇공학에서 빈번하게 발생하며, 이 경우 이들 노드를 중첩하여 조합함으로써 더 정교한 행동 제어를 실현할 수 있다. 조합 패턴의 핵심은 각 노드의 의미론이 중첩 시에도 올바르게 보존되는 것이다.

2. 조합 패턴의 분류

조합 패턴외부 노드내부 노드의미
안전 감시 하의 동시 행동ReactiveSequenceParallel안전 조건 하에서 복수 행동 동시 수행
안전 감시 하의 우선순위 선택ReactiveSequenceReactiveFallback안전 조건 하에서 우선순위 행동 선택
동시 행동 내의 조건 보장ParallelReactiveSequence동시 행동 각각에 조건 보장 적용
우선순위 분기 내의 동시 행동ReactiveFallbackParallel선택된 분기 내에서 동시 행동 수행
우선순위 분기 내의 조건 보장ReactiveFallbackReactiveSequence선택된 분기 내에서 조건 보장

3. 안전 감시 하의 동시 행동

ReactiveSequence의 마지막 자식으로 Parallel을 배치하여, 안전 조건이 지속적으로 보장되는 동안 복수의 행동을 동시에 수행한다.

ReactiveSequence
├── IsSafe                          // 안전 조건 (매 Tick 재평가)
├── IsSystemOperational             // 시스템 정상 조건
└── Parallel (success_policy: SUCCESS_ALL)
    ├── NavigateAlongPath           // 경로 이동
    ├── CollectSensorData           // 센서 데이터 수집
    └── MonitorBattery              // 배터리 감시

안전 조건이나 시스템 정상 조건이 위반되면, Parallel 전체에 Halt가 전파되어 세 행동 모두 중단된다. 이 패턴은 “안전하고 시스템이 정상인 동안, 이동, 데이터 수집, 배터리 감시를 동시에 수행하라“를 구조적으로 표현한다.

4. 안전 감시 하의 우선순위 선택

ReactiveSequence의 마지막 자식으로 ReactiveFallback을 배치하여, 안전 조건이 보장되는 동안 우선순위에 따른 행동 선택을 수행한다.

ReactiveSequence
├── IsSafe                          // 안전 조건
└── ReactiveFallback                // 우선순위 행동 선택
    ├── Sequence [긴급 귀환]
    │   ├── IsBatteryLow
    │   └── ReturnToBase
    ├── Sequence [장애물 회피]
    │   ├── IsObstacleNear
    │   └── AvoidObstacle
    └── ExecuteMission              // 정상 임무

안전 조건 위반 시 전체 행동이 중단된다. 안전 조건이 유지되는 동안에는 ReactiveFallback이 배터리 상태와 장애물 상황에 따른 행동 선택을 수행한다.

5. 동시 행동 내의 개별 조건 보장

Parallel의 자식으로 ReactiveSequence를 배치하여, 동시에 수행되는 각 행동에 개별적인 전제 조건을 적용한다.

Parallel (success_policy: SUCCESS_ALL)
├── ReactiveSequence [조건부 이동]
│   ├── IsPathClear
│   └── NavigateToGoal
└── ReactiveSequence [조건부 촬영]
    ├── IsLightingAdequate
    └── CaptureImages

이동과 촬영이 동시에 수행되되, 이동은 경로가 안전한 동안에만, 촬영은 조명이 적절한 동안에만 수행된다. 경로에 장애물이 출현하면 이동만 중단되고 촬영은 계속된다. 조명이 부적절해지면 촬영만 중단되고 이동은 계속된다.

6. 우선순위 분기 내의 동시 행동

ReactiveFallback의 각 우선순위 분기 내에서 Parallel을 사용하여 동시 행동을 수행한다.

ReactiveFallback
├── Sequence [비상 대응]
│   ├── IsEmergency
│   └── Parallel (success_policy: SUCCESS_ALL)
│       ├── EmergencyStop
│       └── SendDistressSignal
├── Sequence [정상 운용]
│   ├── IsAllNormal
│   └── Parallel (success_policy: SUCCESS_ALL)
│       ├── NavigateToGoal
│       └── RecordData
└── SafeStop

비상 상황 시 긴급 정지와 구조 신호 발신을 동시에 수행하고, 정상 운용 시 이동과 데이터 기록을 동시에 수행한다.

7. 다층 반응형 구조

ReactiveSequence와 ReactiveFallback을 다층으로 중첩하여 복합적인 반응형 행동을 구성한다.

ReactiveSequence [최외곽: 안전 보장]
├── IsHardwareSafe
└── ReactiveFallback [2층: 상황별 행동 선택]
    ├── ReactiveSequence [비상 귀환]
    │   ├── IsBatteryCritical
    │   └── EmergencyReturn
    ├── ReactiveSequence [조건부 임무]
    │   ├── IsLocalized
    │   ├── IsPathValid
    │   └── ExecuteMission
    └── WaitForRecovery

최외곽 ReactiveSequence가 하드웨어 안전을 보장하고, 2층 ReactiveFallback이 상황에 따른 행동을 선택하며, 선택된 행동 분기 내의 ReactiveSequence가 개별 전제 조건을 보장한다. 하드웨어 이상 시 전체가 중단되고, 배터리 위급 시 비상 귀환이 선점되고, 정상 시 위치 추정과 경로 유효성이 보장되는 동안 임무가 수행된다.

8. 조합 시 유의 사항

8.1 Halt 전파의 연쇄

중첩 구조에서 외부 노드의 Halt는 내부 노드로 재귀적으로 전파된다. ReactiveSequence의 조건 위반으로 Halt가 발생하면, 내부의 Parallel 또는 ReactiveFallback의 모든 RUNNING 자식에 Halt가 전파된다.

ReactiveSequence의 조건 FAILURE
→ Parallel.halt()
  → NavigateToGoal.halt()
  → CollectSensorData.halt()
  → MonitorBattery.halt()

모든 내부 행동이 안전하게 Halt를 처리할 수 있어야 한다.

8.2 중첩 깊이의 제한

과도한 중첩은 트리의 가독성과 디버깅 용이성을 저하시킨다. 일반적으로 3~4 수준 이상의 중첩은 피하고, 복잡한 하위 트리는 서브트리(subtree)로 분리하여 관리하는 것을 권장한다.

8.3 Tick 시간의 누적

중첩이 깊어지면 단일 Tick에서 평가되는 노드의 수가 증가한다. 특히 ReactiveSequence의 조건 재평가와 Parallel의 전체 자식 평가가 중첩되면 Tick 시간이 증가할 수 있다. 실시간 제약 조건 내에서 Tick이 완료되는지를 검증하여야 한다.