타임아웃이 있는 내비게이션 행동 (Timeout+Navigate)

타임아웃이 있는 내비게이션 행동 (Timeout+Navigate)

1. 개요

타임아웃이 있는 내비게이션 행동은 Timeout 데코레이터와 내비게이션 액션 노드를 결합하여, 경로 추종에 시간 제한을 부여하는 로봇공학 적용 패턴이다. 이 패턴은 내비게이션이 장애물, 경로 오류, 제어기 문제 등으로 인해 무한히 지속되는 것을 방지하며, Nav2의 기본 행동 트리에서도 핵심적으로 활용된다.

2. 기본 구조

<Timeout msec="60000">
    <Action ID="NavigateToPose"
            goal="{target_pose}"/>
</Timeout>

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

3. 타임아웃과 복구 전략의 결합

3.1 단계적 복구

<Fallback>
    <Timeout msec="30000">
        <Action ID="NavigateToPose" goal="{target}"/>
    </Timeout>
    <Sequence>
        <Action ID="ClearLocalCostmap"/>
        <Timeout msec="45000">
            <Action ID="NavigateToPose" goal="{target}"/>
        </Timeout>
    </Sequence>
    <Sequence>
        <Action ID="Spin" angle="1.57"/>
        <Timeout msec="60000">
            <Action ID="NavigateToPose" goal="{target}"/>
        </Timeout>
    </Sequence>
    <Action ID="NavigationAborted"/>
</Fallback>

1차 30초 시도 → 코스트맵 초기화 후 45초 재시도 → 회전 복구 후 60초 재시도 → 최종 포기.

4. 동적 타임아웃 설정

목표까지의 거리에 비례하는 타임아웃을 설정한다.

<Timeout msec="{navigation_timeout_ms}">
    <Action ID="NavigateToPose" goal="{target}"/>
</Timeout>

타임아웃 계산: T = \max(d / v_{\min} \times k, T_{\min})

여기서 d는 목표 거리, v_{\min}은 최소 예상 속도, k는 안전 계수, T_{\min}은 최소 타임아웃이다.

5. Nav2에서의 활용

Nav2의 기본 행동 트리는 내비게이션 전체에 Timeout을 적용한다.

<!-- Nav2 기본 구조 (간략화) -->
<PipelineSequence>
    <RateController hz="1.0">
        <Action ID="ComputePathToPose"/>
    </RateController>
    <Timeout msec="300000">
        <Action ID="FollowPath"/>
    </Timeout>
</PipelineSequence>

6. 설계 시 고려 사항

6.1 halt 시의 로봇 정지

Timeout에 의해 NavigateToPose가 halt되면, 내비게이션 액션의 halt() 메서드에서 로봇에 정지 명령을 전송하여야 한다. halt 후 로봇이 계속 이동하는 것은 안전 위험이다.

6.2 타임아웃 값의 합리적 설정

과도하게 짧은 타임아웃은 정상적인 내비게이션도 중단시키고, 과도하게 긴 타임아웃은 교착 상태 감지를 지연시킨다. 예상 이동 시간의 2~3배를 기준으로 설정한다.

7. 참고 문헌

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