Timeout 데코레이터의 동작 (Operation of the Timeout Decorator)

Timeout 데코레이터의 동작 (Operation of the Timeout Decorator)

1. 개요

Timeout 데코레이터는 자식 노드의 실행 시간에 상한을 부여하여, 지정된 시간 내에 자식이 완료되지 않으면 자식을 halt하고 FAILURE를 반환하는 시간 제어 데코레이터이다. 이 데코레이터는 무한 실행 방지, 응답성 보장, 교착 상태(deadlock) 감지 등에 활용되며, 로봇 시스템에서 모든 행동이 유한 시간 내에 완료되도록 보장하는 핵심 안전 메커니즘이다.

2. 동작 규칙

2.1 상태 전이 규칙

자식 반환시간 조건Timeout 결과추가 동작
SUCCESS시간 내SUCCESS타이머 리셋
FAILURE시간 내FAILURE타이머 리셋
RUNNING시간 내RUNNING타이머 계속
RUNNING시간 초과FAILURE자식 halt

2.2 수학적 표현

타이머 시작 시각을 t_0, 현재 시각을 t, 타임아웃 시간을 T라 하면:

f_{\text{Timeout}}(s, t) = \begin{cases} s & \text{if } s \in \{\text{SUCCESS}, \text{FAILURE}\} \\ \text{RUNNING} & \text{if } s = \text{RUNNING} \wedge (t - t_0) < T \\ \text{FAILURE} & \text{if } s = \text{RUNNING} \wedge (t - t_0) \geq T \end{cases}

타이머의 생명주기

시작

타이머는 Timeout 데코레이터가 처음 RUNNING 상태에 진입할 때 시작된다.

경과

자식이 RUNNING을 반환하는 동안 타이머가 진행된다.

리셋

다음 시점에서 타이머가 리셋된다.

시점조건
자식 완료자식이 SUCCESS 또는 FAILURE 반환
타임아웃 발생시간 초과 후 자식 halt
halt() 호출외부에서 Timeout이 halt됨

XML에서의 사용

<Timeout msec="30000">
    <Action ID="NavigateToGoal"/>
</Timeout>

내비게이션이 30초 이내에 완료되지 않으면 FAILURE를 반환하고 내비게이션을 halt한다.

시간 초과 시의 동작 상세

halt 호출

시간이 초과되면 Timeout은 자식의 halt() 메서드를 호출하여 자식의 실행을 중단시킨다.

BT::NodeStatus tick() override
{
    if (status() == BT::NodeStatus::IDLE)
    {
        start_time_ = std::chrono::steady_clock::now();
    }

    setStatus(BT::NodeStatus::RUNNING);

    auto elapsed = std::chrono::steady_clock::now() - start_time_;
    if (elapsed >= timeout_duration_)
    {
        haltChild();
        return BT::NodeStatus::FAILURE;
    }

    return child_node_->executeTick();
}

halt 후 상태 정리

자식이 halt된 후, 자식은 IDLE 상태로 전환되어야 한다. 자식의 halt() 구현에서 리소스 정리와 상태 초기화가 올바르게 수행되어야 한다.

활용 사례

내비게이션 시간 제한

<Fallback>
    <Timeout msec="60000">
        <Action ID="NavigateToGoal"/>
    </Timeout>
    <Action ID="NavigationTimeoutRecovery"/>
</Fallback>

서비스 호출 타임아웃

<Timeout msec="5000">
    <Action ID="CallPlannerService"/>
</Timeout>

Retry와의 결합

<Timeout msec="120000">
    <RetryNode num_attempts="5">
        <Action ID="DownloadMap"/>
    </RetryNode>
</Timeout>

전체 2분 이내에서 지도 다운로드를 최대 5회 재시도한다.

설계 시 고려 사항

msec 매개변수의 단위

BehaviorTree.CPP에서 Timeout의 시간 매개변수는 밀리초(ms) 단위이다. 초 단위로 혼동하지 않도록 주의한다.

시뮬레이션 시간과의 호환

BehaviorTree.CPP의 내장 Timeout은 std::chrono::steady_clock을 사용하므로, use_sim_time 설정과 독립적으로 실제 시간이 적용된다. 시뮬레이션 시간과의 호환이 필요한 경우 사용자 정의 Timeout을 구현하여야 한다.

타임아웃 후 행동 재개

Timeout에 의해 halt된 행동을 나중에 재개하려면, 자식이 halt 시점의 진행 상태를 블랙보드에 저장하고, 재개 시 이를 참조하여 중단 지점부터 계속하는 로직이 필요하다.

참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

버전날짜변경 사항
v0.12026-04-04초안 작성