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_1onStart0waypoint[0]으로 이동 시작Running
t_2onRunning0이동 중Running
t_3onRunning1waypoint[0] 도달, waypoint[1]로 전환Running
t_4onRunning1이동 중Running
t_5onRunning2waypoint[1] 도달, 모두 완료Success

5. 상태 초기화의 시점

상태 보존 액션 노드의 내부 상태는 다음의 두 가지 시점에서 초기화된다.

  1. onStart 호출 시: 노드가 Idle에서 Running으로 전이할 때, onStart에서 모든 내부 상태를 초기 값으로 설정한다.
  2. 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/