1292.77 노드 실행의 시점

1. 노드 실행의 정의

노드 실행(execution)이란 행동 트리의 노드가 tick을 수신하여 자신이 캡슐화한 행동 또는 제어 로직을 수행하는 과정이다. 실행의 시점은 상위 노드로부터 tick이 전달되는 시점에 의해 결정되며, 노드의 유형과 현재 상태에 따라 호출되는 콜백이 달라진다 (Faconti, BehaviorTree.CPP Documentation, 2024).

2. 실행 시점의 결정

노드의 실행 시점은 상위 제어 흐름 노드의 동작에 의해 결정된다. 제어 흐름 노드는 자신의 의미론(Sequence, Fallback, Parallel 등)에 따라 자식 노드에 선택적으로 tick을 전달하며, tick을 수신한 자식 노드만이 실행된다.

제어 흐름 노드자식 실행 시점
Sequence이전 자식이 Success를 반환한 후 다음 자식 실행
Fallback이전 자식이 Failure를 반환한 후 다음 자식 실행
Parallel모든 자식을 매 tick에서 실행
ReactiveSequence매 tick에서 첫 번째 자식부터 순차 실행

3. 노드 유형별 실행 시점

3.1 상태 보존 액션 노드

상태 보존 액션 노드의 실행은 현재 상태에 따라 두 가지 시점으로 구분된다.

현재 상태tick 수신 시호출 콜백실행 내용
Idle첫 번째 실행onStart초기화 및 행동 개시
Running후속 실행onRunning진행 확인 및 완료 판단

3.2 동기 액션 노드

동기 액션 노드는 매 tick 수신 시 tick() 함수가 호출된다. 이전 tick의 상태에 관계없이 매번 독립적으로 실행된다.

3.3 조건 노드

조건 노드는 매 tick 수신 시 조건을 즉각적으로 평가한다. 반응형 노드의 자식으로 배치된 경우 매 tick마다 재실행된다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

4. 실행과 Tick의 관계

노드의 실행은 tick의 수신에 의해 구동된다. tick을 수신하지 않은 노드는 실행되지 않으며, 이전에 Running 상태였더라도 tick을 수신하기 전까지 상태가 변하지 않는다.

// 단일 tick 내의 실행 순서
Root.tick()
 └→ ControlNode.tick()
      ├→ Child[0].tick()    // 실행 시점: tick 전파 순서에 의해 결정
      └→ Child[1].tick()    // Child[0]의 결과에 따라 실행 여부 결정

5. 실행의 빈도

노드의 실행 빈도는 행동 트리의 tick 주기와 제어 흐름 노드의 동작에 의해 결정된다.

배치 위치실행 빈도
ReactiveSequence의 첫 번째 자식매 tick마다
Sequence의 Running 자식매 tick마다
Sequence의 완료된 자식재실행 없음 (해당 Sequence 완료까지)
Fallback의 미도달 자식선행 자식 실패 전까지 미실행

6. 지연 실행과 즉시 실행

노드의 실행이 tick 수신 즉시 이루어지는지, 또는 지연되는지는 노드의 유형에 따라 다르다.

  • 즉시 실행: 대부분의 노드는 tick 수신 즉시 콜백이 호출된다
  • 지연 실행: Delay 데코레이터의 자식은 지연 시간 경과 후에야 tick이 전달된다

7. 로봇 공학에서의 의의

노드 실행 시점의 정확한 이해는 로봇의 행동이 언제 시작되고 언제 진행되는지를 예측하는 데 필수적이다. 안전 조건 검사가 매 tick마다 실행되는지, 특정 행동이 선행 조건 충족 후에만 실행되는지 등의 실행 시점은 로봇의 안전성과 기능적 정확성에 직접적인 영향을 미친다 (Faconti, 2024).


참고 문헌

  • Colledanchise, M. & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Faconti, D. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/