1294.25 Sequence, SequenceWithMemory, ReactiveSequence의 비교

1. 세 가지 Sequence 변형의 개관

BehaviorTree.CPP v4에서 제공하는 세 가지 Sequence 변형—기본 Sequence(SequenceWithMemory), ReactiveSequence, 그리고 개념적 기본 Sequence—은 모두 자식 노드를 왼쪽에서 오른쪽으로 순차적으로 평가하며 AND 의미론을 따른다는 공통점을 가진다. 그러나 RUNNING 상태 이후의 재진입 동작, 조건 재검사 여부, Halt 처리 방식에서 본질적인 차이를 보인다(Colledanchise & Ogren, 2018).

2. 핵심 특성 비교

2.1 재진입 동작

특성SequenceWithMemoryReactiveSequence
Tick 시작 위치마지막 RUNNING 자식 인덱스항상 인덱스 0
상태 변수current_child_idx 유지상태 변수 없음
SUCCESS 자식 재평가건너뜀매 Tick 재평가
메모리 유무있음 (Stateful)없음 (Stateless)

SequenceWithMemory는 이전 Tick에서 SUCCESS를 반환한 자식을 기억하고 건너뛰는 반면, ReactiveSequence는 매 Tick에서 모든 자식을 처음부터 재평가한다.

2.2 조건 감시 능력

특성SequenceWithMemoryReactiveSequence
조건 변화 감지불가가능
안전 조건 감시부적합적합
환경 변화 반응작업 완료 후에만 반응즉시 반응

ReactiveSequence는 앞쪽 조건 노드를 매 Tick마다 재평가하므로, 비동기 액션 실행 중 조건의 변화를 즉시 감지할 수 있다. SequenceWithMemory에서는 SUCCESS를 반환한 조건을 건너뛰므로, 해당 조건이 이후에 FAILURE로 변경되더라도 감지하지 못한다.

2.3 Halt 동작

특성SequenceWithMemoryReactiveSequence
조건 실패 시 RUNNING 자식 Halt해당 없음 (조건 재평가 없음)즉시 Halt
자체 FAILURE 시 RUNNING 자식 HaltHalt 수행Halt 수행
Halt 후 인덱스 초기화current_child_idx ← 0상태 없으므로 불필요

ReactiveSequence에서는 조건 재평가 결과 FAILURE가 발생하면, RUNNING 상태인 후속 자식에게 Halt를 전달하여 비동기 작업을 즉시 중단시킨다. 이 Halt 메커니즘이 ReactiveSequence의 안전 보장 기능의 핵심이다.

3. Tick 비용 비교

3.1 Tick당 노드 방문 수

자식 배열이 [C_0, C_1, ..., C_{k-1}, A_k]이고 A_k가 RUNNING 상태인 경우:

변형Tick당 방문 노드 수
SequenceWithMemory1 (A_k만 방문)
ReactiveSequencek + 1 (모든 자식 방문)

3.2 총 노드 방문 수 (M Tick 동안 RUNNING 유지)

변형초기 평가RUNNING 유지 기간총 방문 수
SequenceWithMemoryk + 1(M - 1) \times 1k + M
ReactiveSequencek + 1(M - 1) \times (k + 1)(k + 1) \times M

k = 3, M = 100인 경우:

  • SequenceWithMemory: 3 + 100 = 103
  • ReactiveSequence: 4 \times 100 = 400

ReactiveSequence의 비용이 약 3.9배 높지만, 조건 노드의 평가 비용이 충분히 작다면(순수 상태 확인) 실용적 영향은 미미하다.

4. 안전성 비교

4.1 시나리오: 배터리 소진 감지

<Sequence변형>
    <Condition ID="IsBatteryOK"/>
    <Action ID="Navigate"/>
</Sequence변형>
초기: Battery=30%

SequenceWithMemory:
  Tick 1: IsBatteryOK→S, Navigate→R (idx=1)
  Tick 2: Navigate→R               (IsBatteryOK 건너뜀)
  ...
  Tick N: Navigate→R               (Battery=5%이지만 감지 못함)
  Tick N+1: Navigate→S             (작업 완료)
  Tick N+2: IsBatteryOK→F          (이제서야 감지)

ReactiveSequence:
  Tick 1: IsBatteryOK→S, Navigate→R
  Tick 2: IsBatteryOK→S, Navigate→R
  ...
  Tick K: IsBatteryOK→F            (Battery<임계값)
          Navigate→Halt            (즉시 중단)

SequenceWithMemory에서는 네비게이션이 완료될 때까지 배터리 상태를 확인하지 않으므로, 배터리 소진 상황에서 로봇이 정지할 위험이 있다. ReactiveSequence에서는 배터리가 임계값 이하로 떨어지는 즉시 네비게이션을 중단한다.

5. 의미론적 비교

5.1 논리적 해석

두 변형은 동일한 AND 의미론을 따르지만, 그 적용 시점이 다르다.

  • SequenceWithMemory: “모든 자식이 순서대로 성공해야 한다” — 각 자식의 성공은 한 번만 확인된다.
  • ReactiveSequence: “모든 자식이 동시에 참이어야 한다” — 앞쪽 자식의 참 상태가 지속적으로 유지되어야 한다.

5.2 시간적 해석

  • SequenceWithMemory: 순차적 달성(sequential achievement) — 자식 i의 성공은 자식 i+1의 시작 전제 조건이며, 이후 재검증되지 않는다.
  • ReactiveSequence: 동시적 유지(concurrent maintenance) — 모든 앞쪽 자식의 성공 상태가 뒤쪽 자식의 실행 중에도 지속적으로 유지되어야 한다.

6. 설계 지침

6.1 SequenceWithMemory 사용이 적합한 경우

  • 자식 노드가 순차적 단계를 나타내며, 완료된 단계를 반복할 필요가 없는 경우
  • 부수 효과가 있는 액션(데이터베이스 기록, 메시지 전송 등)이 앞쪽에 위치하는 경우
  • 조건 재검사가 필요하지 않거나 별도의 안전 메커니즘이 존재하는 경우
<!-- 적합 사례: 순차적 임무 단계 -->
<SequenceWithMemory>
    <Action ID="Undock"/>
    <Action ID="NavigateToA"/>
    <Action ID="PickObject"/>
    <Action ID="NavigateToB"/>
    <Action ID="PlaceObject"/>
</SequenceWithMemory>

6.2 ReactiveSequence 사용이 적합한 경우

  • 앞쪽 노드가 부수 효과 없는 조건 노드이며, 지속적 감시가 필요한 경우
  • 안전 조건이 비동기 액션의 실행 중에도 유효해야 하는 경우
  • 환경 변화에 대한 즉각적 반응이 요구되는 경우
<!-- 적합 사례: 안전 조건 감시 -->
<ReactiveSequence>
    <Condition ID="IsNotEmergency"/>
    <Condition ID="IsBatteryOK"/>
    <Action ID="PerformMission"/>
</ReactiveSequence>

7. 종합 비교표

비교 항목SequenceWithMemoryReactiveSequence
재진입 방식기억된 인덱스부터 재개항상 처음부터 시작
상태 변수current_child_idx없음
SUCCESS 자식 처리건너뜀재평가
조건 재검사불가가능
Tick당 비용O(1) (RUNNING 시)O(k+1)
안전 감시부적합적합
부수 효과 안전성안전 (재실행 없음)위험 (앞쪽 액션 재실행)
전형적 앞쪽 노드액션 또는 조건조건만 권장
BT.CPP v4 태그<Sequence><ReactiveSequence>
사용 패턴순차적 임무 수행조건 감시 하의 작업

참고 문헌

  • 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/