Timeout의 시간 초과 시 Failure 반환 (Timeout's Failure Return on Time Expiration)

Timeout의 시간 초과 시 Failure 반환 (Timeout’s Failure Return on Time Expiration)

1. 개요

Timeout 데코레이터가 시간 초과를 감지하면 자식을 halt한 후 FAILURE를 반환한다. 이 FAILURE 반환은 “자식 행동이 지정된 시간 내에 완료되지 못하였다“는 의미를 가지며, 상위 제어 구조에서 타임아웃에 대한 대응(복구, 대체 행동, 오류 보고)을 유발한다.

2. FAILURE 반환의 의미론

2.1 타임아웃 FAILURE vs 자식 FAILURE

타임아웃에 의한 FAILURE는 자식 행동 자체의 논리적 실패와 구분된다.

실패 원인의미반환 경로
자식의 FAILURE행동이 논리적으로 실패자식 → Timeout → 부모
타임아웃 FAILURE행동이 시간 내 미완료Timeout 자체 → 부모

두 경우 모두 Timeout은 FAILURE를 반환하므로, 부모 노드의 관점에서는 구분할 수 없다. 실패 원인을 구분하여야 하는 경우, 블랙보드에 타임아웃 발생 여부를 기록하는 사용자 정의 Timeout을 구현할 수 있다.

3. 상위 제어 구조에서의 처리

3.1 Fallback에 의한 대체 행동

<Fallback>
    <Timeout msec="30000">
        <Action ID="NavigateOptimalPath"/>
    </Timeout>
    <Timeout msec="60000">
        <Action ID="NavigateAlternativePath"/>
    </Timeout>
    <Action ID="RequestRemoteAssistance"/>
</Fallback>

최적 경로 30초 타임아웃 → 대안 경로 60초 타임아웃 → 원격 지원 요청.

3.2 Sequence에서의 중단

<Sequence>
    <Timeout msec="10000">
        <Action ID="AcquireSensorData"/>
    </Timeout>
    <Action ID="ProcessData"/>
</Sequence>

센서 데이터 획득이 10초 이내에 완료되지 않으면 Sequence 전체가 FAILURE를 반환하고 ProcessData는 실행되지 않는다.

3.3 ForceSuccess를 통한 타임아웃 무시

타임아웃 발생을 무시하고 후속 행동을 계속하려는 경우에 사용한다.

<Sequence>
    <ForceSuccess>
        <Timeout msec="5000">
            <Action ID="OptionalDataUpload"/>
        </Timeout>
    </ForceSuccess>
    <Action ID="ContinueMission"/>
</Sequence>

선택적 데이터 업로드가 5초 이내에 완료되지 않으면 타임아웃이 발생하나, ForceSuccess에 의해 임무가 계속된다.

4. FAILURE가 아닌 다른 반환이 고려되지 않는 이유

타임아웃 시 SUCCESS를 반환하는 것은 “시간 초과되었으나 성공“이라는 모순적 의미를 가지므로 적절하지 않다. RUNNING을 반환하는 것은 자식이 이미 halt된 후이므로 논리적으로 일관되지 않는다. 따라서 FAILURE가 타임아웃의 유일한 합리적 반환 상태이다.

5. 타임아웃 FAILURE의 로깅

타임아웃 발생은 중요한 이벤트이므로 로깅하여 사후 분석에 활용한다.

if (elapsed >= timeout_duration_)
{
    RCLCPP_WARN(node_->get_logger(),
        "[%s] Timeout expired after %.1fs, halting child '%s'",
        name().c_str(),
        std::chrono::duration<double>(elapsed).count(),
        child()->name().c_str());

    haltChild();
    return BT::NodeStatus::FAILURE;
}

6. 설계 시 고려 사항

6.1 빈번한 타임아웃의 진단

특정 행동에서 타임아웃이 빈번히 발생하면, 타임아웃 설정이 너무 짧거나 행동 자체에 성능 문제가 있음을 나타낸다. 타임아웃 발생 빈도를 모니터링하여 적절한 조정을 수행하여야 한다.

6.2 안전 행동에서의 타임아웃

안전에 중요한 행동(비상 정지, 안전 제동)에 타임아웃을 적용하면, 안전 행동이 완료되기 전에 중단될 수 있다. 안전 행동에는 타임아웃을 적용하지 않거나, 충분히 긴 타임아웃을 설정하여야 한다.

7. 참고 문헌

  • 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초안 작성