1292.72 노드의 생명주기
1. 노드 생명주기의 정의
노드의 생명주기(lifecycle)란, 행동 트리의 개별 노드가 생성되어 폐기될 때까지 거치는 상태 전이와 콜백 호출의 순서를 정의하는 모델이다. 생명주기 모델은 노드가 언제 초기화되고, 언제 실행되며, 언제 중단되고, 언제 정리되는지를 명확히 규정한다. 이 모델에 대한 이해는 노드의 올바른 구현과 자원 관리의 기반이 된다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 노드 상태와 생명주기의 관계
노드의 생명주기는 노드의 반환 상태(node status) 전이에 의해 구동된다.
| 상태 | 의미 | 생명주기 단계 |
|---|---|---|
| Idle | 비활성 상태 | 초기화 이전 또는 정리 이후 |
| Running | 실행 중 | 실행 단계 |
| Success | 성공 완료 | 완료 (Idle로 복귀) |
| Failure | 실패 완료 | 완료 (Idle로 복귀) |
노드는 Idle 상태에서 시작하여, tick을 수신하면 Running, Success, Failure 중 하나의 상태로 전이한다. Success 또는 Failure를 반환하면 노드는 Idle 상태로 복귀한다.
3. 생명주기 콜백
BehaviorTree.CPP 라이브러리에서 상태 보존 액션 노드(StatefulActionNode)는 세 가지 생명주기 콜백을 제공한다.
3.1 onStart
onStart 콜백은 노드가 Idle 상태에서 처음 tick을 수신할 때 호출된다. 이 콜백의 역할은 다음과 같다.
- 내부 상태의 초기화
- 외부 자원의 할당
- 행동의 시작 (명령 송신, 요청 발행)
- 블랙보드로부터 입력 데이터 읽기
onStart는 Success, Failure, Running 중 하나를 반환한다.
3.2 onRunning
onRunning 콜백은 노드가 Running 상태에서 후속 tick을 수신할 때 호출된다. 이 콜백의 역할은 다음과 같다.
- 행동의 진행 상태 확인
- 완료 여부 판단
- 중간 결과의 갱신
onRunning은 Success, Failure, Running 중 하나를 반환한다.
3.3 onHalted
onHalted 콜백은 노드가 Running 상태에서 halt 요청을 수신할 때 호출된다. 이 콜백의 역할은 다음과 같다.
- 진행 중인 행동의 중단
- 외부 시스템에 대한 취소 요청
- 할당된 자원의 해제
- 내부 상태의 정리
onHalted는 반환값이 없으며, 호출 후 노드는 Idle 상태로 복귀한다 (Faconti, 2024).
4. 생명주기 상태 전이 다이어그램
노드의 생명주기 상태 전이는 다음과 같이 표현된다.
[Idle] ──tick──→ onStart() ──→ Success/Failure → [Idle]
│
└──→ Running → [Running]
│
[Running] ──tick──→ onRunning() ──→ Success/Failure → [Idle]
│ │
│ └──→ Running → [Running]
│
[Running] ──halt──→ onHalted() ──→ [Idle]
5. 단일 Tick 내의 생명주기 처리
단일 tick 내에서 노드의 생명주기 처리 순서는 다음과 같다.
function StatefulActionNode.executeTick():
if current_status == Idle:
current_status = Running
new_status = onStart()
else if current_status == Running:
new_status = onRunning()
if new_status != Running:
current_status = Idle // Success/Failure 시 Idle로 복귀
else:
current_status = Running
return new_status
6. 동기 액션 노드와 조건 노드의 생명주기
동기 액션 노드(SyncActionNode)와 조건 노드(ConditionNode)는 Running 상태에 진입하지 않으므로, 단순화된 생명주기를 가진다.
[Idle] ──tick──→ tick() ──→ Success/Failure → [Idle]
이 노드 유형에서는 onStart, onRunning, onHalted의 구분이 필요하지 않으며, 단일 tick 함수만으로 전체 생명주기가 완결된다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
7. 생명주기와 자원 관리
생명주기 콜백은 자원의 할당과 해제의 올바른 시점을 보장한다.
| 자원 관리 | 시점 | 콜백 |
|---|---|---|
| 자원 할당 | 행동 시작 시 | onStart |
| 자원 사용 | 행동 진행 중 | onRunning |
| 정상 해제 | 행동 완료 시 | onStart/onRunning의 반환 후 |
| 비정상 해제 | 행동 중단 시 | onHalted |
자원 누수(resource leak)를 방지하기 위해, onStart에서 할당된 모든 자원은 행동 완료 시 또는 onHalted에서 반드시 해제되어야 한다.
8. 로봇 공학에서의 의의
노드의 생명주기 모델은 로봇의 물리적 행동이 시작, 진행, 완료, 중단의 명확한 단계를 거치는 현실을 반영한다. 모터 구동의 시작과 정지, 센서 수집의 개시와 종료, 통신 세션의 개설과 해제 등의 물리적 자원 관리가 생명주기 콜백의 적절한 구현에 의해 보장된다 (Faconti, 2024).
참고 문헌
- 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/