타임아웃이 있는 내비게이션 행동 (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.1 | 2026-04-05 | 초안 작성 |