1292.70 RunOnce 데코레이터의 동작

1. RunOnce 데코레이터의 정의

RunOnce 데코레이터는 자식 노드를 최초 한 번만 실행하고, 이후의 tick에서는 자식을 다시 실행하지 않고 이전 실행의 최종 반환 상태를 그대로 반환하는 데코레이터 노드이다. 자식이 완료(Success 또는 Failure)되면 그 결과를 기억하고, 이후의 모든 tick에서 기억된 결과를 반환한다. 자식이 Running 상태인 동안에는 계속 tick을 전달한다 (Faconti, BehaviorTree.CPP Documentation, 2024).

2. 알고리즘

function RunOnce.tick():
    if already_completed:
        return cached_status

    child_status = child.tick()

    if child_status == Success or child_status == Failure:
        already_completed = true
        cached_status = child_status

    return child_status

3. 상태 변환 규칙

실행 상태자식 반환 상태RunOnce 반환 상태
미완료SuccessSuccess (결과 캐싱)
미완료FailureFailure (결과 캐싱)
미완료RunningRunning
완료됨(자식 미실행)캐싱된 상태 반환

4. 실행 흐름 예제

RunOnce [RO1]
 └─ Action [A1: 초기화]

4.1 자식이 즉시 완료되는 경우

Tick실행 상태A1 tick 전달A1 반환RO1 반환
t_1미완료전달SuccessSuccess
t_2완료됨미전달-Success (캐싱)
t_3완료됨미전달-Success (캐싱)

tick t_1에서 A1이 Success를 반환하면, RunOnce는 이 결과를 캐싱한다. tick t_2 이후에는 A1에 tick을 전달하지 않고, 캐싱된 Success를 반환한다.

4.2 비동기 자식의 경우

Tick실행 상태A1 tick 전달A1 반환RO1 반환
t_1미완료전달RunningRunning
t_2미완료전달RunningRunning
t_3미완료 → 완료전달SuccessSuccess
t_4완료됨미전달-Success (캐싱)

자식이 Running을 반환하는 동안에는 계속 tick을 전달하며, 자식이 최종적으로 완료되면 결과를 캐싱하고 이후 tick에서는 자식을 실행하지 않는다 (Faconti, 2024).

5. 내부 상태 관리

RunOnce 데코레이터는 다음의 내부 상태를 유지한다.

상태설명
already_completed자식의 실행이 완료되었는지 여부
cached_status자식의 최종 반환 상태 (Success 또는 Failure)

이 상태는 일반적으로 halt 요청에 의해 초기화되지 않는다. RunOnce의 의미론은 행동 트리의 전체 실행 기간에 걸쳐 자식을 한 번만 실행하는 것이므로, halt 후 재활성화되더라도 이미 완료된 실행의 결과를 유지한다. 다만 구현에 따라 halt 시 상태를 초기화하는 변형도 존재한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

6. Halt 전파

function RunOnce.halt():
    if not already_completed and child.status == Running:
        child.halt()
    set_status(Idle)
    // already_completed와 cached_status는 유지

자식의 실행이 아직 완료되지 않은 상태에서 halt가 요청되면, Running 상태의 자식에 halt를 전파한다. 이미 완료된 경우에는 자식에 대한 halt가 필요하지 않다.

7. 로봇 공학에서의 활용

7.1 일회성 초기화

시스템 초기화, 센서 캘리브레이션, 초기 위치 설정 등 한 번만 수행되어야 하는 행동에 RunOnce가 활용된다. 행동 트리가 반복적으로 실행되더라도, RunOnce에 의해 초기화 행동은 최초 1회만 실행된다.

7.2 비반복 이벤트

알림 발송, 로그 기록, 상태 보고 등 한 번만 수행하면 충분한 행동에 RunOnce가 적용된다. 행동 트리의 tick 루프에 의해 해당 노드가 반복적으로 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/