1292.57 상태 보존 액션 노드
1. 상태 보존 액션 노드의 정의
상태 보존 액션 노드(stateful action node)는 tick 간에 내부 상태를 유지하는 액션 노드이다. 이 노드는 첫 번째 tick에서 행동을 시작하고, 이후의 tick에서 이전 tick의 실행 결과와 누적된 상태를 기반으로 행동을 계속 진행한다. 상태 보존 액션 노드는 BehaviorTree.CPP 라이브러리에서 StatefulActionNode 클래스로 구현되며, onStart, onRunning, onHalted의 세 가지 콜백을 통해 행동의 생명주기를 관리한다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 콜백 기반 생명주기
상태 보존 액션 노드는 노드의 현재 상태에 따라 서로 다른 콜백이 호출되는 생명주기 모델을 채택한다.
function StatefulActionNode.tick():
if current_status == Idle:
new_status = onStart()
else if current_status == Running:
new_status = onRunning()
current_status = new_status
return new_status
function StatefulActionNode.halt():
if current_status == Running:
onHalted()
current_status = Idle
2.1 onStart 콜백
onStart는 노드가 Idle 상태에서 처음 tick을 수신할 때 호출된다. 이 콜백에서 행동의 초기화가 수행된다. 초기화에는 목표 설정, 자원 할당, 외부 시스템에 대한 요청 송신 등이 포함된다. onStart는 Success, Failure, Running 중 하나를 반환한다. 행동이 즉각적으로 완료 가능한 경우 Success 또는 Failure를 반환하고, 추가 tick이 필요한 경우 Running을 반환한다.
2.2 onRunning 콜백
onRunning은 이전 tick에서 Running을 반환한 후, 후속 tick을 수신할 때 호출된다. 이 콜백에서 행동의 진행 상태를 확인하고, 완료 여부에 따라 Success, Failure, Running 중 하나를 반환한다. onRunning은 행동이 완료될 때까지 매 tick마다 반복적으로 호출된다.
2.3 onHalted 콜백
onHalted는 노드가 Running 상태일 때 상위 노드로부터 halt 요청을 수신하면 호출된다. 이 콜백에서 진행 중인 행동의 중단, 외부 시스템에 대한 취소 요청 송신, 할당된 자원의 해제 등이 수행된다 (Faconti, 2024).
3. 내부 상태의 구조
상태 보존 액션 노드가 tick 간에 유지하는 내부 상태는 노드의 멤버 변수로 저장된다. 이 상태의 유형은 행동의 특성에 따라 다양하다.
| 상태 유형 | 예시 | 생명주기 |
|---|---|---|
| 실행 단계 | 현재 하위 작업 인덱스 | onStart에서 초기화, onRunning에서 갱신 |
| 외부 핸들 | 액션 서버 목표 핸들 | onStart에서 생성, onHalted에서 해제 |
| 누적 측정값 | 경과 시간, 이동 거리 | onStart에서 초기화, onRunning에서 누적 |
| 시작 조건 | 초기 위치, 시작 시각 | onStart에서 기록 |
| 중간 결과 | 부분 계산 결과 | onRunning에서 갱신, 최종 tick에서 사용 |
이 내부 상태는 onStart에서 초기화되고, onRunning에서 갱신되며, 행동이 완료(Success 또는 Failure 반환)되거나 halt될 때 정리된다. 노드가 Idle 상태로 복귀한 후 다시 tick을 수신하면, onStart가 호출되어 상태가 새로 초기화된다.
4. 실행 흐름 예제
다음의 상태 보존 액션 노드는 로봇이 일련의 경유점(waypoint)을 순차적으로 방문하는 행동을 구현한다.
class VisitWaypoints : StatefulActionNode {
waypoints[] // 방문할 경유점 목록
current_index // 현재 방문 중인 경유점 인덱스
onStart():
waypoints = get_waypoints_from_blackboard()
current_index = 0
send_navigation_goal(waypoints[0])
return Running
onRunning():
if navigation_reached_goal():
current_index += 1
if current_index >= waypoints.length:
return Success // 모든 경유점 방문 완료
send_navigation_goal(waypoints[current_index])
return Running
else if navigation_failed():
return Failure
else:
return Running
onHalted():
cancel_navigation()
current_index = 0
}
이 예제에서 current_index는 tick 간에 보존되는 내부 상태이다. onStart에서 0으로 초기화되고, onRunning에서 경유점 도달 시마다 증가한다.
| Tick | 콜백 | current_index | 행동 | 반환 |
|---|---|---|---|---|
| t_1 | onStart | 0 | waypoint[0]으로 이동 시작 | Running |
| t_2 | onRunning | 0 | 이동 중 | Running |
| t_3 | onRunning | 1 | waypoint[0] 도달, waypoint[1]로 전환 | Running |
| t_4 | onRunning | 1 | 이동 중 | Running |
| t_5 | onRunning | 2 | waypoint[1] 도달, 모두 완료 | Success |
5. 상태 초기화의 시점
상태 보존 액션 노드의 내부 상태는 다음의 두 가지 시점에서 초기화된다.
- onStart 호출 시: 노드가 Idle에서 Running으로 전이할 때, onStart에서 모든 내부 상태를 초기 값으로 설정한다.
- onHalted 호출 시: 외부 halt 요청에 의해 행동이 중단될 때, onHalted에서 진행 중인 작업을 취소하고 내부 상태를 정리한다.
행동이 Success 또는 Failure로 정상 완료된 경우, 노드는 자동으로 Idle 상태로 복귀한다. 이후 다시 tick을 수신하면 onStart가 호출되어 상태가 새로 초기화된다. 이 설계는 동일한 액션 노드가 행동 트리의 반복 실행에서 매번 독립적으로 동작할 수 있도록 보장한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
6. 블랙보드와의 상호작용
상태 보존 액션 노드는 내부 상태 외에 블랙보드(blackboard)를 통해 다른 노드와 데이터를 공유한다. 블랙보드로부터 입력 데이터를 읽고, 행동의 결과를 블랙보드에 기록하는 것은 onStart 또는 onRunning에서 수행된다.
내부 상태와 블랙보드의 역할 구분은 다음과 같다.
| 저장소 | 용도 | 가시 범위 | 생명주기 |
|---|---|---|---|
| 내부 멤버 변수 | 노드 자체의 실행 상태 | 해당 노드만 접근 | onStart ~ 완료/halt |
| 블랙보드 | 노드 간 공유 데이터 | 블랙보드 접근 권한이 있는 모든 노드 | 행동 트리 실행 전체 |
7. 로봇 공학에서의 활용
7.1 다단계 임무 수행
상태 보존 액션 노드는 여러 하위 단계로 구성된 복합 행동을 단일 노드로 캡슐화하는 데 적합하다. 물체 파지(pick-and-place) 작업에서 접근, 파지, 이동, 배치의 각 단계를 내부 상태 머신으로 관리하고, 매 tick에서 현재 단계의 진행 상태를 확인하여 다음 단계로 전이한다.
7.2 점진적 탐색
환경 탐색에서 로봇이 미탐색 영역을 순차적으로 방문하는 행동은 상태 보존 액션 노드로 구현된다. 방문한 영역의 목록과 현재 탐색 대상이 내부 상태로 유지되며, 매 tick에서 탐색 진행 상태가 갱신된다 (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/