1292.79 노드 정리의 시점
1. 노드 정리의 정의
노드 정리(cleanup)란 행동 트리의 노드가 실행을 종료하고 Idle 상태로 복귀할 때, 실행 과정에서 할당된 자원과 누적된 내부 상태를 해제하는 과정이다. 정리는 노드의 생명주기에서 마지막 단계에 해당하며, 자원 누수와 상태 오염을 방지하는 데 필수적이다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 정리가 발생하는 시점
노드 정리는 다음의 두 가지 경로를 통해 발생한다.
2.1 정상 완료에 의한 정리
노드가 Success 또는 Failure를 반환하여 정상적으로 완료되면, 노드는 Idle 상태로 복귀한다. 이 시점에서 노드의 내부 상태가 정리된다.
| 상태 전이 | 정리 시점 | 정리 방법 |
|---|---|---|
| Running → Success | onRunning에서 Success 반환 시 | 반환 전 명시적 정리 또는 자동 정리 |
| Running → Failure | onRunning에서 Failure 반환 시 | 반환 전 명시적 정리 또는 자동 정리 |
| Idle → Success | onStart에서 즉시 Success 반환 시 | 정리 불필요 (자원 미할당) |
| Idle → Failure | onStart에서 즉시 Failure 반환 시 | onStart에서 할당한 자원만 정리 |
2.2 Halt에 의한 정리
노드가 Running 상태에서 halt 요청을 수신하면, onHalted 콜백에서 자원 정리가 수행된다. halt에 의한 정리는 강제 중단 상황이므로, 정상 완료 시보다 더 포괄적인 정리가 필요할 수 있다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
3. 정리 대상
노드 정리에서 해제하여야 하는 자원과 상태는 다음과 같다.
| 정리 대상 | 설명 | 예시 |
|---|---|---|
| 외부 요청 핸들 | 외부 시스템에 대한 미완료 요청 | 액션 서버 목표 핸들 |
| 통신 자원 | 임시 통신 채널 | 서비스 클라이언트, 구독자 |
| 하드웨어 인터페이스 | 하드웨어 제어 상태 | 모터 정지, 그리퍼 상태 |
| 내부 변수 | 누적된 실행 상태 | 카운터, 타이머, 중간 결과 |
| 할당된 메모리 | 동적 할당된 버퍼 | 센서 데이터 버퍼 |
4. 정상 완료 시의 정리 패턴
정상 완료 시의 정리는 onRunning에서 최종 반환 상태를 결정한 후, 반환 전에 수행하거나, 상태 복귀 시 자동으로 수행된다.
class MyAction : StatefulActionNode {
onRunning():
if action_completed():
release_resources() // 명시적 정리
return Success
return Running
}
5. Halt 시의 정리 패턴
halt에 의한 정리는 onHalted 콜백에서 수행된다.
class MyAction : StatefulActionNode {
onHalted():
cancel_external_request() // 외부 요청 취소
release_resources() // 자원 해제
reset_internal_state() // 내부 상태 초기화
}
6. 정리의 완전성 보장
자원 누수를 방지하기 위해, onStart에서 할당된 모든 자원은 정상 완료 경로와 halt 경로 모두에서 해제되어야 한다. 두 경로에서의 정리 로직이 일관되어야 하며, 어느 경로로 종료되더라도 자원이 완전히 해제됨을 보장하여야 한다.
| 할당 시점 | 정상 완료 시 해제 | Halt 시 해제 |
|---|---|---|
| onStart | onRunning의 최종 반환 전 | onHalted |
7. 제어 흐름 노드의 정리
제어 흐름 노드의 정리는 내부 인덱스와 상태 변수의 초기화에 해당한다. Sequence 노드의 현재 자식 인덱스, Parallel 노드의 완료 카운터, Repeat 데코레이터의 반복 카운터 등이 정리 대상이다. 제어 흐름 노드가 halt되면, Running 상태의 자식에 halt를 전파한 후 자신의 내부 상태를 초기화한다 (Faconti, 2024).
8. 로봇 공학에서의 의의
노드 정리의 올바른 수행은 로봇 시스템의 안정적 운영에 필수적이다. 자원 누수는 장시간 운영되는 로봇 시스템에서 점진적 성능 저하를 유발하며, 미완료 외부 요청은 외부 시스템의 상태 불일치를 초래한다. 정리 시점이 명확히 정의되고 올바르게 구현되면, 행동 트리의 반복적 실행에서도 시스템의 일관된 상태가 유지된다 (Colledanchise & Ögren, 2018).
참고 문헌
- Colledanchise, M. & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/