1293.11 Tick 주기 (Tick Rate)의 정의

1. Tick 주기의 기본 개념

Tick 주기(Tick Rate)란 행동 트리(Behavior Tree)의 루트 노드가 Tick을 생성하는 빈도를 정량적으로 나타내는 매개변수이다. Tick 주기는 단위 시간당 Tick의 발생 횟수, 즉 주파수(frequency)로 표현되거나, 연속된 두 Tick 사이의 시간 간격, 즉 주기(period)로 표현된다. 두 표현 간의 관계는 다음과 같다.

f_{tick} = \frac{1}{T_{tick}}

여기서 f_{tick}은 Tick 주파수(Hz), T_{tick}은 Tick 주기(초)를 나타낸다. 예를 들어, Tick 주기가 100ms인 행동 트리는 10Hz의 Tick 주파수를 가지며, 초당 10회의 Tick이 발생하여 트리 전체가 10회 평가된다.

2. Tick 주기와 샘플링 이론의 관계

Tick 주기는 이산 시간 시스템(discrete-time system)의 샘플링 주기(sampling period)와 유사한 역할을 수행한다. 행동 트리는 연속적으로 변화하는 환경 상태를 이산적인 시점에서 관찰하고 의사 결정을 수행하므로, Tick 주기는 환경 변화에 대한 행동 트리의 시간 분해능(temporal resolution)을 결정한다(Colledanchise & Ogren, 2018).

Nyquist-Shannon 샘플링 정리에 의하면, 신호를 왜곡 없이 복원하기 위해서는 신호 최대 주파수의 2배 이상의 샘플링 주파수가 필요하다. 이를 행동 트리의 맥락에 적용하면, 환경에서 발생하는 사건의 최대 변화율에 비해 Tick 주파수가 충분히 높아야 해당 사건을 누락 없이 감지할 수 있다. Tick 주파수가 환경 변화율에 비해 낮으면, 조건 노드가 중요한 상태 변화를 감지하지 못하는 에일리어싱(aliasing) 현상이 발생할 수 있다.

3. Tick 주기의 형식적 정의

Tick 주기는 행동 트리의 실행 의미론(execution semantics)에서 다음과 같이 형식적으로 정의된다.

행동 트리 \mathcal{T}에 대해, Tick 순서열 \{t_0, t_1, t_2, \ldots\}가 존재하며, 각 t_kk번째 Tick이 루트 노드에서 발생하는 시각을 나타낸다. 등간격(equidistant) Tick 모델에서는 다음이 성립한다.

t_{k+1} - t_k = T_{tick}, \quad \forall k \geq 0

이 등간격 조건이 충족되는 경우를 고정 Tick 주기(fixed tick rate)라 하며, 이는 행동 트리의 가장 기본적인 실행 모델이다. 반면, t_{k+1} - t_kk에 따라 가변적인 경우를 가변 Tick 주기(variable tick rate)라 하며, 이는 시스템 부하나 이벤트 발생에 따라 Tick 간격이 동적으로 조정되는 모델이다.

4. Tick 주기와 제어 루프의 관계

로봇공학에서 Tick 주기는 제어 루프(control loop)의 실행 주기와 밀접한 관련을 가진다. 전통적인 로봇 소프트웨어 아키텍처에서 제어 루프는 센서 데이터 수집, 상태 추정, 계획 수립, 명령 전달의 과정을 일정한 주기로 반복한다. 행동 트리의 Tick은 이 제어 루프의 의사 결정 단계에 해당하며, Tick 주기는 의사 결정의 갱신 빈도를 결정한다.

일반적으로 행동 트리의 Tick 주기는 하위 제어 루프(low-level control loop)의 주기보다 길거나 같다. 하위 제어 루프가 수백 Hz 이상의 고주파로 동작하는 반면, 행동 트리는 수 Hz에서 수십 Hz 범위의 주파수로 동작하는 것이 일반적이다. 이는 행동 트리가 고수준 의사 결정(high-level decision-making)을 담당하므로, 하위 제어기만큼 빠른 갱신이 필요하지 않기 때문이다.

5. Tick 주기와 계산 비용의 관계

Tick 주기를 결정할 때 고려해야 하는 핵심 제약 조건은 단일 Tick의 실행 시간(execution time)이다. 단일 Tick의 실행 시간을 T_{exec}라 하면, Tick 주기 T_{tick}은 반드시 다음 조건을 만족해야 한다.

T_{exec} \leq T_{tick}

이 조건이 위반되면, 이전 Tick의 실행이 완료되기 전에 다음 Tick이 발생하는 Tick 오버런(tick overrun)이 발생한다. Tick 오버런은 행동 트리의 시간적 일관성(temporal consistency)을 훼손하며, 노드 상태의 경합 조건(race condition)이나 예측 불가능한 동작을 초래할 수 있다.

따라서 Tick 주기는 최악의 경우(worst-case) Tick 실행 시간을 고려하여 설정해야 하며, 충분한 여유 시간(slack time)을 확보하여 일시적인 실행 시간 증가에도 오버런이 발생하지 않도록 해야 한다.

T_{tick} \geq T_{exec,worst} + T_{slack}

6. Tick 주기의 단위와 표기

Tick 주기는 다음 두 가지 방식으로 표기된다.

표기 방식단위예시의미
주파수 (Tick Rate)Hz10 Hz초당 10회 Tick 발생
주기 (Tick Period)ms, s100 ms연속 Tick 간 100ms 간격

실무에서는 주파수 표기가 시스템의 반응 속도를 직관적으로 전달하는 데 유리하고, 주기 표기가 타이머 설정이나 시간 예산 계산에 유리하므로, 문맥에 따라 적절한 표기를 선택한다.

7. Tick 주기와 BehaviorTree.CPP에서의 구현

BehaviorTree.CPP 프레임워크에서 Tick 주기는 행동 트리 자체에 내장된 속성이 아니라, 트리를 호출하는 외부 루프에 의해 결정된다. 가장 기본적인 구현 방식은 루프 내에서 tree.tickOnce()를 호출하고, 호출 간에 일정한 시간 간격을 두는 것이다(Faconti, 2022).

auto period = std::chrono::milliseconds(100);  // T_tick = 100ms
while (running) {
    auto start = std::chrono::steady_clock::now();
    tree.tickOnce();
    auto elapsed = std::chrono::steady_clock::now() - start;
    if (elapsed < period) {
        std::this_thread::sleep_for(period - elapsed);
    }
}

위 구현에서 period 변수가 Tick 주기를 정의하며, sleep_for를 통해 Tick 간격을 조절한다. 그러나 sleep_for의 정밀도는 운영체제의 스케줄링 해상도에 의존하므로, 실시간 시스템에서는 보다 정밀한 타이밍 메커니즘이 필요하다.

8. ROS2 환경에서의 Tick 주기

ROS2 환경에서 행동 트리의 Tick 주기는 ROS2 타이머(Timer)를 통해 관리되는 것이 일반적이다. ROS2 타이머는 지정된 주기마다 콜백 함수를 호출하며, 이 콜백 내에서 행동 트리의 Tick을 실행한다.

auto timer = node->create_wall_timer(
    std::chrono::milliseconds(100),
    [&tree]() { tree.tickOnce(); }
);

ROS2 타이머를 사용하면 Tick 주기가 ROS2 실행기(executor)의 스케줄링에 통합되어, ROS2의 다른 콜백(토픽 구독, 서비스 응답 등)과 자연스럽게 인터리빙(interleaving)된다. 다만, ROS2 실행기의 특성에 따라 타이머 콜백의 실행이 지연될 수 있으므로, 설정된 Tick 주기가 정확히 보장되지 않을 수 있다는 점을 고려해야 한다.

9. 표준적 Tick 주기 범위

로봇공학 응용 분야에서 행동 트리의 Tick 주기는 일반적으로 다음 범위에서 설정된다.

응용 분야일반적 Tick 주파수근거
자율 주행 차량10-50 Hz동적 환경에서의 빠른 의사 결정 요구
서비스 로봇5-20 Hz실내 환경의 상대적으로 느린 변화율
산업용 로봇 팔10-100 Hz정밀 작업에서의 빠른 상태 전이 요구
무인 항공기20-50 Hz비행 역학의 빠른 동적 특성
원격 조종 로봇1-10 Hz통신 지연을 고려한 보수적 설계

위 수치는 일반적인 가이드라인이며, 실제 Tick 주기는 구체적인 시스템 요구 사항, 행동 트리의 복잡도, 가용 계산 자원 등을 종합적으로 고려하여 결정해야 한다.


참고 문헌

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