Timeout의 시간 제한 설정 (Timeout’s Time Limit Configuration)
1. 개요
Timeout 데코레이터의 시간 제한 설정은 msec 매개변수를 통해 자식 노드에 허용할 최대 실행 시간을 밀리초(ms) 단위로 지정하는 것이다. 이 설정은 행동의 응답성 요구, 시스템 자원 관리, 안전 요구 등을 고려하여 결정되며, 행동 트리의 전체적인 시간 예측 가능성을 보장하는 핵심 매개변수이다.
2. msec 매개변수
2.1 기본 설정
<Timeout msec="30000">
<Action ID="NavigateToGoal"/>
</Timeout>
msec="30000"은 30초(30,000 밀리초)의 타임아웃을 설정한다.
2.2 블랙보드를 통한 동적 설정
<Timeout msec="{nav_timeout_ms}">
<Action ID="NavigateToGoal"/>
</Timeout>
블랙보드의 nav_timeout_ms 값에 따라 타임아웃 시간이 동적으로 결정된다. 임무 거리, 환경 복잡도, 배터리 잔량 등에 따라 타임아웃을 조정할 수 있다.
3. 타임아웃 시간 설정 기준
3.1 행동별 권장 타임아웃
| 행동 유형 | 권장 타임아웃 | 근거 |
|---|---|---|
| 센서 초기화 | 5~15초 | 드라이버 로딩 시간 |
| 서비스 호출 | 1~5초 | 네트워크 응답 시간 |
| 경로 계획 | 5~30초 | 계획 복잡도 |
| 근거리 내비게이션 (< 10m) | 30~60초 | 이동 시간 + 여유 |
| 장거리 내비게이션 (> 50m) | 120~600초 | 이동 시간 + 장애물 회피 |
| 파지/배치 작업 | 15~60초 | 작업 복잡도 |
| 도킹/충전 | 30~120초 | 정밀 위치 조정 |
3.2 타임아웃 계산 공식
동적 타임아웃 계산 시, 예상 실행 시간에 안전 여유를 포함한다.
T_{\text{timeout}} = T_{\text{expected}} \times k_{\text{safety}}
여기서 T_{\text{expected}}는 예상 실행 시간, k_{\text{safety}}는 안전 계수(일반적으로 1.5~3.0)이다.
내비게이션의 경우:
T_{\text{timeout}} = \frac{d}{v_{\text{min}}} \times k_{\text{safety}}
여기서 d는 목표까지의 거리, v_{\text{min}}는 최소 예상 속도이다.
4. 타임아웃의 단위 주의
BehaviorTree.CPP에서 Timeout의 msec 매개변수는 밀리초 단위이다.
| 원하는 시간 | msec 값 |
|---|---|
| 1초 | 1000 |
| 10초 | 10000 |
| 1분 | 60000 |
| 5분 | 300000 |
| 1시간 | 3600000 |
5. 매우 짧은 타임아웃의 주의
타임아웃을 행동 트리의 tick 주기보다 짧게 설정하면, 자식이 한 번도 tick되지 못하고 타임아웃이 발생할 수 있다. tick 주기가 100ms인 경우, 최소 타임아웃은 200ms 이상으로 설정하여야 한다.
6. 매우 긴 타임아웃의 주의
타임아웃이 과도하게 길면, 교착 상태나 무한 실행에 대한 보호 기능이 약화된다. 행동의 최대 합리적 실행 시간을 기준으로 설정하여야 한다.
7. 설계 시 고려 사항
7.1 시뮬레이션 환경에서의 타임아웃
시뮬레이션에서 시간이 실제보다 느리게 진행되는 경우(실시간 비율 < 1.0), 실제 시간 기반 타임아웃이 너무 빨리 만료될 수 있다. 시뮬레이션 시간에 맞춘 타임아웃 조정이 필요하다.
7.2 네트워크 지연 환경
원격 서비스 호출을 포함하는 행동에서는 네트워크 왕복 시간(RTT)을 타임아웃에 포함하여야 한다.
7.3 다중 Timeout의 중첩
중첩된 Timeout 중 외부 Timeout이 내부 Timeout보다 짧으면, 외부 Timeout이 먼저 만료되어 내부 행동이 중단된다. Timeout의 중첩 관계를 신중히 설계하여야 한다.
<!-- 외부 > 내부 (올바름) -->
<Timeout msec="60000">
<Timeout msec="30000">
<Action ID="Task"/>
</Timeout>
</Timeout>
<!-- 외부 < 내부 (내부 Timeout이 무의미) -->
<Timeout msec="10000">
<Timeout msec="60000">
<Action ID="Task"/>
</Timeout>
</Timeout>
8. 참고 문헌
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-04 | 초안 작성 |