1292.58 무상태 액션 노드

1. 무상태 액션 노드의 정의

무상태 액션 노드(stateless action node)는 tick 간에 내부 상태를 유지하지 않는 액션 노드이다. 이 노드는 매 tick마다 동일한 입력에 대해 동일한 방식으로 행동을 수행하며, 이전 tick의 실행 결과나 이력이 현재 tick의 실행에 영향을 미치지 않는다. 무상태 액션 노드는 단일 tick 내에서 행동이 완결되므로 Running 상태를 반환하지 않으며, Success 또는 Failure만을 반환한다 (Faconti, BehaviorTree.CPP Documentation, 2024).

2. 무상태성의 의미론

무상태 액션 노드의 tick 함수는 수학적 함수(function)와 유사한 특성을 가진다. 동일한 입력(블랙보드 변수, 환경 상태)에 대해 동일한 출력(반환 상태)과 동일한 부작용(side effect)을 생성한다. tick 함수의 실행은 이전 tick의 실행과 완전히 독립적이다.

function StatelessAction.tick():
    input = read_inputs()        // 블랙보드 또는 환경에서 입력 획득
    result = perform_action(input)  // 행동 수행
    if result == success:
        return Success
    else:
        return Failure

이 모델에서 tick 함수는 호출될 때마다 독립적으로 실행되며, 함수 호출 사이에 어떠한 상태도 보존되지 않는다. 노드의 멤버 변수에 tick 간에 유지되는 데이터가 존재하지 않으며, 모든 필요한 입력은 매 tick에서 외부(블랙보드, 센서, 파라미터)로부터 새로 획득된다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

3. 상태 보존 액션 노드와의 비교

속성무상태 액션 노드상태 보존 액션 노드
Running 반환불가가능
내부 상태 보존없음tick 간 유지
콜백 구조tick만 사용onStart, onRunning, onHalted
Halt 처리불필요필요
실행 기간단일 tick다중 tick
구현 복잡도낮음높음
멱등성보장되지 않음 (부작용 존재)보장되지 않음

무상태 액션 노드는 상태 보존 액션 노드에 비해 구현이 단순하며, tick 간의 상태 일관성 관리, halt 시 자원 정리 등의 복잡한 생명주기 관리가 필요하지 않다.

4. 단일 콜백 구조

무상태 액션 노드는 tick() 함수 하나만으로 행동의 전체 로직을 구현한다. 상태 보존 액션 노드의 세 가지 콜백(onStart, onRunning, onHalted)이 불필요하며, 노드가 Running 상태에 진입하지 않으므로 halt 콜백도 호출되지 않는다.

BehaviorTree.CPP 라이브러리에서 무상태 액션 노드는 SyncActionNode 클래스를 상속하여 구현된다. 이 클래스는 Running 반환을 허용하지 않으며, tick 함수에서 Running을 반환하면 런타임 예외가 발생한다 (Faconti, 2024).

5. 무상태 액션 노드의 특성

5.1 재진입 안전성

무상태 액션 노드는 tick 간에 내부 상태를 유지하지 않으므로, 행동 트리의 구조 변경이나 제어 흐름의 변화에 의해 노드가 예기치 않은 시점에 tick을 수신하더라도 안전하게 동작한다. 이전 tick의 잔여 상태가 없으므로, 어떤 시점에서 tick을 수신하든 동일한 동작이 보장된다.

5.2 반복 실행에서의 독립성

Repeat 데코레이터 등에 의해 무상태 액션 노드가 반복적으로 tick을 수신하는 경우, 각 반복은 이전 반복과 완전히 독립적이다. 반복 횟수나 이전 반복의 결과에 관계없이, 매 tick에서 동일한 로직이 실행된다.

5.3 예측 가능성

무상태 액션 노드의 동작은 현재 tick 시점의 입력에 의해서만 결정되므로, 노드의 동작을 예측하고 검증하는 것이 용이하다. 이전 실행 이력에 의한 암묵적 의존성이 없으므로, 단위 테스트에서 각 tick을 독립적으로 검증할 수 있다.

6. 적합한 용도

무상태 액션 노드는 다음과 같은 즉각적으로 완결되는 행동에 적합하다.

용도설명예시
즉각적 명령외부 시스템에 단일 명령 송신LED 제어, 경고음 출력
데이터 기록블랙보드 변수 설정목표 좌표 갱신, 모드 플래그 설정
수학 연산계산 결과 도출좌표 변환, 거리 계산
메시지 발행단일 메시지 발행ROS2 토픽 발행
로그 출력진단 정보 기록상태 로깅, 이벤트 기록

이러한 행동은 실행 시간이 tick 주기에 비해 무시할 수 있을 정도로 짧으며, 행동의 완료를 여러 tick에 걸쳐 추적할 필요가 없다.

7. 부적합한 용도

다음과 같은 행동은 무상태 액션 노드로 구현하기에 부적합하다.

  • 시간 소요 행동: 이동, 매니퓰레이션, 센서 스캔 등 물리적 시간이 필요한 행동
  • 다단계 행동: 여러 하위 단계를 순차적으로 수행하는 복합 행동
  • 진행 추적 행동: 진행률, 경과 시간, 반복 횟수 등을 추적하여야 하는 행동

이러한 행동은 상태 보존 액션 노드 또는 비동기 액션 노드로 구현하여야 한다 (Colledanchise & Ögren, 2018).

8. 로봇 공학에서의 활용

8.1 블랙보드 조작

행동 트리의 제어 흐름에서 블랙보드 변수를 조작하는 유틸리티 노드는 무상태 액션 노드로 구현된다. 목표 위치 설정, 동작 모드 전환, 카운터 초기화 등의 블랙보드 조작은 메모리 접근만을 수반하므로 즉각적으로 완료된다.

8.2 즉각적 하드웨어 명령

비상 정지 신호 송신, LED 상태 변경, 릴레이 제어 등의 즉각적인 하드웨어 명령은 명령 송신 자체가 순간적으로 완료되므로, 무상태 액션 노드가 적합하다. 이러한 노드는 행동 트리의 제어 흐름에서 부수적인 효과를 생성하는 역할을 수행한다.

8.3 진단 및 로깅

시스템 상태 로깅, 진단 메시지 출력, 성능 카운터 갱신 등의 진단 관련 행동은 무상태 액션 노드로 구현된다. 이 노드는 행동 트리의 주요 제어 흐름에 영향을 미치지 않으면서, 시스템의 관측 가능성(observability)을 향상시킨다 (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/