Timeout의 활용 사례 (Use Cases of the Timeout Decorator)

1. 개요

Timeout 데코레이터는 행동의 실행 시간을 보장하고, 교착 상태나 무한 실행을 방지하는 핵심 안전 메커니즘이다. 본 절에서는 로봇 공학에서의 구체적인 Timeout 활용 사례를 다룬다.

2. 사례 1: 내비게이션 시간 제한

<Fallback>
    <Timeout msec="60000">
        <Action ID="NavigateToGoal"/>
    </Timeout>
    <Sequence>
        <Action ID="ClearCostmap"/>
        <Timeout msec="90000">
            <Action ID="NavigateToGoal"/>
        </Timeout>
    </Sequence>
    <Action ID="ReportNavigationFailure"/>
</Fallback>

1차 내비게이션 60초 시도 → 실패 시 코스트맵 초기화 후 90초 재시도 → 최종 실패 보고.

3. 사례 2: 서비스 호출 타임아웃

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

경로 계획 서비스가 5초 이내에 응답하지 않으면 FAILURE를 반환한다.

4. 사례 3: 센서 데이터 획득 시간 제한

<Timeout msec="10000">
    <Action ID="WaitForGpsFix"/>
</Timeout>

GPS 신호 획득을 10초로 제한한다.

5. 사례 4: 재시도와 결합한 전체 시간 제한

<Timeout msec="120000">
    <RetryNode num_attempts="10">
        <Action ID="DownloadMapData"/>
    </RetryNode>
</Timeout>

2분 이내에 지도 데이터 다운로드를 최대 10회 재시도한다.

6. 사례 5: 드론 이륙 시간 제한

<Timeout msec="30000">
    <Sequence>
        <Action ID="ArmMotors"/>
        <Action ID="Takeoff"/>
        <Condition ID="IsAltitudeAbove" min_altitude="2.0"/>
    </Sequence>
</Timeout>

무장 → 이륙 → 고도 확인까지 30초 이내에 완료되어야 한다.

7. 사례 6: 파지 작업 시간 제한

<Timeout msec="45000">
    <Sequence>
        <Action ID="MoveToGraspPose"/>
        <Action ID="CloseGripper"/>
        <Condition ID="IsObjectGrasped"/>
        <Action ID="LiftObject"/>
    </Sequence>
</Timeout>

파지 전체 과정에 45초의 시간 제한을 부여한다.

8. 사례 7: 서브트리 전체 시간 제한

<Timeout msec="600000">
    <SubTree ID="PatrolMission"/>
</Timeout>

순찰 임무 전체에 10분의 시간 제한을 부여한다.

9. 사례 8: 선택적 행동의 시간 제한

<Sequence>
    <Action ID="MainTask"/>
    <ForceSuccess>
        <Timeout msec="5000">
            <Action ID="OptionalDataSync"/>
        </Timeout>
    </ForceSuccess>
    <Action ID="NextTask"/>
</Sequence>

선택적 데이터 동기화에 5초를 허용하고, 타임아웃이 되어도 다음 작업으로 진행한다.

10. Timeout과 Nav2의 통합

Nav2의 행동 트리에서 Timeout은 복구 전략의 핵심 요소로 활용된다.

<!-- Nav2의 전형적 구조 (간략화) -->
<Timeout msec="600000">
    <Fallback>
        <Sequence>
            <Action ID="ComputePathToPose"/>
            <Timeout msec="300000">
                <Action ID="FollowPath"/>
            </Timeout>
        </Sequence>
        <Sequence>
            <Action ID="ClearCostmaps"/>
            <Action ID="ComputePathToPose"/>
            <Timeout msec="300000">
                <Action ID="FollowPath"/>
            </Timeout>
        </Sequence>
    </Fallback>
</Timeout>

11. 설계 시 고려 사항

11.1 적절한 타임아웃 값

타임아웃 값은 행동의 정상적 실행 시간보다 충분히 크되, 교착 상태를 빠르게 감지할 수 있을 정도로 작아야 한다. 일반적으로 예상 실행 시간의 2~3배를 설정한다.

11.2 모든 비동기 행동에 Timeout 적용

모든 비동기 액션 노드에 Timeout을 적용하는 것이 안전한 설계 관행이다. Timeout이 없는 비동기 행동은 잠재적으로 무한 실행의 위험을 가진다.

12. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Macenski, S., et al. (2020). “The Marathon 2: A Navigation System.” arXiv preprint arXiv:2003.00368.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

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