1293.1 Tick의 개념과 정의
1. Tick의 정의
행동 트리(Behavior Tree)에서 tick이란, 루트 노드로부터 생성되어 트리 전체를 순회하며 각 노드의 실행을 촉발하는 단일 실행 신호이다. 하나의 tick은 행동 트리의 한 번의 완전한 평가 주기(evaluation cycle)를 구성하며, 루트 노드에서 시작하여 트리의 노드들을 깊이 우선(depth-first), 왼쪽에서 오른쪽(left-to-right) 순서로 방문한다. 각 노드는 tick을 수신하면 자신의 tick() 함수를 실행하고, 그 결과로 Success, Failure, Running 중 하나의 상태(status)를 반환한다 (Colledanchise & Ögren, 2018).
tick은 행동 트리에서 시간의 최소 이산 단위이다. 모든 노드의 상태 전이(state transition)와 행동 실행(action execution)은 오직 tick의 경계에서만 발생하며, tick 없이는 어떠한 노드도 자율적으로 실행되지 않는다.
2. 용어의 어원
tick이라는 용어는 시계의 째깍거림(ticking)에서 유래하였다. 시계가 일정 간격으로 째깍거리며 시간을 한 단위씩 전진시키듯이, 행동 트리의 tick은 트리의 실행 상태를 한 단계씩 갱신한다. 이 비유는 tick의 두 가지 본질적 특성을 반영한다. 첫째, tick은 주기적(periodic)이다. 둘째, tick은 이산적(discrete)이다. 게임 엔진 분야에서 시뮬레이션 루프의 한 번의 갱신 주기를 tick이라 지칭하던 관행이 행동 트리 문헌으로 계승되었다 (Millington & Funge, 2009).
3. 형식적 정의
행동 트리 T가 노드 집합 N = \{n_1, n_2, \dots, n_k\}와 루트 노드 r \in N으로 구성될 때, tick은 다음과 같이 형식적으로 정의된다.
\text{tick}(T) : \Sigma \rightarrow \Sigma \times S
여기서 \Sigma는 트리의 내부 상태 공간, S = \{\text{Success}, \text{Failure}, \text{Running}\}은 반환 상태 집합이다. tick 함수는 트리의 현재 내부 상태 \sigma \in \Sigma를 입력으로 받아, 갱신된 내부 상태 \sigma'와 루트 노드의 반환 상태 s \in S를 출력한다.
이를 의사코드로 표현하면 다음과 같다.
function tick(tree) → status:
return tree.root.tick()
루트 노드의 tick() 함수는 내부적으로 자식 노드의 tick()을 재귀적으로 호출하며, 이 재귀 호출 구조가 트리 전체의 깊이 우선 순회를 구현한다. 각 비단말 노드(non-leaf node)는 자신의 유형에 정의된 규칙에 따라 자식 노드에 tick을 선택적으로 전파하고, 자식의 반환 상태를 종합하여 자신의 반환 상태를 결정한다 (Colledanchise & Ögren, 2018).
노드 유형별 Tick 수신 동작
각 노드는 tick을 수신하면 자신의 유형(type)에 따라 상이한 동작을 수행한다.
| 노드 유형 | tick 수신 시 동작 |
|---|---|
| 제어 흐름 노드(Control Flow Node) | 자식 노드에 tick을 전파하고, 자식의 반환 상태에 기반하여 자신의 반환 상태를 결정한다 |
| 데코레이터 노드(Decorator Node) | 단일 자식에 tick을 전달하고, 자식의 반환 상태를 자신의 정책에 따라 변환하여 반환한다 |
| 액션 노드(Action Node) | 물리적 또는 계산적 행동을 수행하고, 행동의 결과에 따라 Success, Failure, 또는 Running을 반환한다 |
| 조건 노드(Condition Node) | 환경 또는 내부 변수의 상태를 즉시 평가하고, Success 또는 Failure를 반환한다 |
제어 흐름 노드의 경우, 모든 자식에 무조건 tick을 전파하는 것이 아니라, 자신의 제어 규칙에 따라 조건부로 전파한다. 예를 들어, Sequence 노드는 자식이 Failure를 반환하면 후속 자식에 tick을 전파하지 않고 즉시 Failure를 반환한다.
단일 Tick의 실행 주기
하나의 tick 내에서 발생하는 전체 실행 과정은 다음과 같은 구조를 따른다.
[tick 시작]
Root.tick()
└→ ControlFlow.tick()
├→ Child_1.tick() → status_1
├→ Child_2.tick() → status_2 (조건부 전파)
└→ Child_N.tick() → status_N (조건부 전파)
← 자식 상태 종합 → 최종 status 결정
← status
[tick 종료]
tick의 시작부터 종료까지의 과정은 원자적(atomic)으로 수행된다. 즉, 하나의 tick이 완료되기 전에 다음 tick이 시작되지 않는다. 또한, tick 내부에서의 노드 방문 순서는 트리의 구조에 의해 결정론적(deterministic)으로 결정되므로, 동일한 트리 상태와 환경 상태가 주어지면 동일한 실행 경로와 결과가 보장된다 (Faconti, 2024).
Tick과 시간의 관계
행동 트리에서 tick은 이산적 시간 단위의 역할을 수행한다. 연속적인 물리적 시간(wall-clock time)은 tick의 주기(tick period)에 의해 이산화되며, 행동 트리의 관점에서 모든 시간 관련 개념은 tick 횟수로 표현된다.
| 개념 | 물리적 시간 | 행동 트리 시간 |
|---|---|---|
| 시간 단위 | 초(second) | tick 횟수 |
| 시간 진행 | 연속적(continuous) | 이산적(discrete) |
| 상태 변화 시점 | 임의의 시점 | tick 경계 |
| 측정 정밀도 | 이론적으로 무한 | tick 주기에 의존 |
이러한 이산화는 행동 트리의 분석 가능성(analyzability)을 높인다. 상태 변화가 tick 경계에서만 발생하므로, 시스템의 동작을 tick 단위로 추적하고 재현할 수 있다. 그러나 tick 주기보다 빠른 환경 변화는 다음 tick까지 감지되지 않으므로, tick 주기의 설정이 시스템의 반응성(responsiveness)을 결정짓는 핵심 설계 요소가 된다.
Tick의 역할
tick은 행동 트리에서 다음과 같은 핵심적 역할을 수행한다.
- 실행 촉발(Execution Triggering): 노드의 실행은 오직 tick 수신에 의해서만 촉발된다. 어떠한 노드도 tick 없이 스스로 실행을 개시하지 않는다.
- 상태 갱신(State Update): 노드의 반환 상태는 tick 수신 시에만 갱신된다. tick 사이의 기간 동안 노드의 외부 관측 가능 상태는 변하지 않는다.
- 환경 감지(Environment Sensing): 조건 노드가 환경 상태를 감지하는 시점은 tick 수신 시이다. 이를 통해 행동 트리는 주기적으로 환경 변화에 반응한다.
- 주기적 재평가(Periodic Re-evaluation): 반응형(reactive) 제어 노드는 매 tick마다 조건 자식을 재평가하여, 환경 변화에 즉각 대응할 수 있게 한다.
- 비동기 진행 확인(Asynchronous Progress Polling): Running 상태를 반환한 비동기 액션 노드는 후속 tick에서 진행 상태를 확인받으며, 완료 시 Success 또는 Failure로 전이한다.
로봇공학에서의 의의
tick 메커니즘은 로봇의 행동 트리 기반 제어 루프(control loop)의 핵심 구동 원리이다. 로봇 시스템에서 센서 데이터의 갱신, 행동 결정(decision-making), 액추에이터 명령의 발행은 모두 tick 주기에 동기화되어 수행된다. tick의 주기적 실행은 로봇이 환경 변화에 지속적으로 반응할 수 있게 보장하며, tick의 결정론적 순회 순서는 동일 조건하에서 동일한 행동이 재현 가능함을 보장한다.
특히 ROS2(Robot Operating System 2) 환경에서 tick은 ROS2의 실행기(executor)와 타이머(timer) 메커니즘과 통합되어 구현된다. ROS2 타이머가 설정된 주기마다 tick 함수를 호출함으로써, 행동 트리의 실행이 ROS2의 이벤트 루프와 자연스럽게 결합된다 (Macenski et al., 2020).
참고 문헌
- 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/
- Macenski, S., Martín, F., White, R., & Clavero, J. G. (2020). The Marathon 2: A Navigation System. Proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS).
- Millington, I. & Funge, J. (2009). Artificial Intelligence for Games (2nd ed.). Morgan Kaufmann.