1292.54 액션 노드의 동작 원리

1. 액션 노드의 정의

액션 노드(Action Node)는 행동 트리(Behavior Tree)의 리프 노드(leaf node) 중 하나로, 로봇이 실제로 수행하는 구체적인 행동을 캡슐화한다. 액션 노드는 자식 노드를 갖지 않는 실행 노드(execution node)이며, 행동 트리에서 외부 세계와의 상호작용이 발생하는 유일한 지점이다. 제어 흐름 노드가 행동의 선택과 조합을 담당한다면, 액션 노드는 선택된 행동의 실제 실행을 담당한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

2. 액션 노드의 구조적 위치

행동 트리의 구조에서 액션 노드는 트리의 리프에 위치한다. 루트 노드에서 시작된 tick은 제어 흐름 노드를 거쳐 최종적으로 액션 노드에 도달하며, 액션 노드는 tick을 수신하면 자신이 캡슐화한 행동을 실행하고 그 결과를 반환 상태(node status)로 상위 노드에 전파한다.

Root
 └─ Sequence
      ├─ Condition [C1]
      ├─ Action [A1]     ← 리프 노드 (실행 노드)
      └─ Action [A2]     ← 리프 노드 (실행 노드)

액션 노드는 조건 노드(Condition Node)와 함께 실행 노드의 두 가지 유형을 구성한다. 조건 노드가 환경의 상태를 검사하는 순수 관찰자(observer)라면, 액션 노드는 환경의 상태를 변경하는 수행자(effector)이다.

3. 액션 노드의 반환 상태

액션 노드는 tick을 수신하면 다음 세 가지 반환 상태 중 하나를 반환한다.

반환 상태의미설명
Success행동 완료행동이 성공적으로 완료되었음을 나타낸다
Failure행동 실패행동이 실패하였음을 나타낸다
Running행동 진행 중행동이 아직 완료되지 않아 추가 tick이 필요함을 나타낸다

조건 노드가 Success 또는 Failure만을 반환하는 것과 달리, 액션 노드는 Running 상태를 반환할 수 있다. Running 상태는 행동이 즉각적으로 완료될 수 없으며, 후속 tick에서 계속 실행되어야 함을 나타낸다. 이 특성은 로봇의 물리적 행동이 시간을 소요한다는 현실을 반영한다 (Faconti, BehaviorTree.CPP Documentation, 2024).

4. 액션 노드의 실행 모델

4.1 동기 액션 노드

동기 액션 노드(synchronous action node)는 tick을 수신하면 행동을 완료할 때까지 tick 함수 내에서 실행을 차단(block)한다. 행동이 완료되면 Success 또는 Failure를 반환한다. 동기 액션 노드는 일반적으로 Running 상태를 반환하지 않으며, 한 번의 tick 내에서 행동이 완결된다.

function SyncAction.tick():
    result = execute_action()
    if result is successful:
        return Success
    else:
        return Failure

동기 액션 노드는 즉각적으로 완료되는 경량 연산에 적합하다. 그러나 실행 시간이 긴 행동을 동기적으로 수행하면, 해당 tick의 처리 시간이 증가하여 행동 트리 전체의 반응성이 저하된다.

4.2 비동기 액션 노드

비동기 액션 노드(asynchronous action node)는 행동의 시작, 진행, 완료를 여러 tick에 걸쳐 처리한다. 첫 번째 tick에서 행동을 시작하고 Running을 반환하며, 후속 tick에서 행동의 진행 상태를 확인하여 완료 시 Success 또는 Failure를, 진행 중이면 Running을 반환한다.

function AsyncAction.tick():
    if status == Idle:
        start_action()
        return Running
    else if status == Running:
        if action_completed():
            if action_succeeded():
                return Success
            else:
                return Failure
        else:
            return Running

비동기 액션 노드는 모터 구동, 경로 추종, 센서 데이터 수집 등 시간이 소요되는 물리적 행동을 캡슐화하는 데 적합하다 (Colledanchise & Ögren, 2018).

5. 액션 노드의 생명주기

액션 노드는 다음의 생명주기 콜백을 통해 행동의 시작, 진행, 중단을 관리한다.

5.1 onStart

onStart 콜백은 액션 노드가 Idle 상태에서 처음 tick을 수신할 때 호출된다. 이 콜백에서 행동의 초기화가 수행된다. 리소스 할당, 하드웨어 인터페이스 초기화, 목표 설정 등의 준비 작업이 이 시점에서 이루어진다.

5.2 onRunning

onRunning 콜백은 이전 tick에서 Running을 반환한 후, 후속 tick을 수신할 때 호출된다. 이 콜백에서 행동의 진행 상태를 확인하고, 완료 여부를 판단하여 적절한 반환 상태를 결정한다.

5.3 onHalted

onHalted 콜백은 상위 노드로부터 halt 요청을 수신할 때 호출된다. 이 콜백에서 진행 중인 행동의 중단과 자원 정리가 수행된다. halt 요청은 행동의 정상적인 완료와 무관하게, 상위 제어 흐름의 요구에 의해 행동이 강제 중단되는 상황을 처리한다 (Faconti, 2024).

6. 액션 노드의 Tick 수신과 처리

액션 노드가 tick을 수신하면, 현재 상태에 따라 다음과 같이 처리된다.

현재 상태호출되는 콜백가능한 반환 상태
IdleonStartSuccess, Failure, Running
RunningonRunningSuccess, Failure, Running

tick 수신 시의 처리 흐름을 의사 코드로 표현하면 다음과 같다.

function ActionNode.tick():
    if current_status == Idle:
        new_status = onStart()
    else if current_status == Running:
        new_status = onRunning()

    current_status = new_status
    return new_status

7. 액션 노드와 외부 시스템의 상호작용

액션 노드는 행동 트리와 외부 시스템 사이의 인터페이스 역할을 수행한다. 로봇 공학에서 액션 노드는 다음과 같은 외부 시스템과 상호작용한다.

  • 하드웨어 인터페이스: 모터 제어 명령 송신, 그리퍼 개폐, 센서 데이터 수집
  • 통신 인터페이스: ROS2 액션 서버 호출, 서비스 요청, 토픽 발행
  • 계산 모듈: 경로 계획 알고리즘 호출, 역기구학 계산, 영상 처리

이러한 외부 시스템과의 상호작용은 액션 노드의 내부에 캡슐화되며, 상위 제어 흐름 노드는 액션 노드의 반환 상태만을 통해 행동의 결과를 파악한다. 이 캡슐화는 행동 트리의 모듈성(modularity)과 재사용성(reusability)을 보장하는 핵심 설계 원리이다 (Colledanchise & Ögren, 2018).

8. 액션 노드의 Halt 처리

Running 상태의 액션 노드가 상위 노드로부터 halt 요청을 수신하면, 진행 중인 행동을 안전하게 중단하여야 한다. halt 처리의 주요 고려사항은 다음과 같다.

  1. 진행 중인 명령의 취소: 외부 시스템에 송신된 명령의 취소 요청
  2. 자원의 해제: 할당된 하드웨어 리소스, 통신 채널의 정리
  3. 안전 상태로의 전이: 로봇이 안전한 상태로 전이되도록 보장
  4. 상태 초기화: 노드의 내부 상태를 Idle로 복원

halt 처리가 완료되면 액션 노드는 Idle 상태로 복귀하며, 이후 다시 tick을 수신하면 onStart부터 새로 시작된다 (Faconti, 2024).

9. 로봇 공학에서의 활용

9.1 물리적 행동의 캡슐화

액션 노드는 로봇의 물리적 행동을 행동 트리의 구성 요소로 캡슐화한다. 이동, 물체 파지, 센서 스캔, 음성 출력 등의 개별 행동이 각각 하나의 액션 노드로 구현되며, 이들이 제어 흐름 노드에 의해 조합되어 복합적인 임무를 수행한다.

9.2 행동의 추상화 수준

액션 노드의 추상화 수준은 설계자의 결정에 의존한다. 하나의 액션 노드가 “목표 지점으로 이동“과 같은 고수준 행동을 캡슐화할 수도 있고, “왼쪽 바퀴 모터에 100 RPM 명령 송신“과 같은 저수준 행동을 캡슐화할 수도 있다. 적절한 추상화 수준의 선택은 행동 트리의 복잡도와 재사용성에 직접적인 영향을 미친다.


참고 문헌

  • 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/