1292.74 onRunning 콜백의 역할

1. onRunning 콜백의 정의

onRunning 콜백은 행동 트리의 상태 보존 액션 노드(StatefulActionNode)가 Running 상태에서 후속 tick을 수신할 때 호출되는 생명주기 콜백이다. 이 콜백은 행동의 진행 단계(execution phase)에 해당하며, 진행 중인 행동의 상태를 확인하고 완료 여부를 판단하여 적절한 반환 상태를 결정한다 (Faconti, BehaviorTree.CPP Documentation, 2024).

2. 호출 시점

onRunning이 호출되는 조건은 다음과 같다.

조건설명
현재 상태가 Running이전 tick에서 Running을 반환하였다
tick 수신상위 노드로부터 tick이 전달된다

onRunningonStart가 Running을 반환한 이후의 모든 tick에서 호출된다. 행동이 완료(Success 또는 Failure 반환)될 때까지 매 tick마다 반복적으로 호출된다.

3. 수행하는 작업

3.1 진행 상태 확인

외부 시스템에 위임된 행동의 현재 상태를 비차단적(non-blocking)으로 확인한다. ROS2 액션 서버의 피드백 확인, 센서 데이터의 갱신 여부 검사, 목표 도달 여부 판단 등이 이 시점에서 수행된다.

3.2 완료 판단

행동이 완료되었는지를 판단한다. 완료 조건이 충족되면 Success 또는 Failure를 반환하고, 충족되지 않으면 Running을 반환하여 행동의 계속을 나타낸다.

3.3 중간 결과 갱신

행동의 중간 결과를 내부 변수 또는 블랙보드에 갱신한다. 누적 이동 거리, 수집된 데이터 양, 경과 시간 등의 중간 결과가 매 tick에서 갱신된다.

3.4 진행 단계 전이

다단계 행동의 경우, 현재 단계의 완료를 확인하고 다음 단계로 전이한다. 물체 파지 작업에서 접근 → 파지 → 들어올림의 단계 전이가 onRunning에서 처리된다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

4. 반환 상태

반환 상태의미후속 동작
Success행동 성공적 완료노드 Idle로 복귀
Failure행동 실패노드 Idle로 복귀
Running행동 진행 중다음 tick에서 onRunning 재호출

5. 비차단적 실행의 중요성

onRunning은 비차단적으로 실행되어야 한다. 행동의 진행 상태를 확인하는 데 소요되는 시간이 tick 주기에 비해 충분히 짧아야 하며, 행동의 완료를 동기적으로 대기(block)하지 않아야 한다. onRunning 내에서 차단이 발생하면 행동 트리 전체의 tick 주기가 지연되어 반응성이 저하된다 (Faconti, 2024).

6. 구현 예시

class NavigateToGoal : StatefulActionNode {
    onRunning():
        feedback = action_client.get_feedback()

        if feedback.status == SUCCEEDED:
            result_pose = feedback.result
            blackboard.set("final_pose", result_pose)
            return Success
        else if feedback.status == ABORTED:
            return Failure
        else:
            // 아직 진행 중
            return Running
}

7. onStart와의 관계

onStartonRunning은 행동의 생명주기를 분할하여 관리한다.

콜백호출 횟수역할
onStart1회초기화, 행동 개시
onRunning0회 이상진행 확인, 완료 판단

onStart가 Success 또는 Failure를 반환하면 onRunning은 호출되지 않는다. onStart가 Running을 반환한 경우에만 후속 tick에서 onRunning이 호출된다.

8. 로봇 공학에서의 의의

onRunning은 비동기적으로 진행되는 로봇의 물리적 행동을 행동 트리의 tick 루프와 동기화하는 접점이다. 이동, 매니퓰레이션, 센서 수집 등의 행동이 외부 시스템에서 독립적으로 진행되는 동안, onRunning은 매 tick에서 해당 행동의 현재 상태를 확인하여 행동 트리의 제어 흐름에 반영한다 (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/