1294.4 Sequence 노드의 개념과 정의

1. Sequence 노드의 정의

Sequence 노드는 행동 트리의 제어 흐름 노드 중 하나로, 자식 노드들을 왼쪽에서 오른쪽으로 순차적으로 실행하며, 모든 자식이 SUCCESS를 반환해야 자신도 SUCCESS를 반환하는 노드이다. 하나의 자식이라도 FAILURE를 반환하면 Sequence 노드는 즉시 FAILURE를 반환하고, 나머지 자식의 실행을 생략한다(Colledanchise & Ogren, 2018).

Sequence 노드는 “모든 작업이 성공해야 전체가 성공“이라는 의미론을 가지며, 이는 논리 연산의 AND(논리곱)에 대응한다. 이 특성으로 인해 조건 확인 후 작업을 수행하는 순차적 절차, 다수의 전제 조건이 모두 충족되어야 하는 상황, 단계별 임무 수행 등에 널리 사용된다.

2. 형식적 정의

N개의 자식 노드 C_1, C_2, \ldots, C_N을 가진 Sequence 노드의 반환 상태 S는 다음과 같이 정의된다.

  • S = \text{FAILURE}: \exists\, i \in \{1, \ldots, N\} 이고 C_i = \text{FAILURE}이며, \forall\, j < i,\ C_j = \text{SUCCESS}
  • S = \text{RUNNING}: \exists\, i \in \{1, \ldots, N\} 이고 C_i = \text{RUNNING}이며, \forall\, j < i,\ C_j = \text{SUCCESS}
  • S = \text{SUCCESS}: \forall\, i \in \{1, \ldots, N\},\ C_i = \text{SUCCESS}

이 정의에서 자식의 평가 순서는 C_1부터 C_N까지 순차적이며, FAILURE 또는 RUNNING을 반환하는 첫 번째 자식에서 평가가 중단된다.

3. 시각적 표기

행동 트리의 표준 시각적 표기에서 Sequence 노드는 오른쪽 화살표(→) 기호가 포함된 상자로 표현된다.

    [→]
   / | \
  C₁ C₂ C₃

이 표기에서 자식 C_1, C_2, C_3은 왼쪽에서 오른쪽 순서로 실행된다.

4. XML에서의 표현

BehaviorTree.CPP v4의 XML 정의에서 Sequence 노드는 <Sequence> 태그로 표현된다.

<Sequence>
    <Condition ID="IsBatteryAbove20"/>
    <Condition ID="IsPathClear"/>
    <Action ID="NavigateToGoal"/>
</Sequence>

이 XML은 “배터리가 20% 이상이고, 경로가 안전하면 목표 지점으로 네비게이션한다“는 순차적 의사 결정을 표현한다.

5. Sequence 노드의 동작 예시

5.1 모든 자식 성공

Tick 결과:
  IsBatteryAbove20 → SUCCESS
  IsPathClear      → SUCCESS
  NavigateToGoal   → SUCCESS
  Sequence         → SUCCESS

5.2 조건 실패에 의한 조기 종료

Tick 결과:
  IsBatteryAbove20 → SUCCESS
  IsPathClear      → FAILURE  ← 경로 미확보
  NavigateToGoal   → (평가되지 않음)
  Sequence         → FAILURE

IsPathClear가 FAILURE를 반환하면, NavigateToGoal은 Tick을 수신하지 않으며, Sequence는 즉시 FAILURE를 반환한다.

5.3 비동기 작업에 의한 RUNNING

Tick 1:
  IsBatteryAbove20 → SUCCESS
  IsPathClear      → SUCCESS
  NavigateToGoal   → RUNNING  ← 네비게이션 진행 중
  Sequence         → RUNNING

Tick 2 (WithMemory):
  NavigateToGoal   → SUCCESS  ← 네비게이션 완료
  Sequence         → SUCCESS

NavigateToGoal이 RUNNING을 반환하면 Sequence도 RUNNING을 반환한다. 다음 Tick에서의 재진입 동작은 WithMemory 또는 Reactive 변형에 따라 달라진다.

6. Sequence 노드의 직관적 이해

Sequence 노드는 일상 언어로 “~하고, ~하고, ~한다“라는 순차적 절차를 표현한다. 모든 단계가 성공적으로 완료되어야 전체 절차가 성공이며, 중간에 하나의 단계라도 실패하면 전체 절차가 실패한다.

일상적 예:
  "문을 열고, 방에 들어가고, 불을 켠다"
  → 문이 잠겨 있으면(FAILURE) → 전체 절차 실패
  → 모든 단계 완료 → 전체 절차 성공

이러한 직관적 의미론은 행동 트리의 설계를 비전문가도 이해할 수 있게 하며, 로봇의 행동 논리를 자연어에 가까운 형태로 표현할 수 있게 한다(Colledanchise & Ogren, 2018).

7. BehaviorTree.CPP v4에서의 기본 동작

BehaviorTree.CPP v4에서 <Sequence> 태그는 기본적으로 WithMemory 동작을 수행한다. 즉, 이전 Tick에서 SUCCESS를 반환한 자식을 건너뛰고, RUNNING 상태였던 자식부터 재개한다. 매 Tick마다 첫 번째 자식부터 재평가하는 동작은 <ReactiveSequence> 태그로 명시적으로 지정해야 한다(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/