1292.9 실행 노드 (Execution Node)의 개요
1. 서론
행동 트리(Behavior Tree)의 노드는 기능적 역할에 따라 제어 흐름 노드(Control Flow Node)와 실행 노드(Execution Node)로 대별된다. 제어 흐름 노드가 자식 노드의 실행 순서와 결과 해석을 결정하는 내부 노드(Internal Node)인 반면, 실행 노드는 트리의 말단에 위치하여 실제 연산, 판단, 또는 외부 시스템과의 상호작용을 수행하는 리프 노드(Leaf Node)이다. 본 절에서는 실행 노드의 정의, 분류, 구조적 특성, 그리고 행동 트리 내에서의 역할을 형식적으로 기술한다.
2. 실행 노드의 정의
실행 노드란 행동 트리에서 자식 노드를 갖지 않는 말단 노드로서, Tick을 수신하였을 때 구체적인 작업(Task)을 실행하거나 조건(Condition)을 평가하여 반환 상태(Return Status)를 생성하는 노드이다. 형식적으로, 실행 노드 E는 다음과 같이 정의된다:
E : \text{Tick} \rightarrow \{\text{Success}, \text{Failure}, \text{Running}\}
즉, 실행 노드는 Tick 신호를 입력으로 수신하고, 세 가지 반환 상태 중 하나를 출력으로 생성하는 함수로 모델링된다. 실행 노드는 자식 노드 집합이 공집합인 노드로, 다음의 제약 조건을 만족한다:
\text{children}(E) = \emptyset
3. 실행 노드의 분류
실행 노드는 수행하는 기능의 성격에 따라 두 가지 하위 유형으로 분류된다.
3.1 액션 노드 (Action Node)
액션 노드는 로봇 시스템에서 실제 물리적 동작이나 계산적 작업을 수행하는 노드이다. 액션 노드는 Tick을 수신하면 지정된 작업을 실행하며, 작업의 완료 여부에 따라 Success, Failure, 또는 Running 상태를 반환한다. 액션 노드의 예시로는 모터 제어 명령 전송, 경로 추종(Path Following) 실행, 그리퍼(Gripper) 개폐 동작 등이 있다.
액션 노드는 외부 시스템의 상태를 변경하는 부작용(Side Effect)을 수반할 수 있으며, 이 점에서 조건 노드와 본질적으로 구별된다. 형식적으로 액션 노드 A의 실행은 다음과 같이 표현된다:
A : (\text{Tick}, \Sigma) \rightarrow (\{\text{Success}, \text{Failure}, \text{Running}\}, \Sigma')
여기서 \Sigma는 실행 전 시스템 상태, \Sigma'는 실행 후 변경된 시스템 상태를 나타낸다.
3.2 조건 노드 (Condition Node)
조건 노드는 특정 조건의 참·거짓을 판별하는 순수 평가 노드이다. 조건 노드는 Tick을 수신하면 지정된 조건을 즉각적으로 평가하여 Success(참) 또는 Failure(거짓)만을 반환한다. 조건 노드는 Running 상태를 반환하지 않으며, 시스템 상태를 변경하는 부작용이 없어야 한다는 원칙이 적용된다.
\text{Condition} : (\text{Tick}, \Sigma) \rightarrow (\{\text{Success}, \text{Failure}\}, \Sigma)
시스템 상태 \Sigma가 실행 전후로 동일하게 유지됨에 주목하여야 한다.
4. 실행 노드와 제어 흐름 노드의 구조적 관계
행동 트리에서 실행 노드와 제어 흐름 노드는 상호 보완적인 관계를 형성한다. 제어 흐름 노드는 트리의 골격(Skeleton)을 구성하여 실행 흐름의 논리적 구조를 정의하고, 실행 노드는 그 골격의 말단에서 실질적인 행동을 수행한다.
4.1 계층적 구조에서의 위치
행동 트리를 방향 비순환 그래프(Directed Acyclic Graph, DAG)로 표현할 때, 실행 노드는 항상 리프(Leaf) 위치에 존재한다. 이는 실행 노드가 자식 노드를 보유하지 않기 때문이며, 트리의 깊이 우선 탐색(Depth-First Search, DFS) 순회에서 실행 노드에 도달한 시점이 곧 해당 분기의 최종 실행 지점임을 의미한다.
[Root]
|
[Sequence]
/ \
[Action] [Fallback]
/ \
[Condition] [Action]
위 구조에서 Action과 Condition 노드가 실행 노드에 해당하며, Root, Sequence, Fallback은 제어 흐름 노드에 해당한다.
4.2 Tick 전파의 종단점
Tick은 루트 노드에서 시작하여 제어 흐름 노드를 경유하며 하향 전파된다. 이 전파의 최종 종착점이 바로 실행 노드이다. 실행 노드는 수신된 Tick에 대해 자체적으로 작업을 수행하고 반환 상태를 생성하여, 이를 상위의 제어 흐름 노드에 역전파한다. 이 양방향 흐름—하향 Tick 전파와 상향 상태 반환—은 행동 트리의 실행 메커니즘의 근간을 이룬다.
5. 실행 노드의 실행 모델
실행 노드의 실행 모델은 작업의 시간적 특성에 따라 동기적(Synchronous) 모델과 비동기적(Asynchronous) 모델로 구분된다.
5.1 동기적 실행 모델
동기적 실행 모델에서 실행 노드는 Tick을 수신한 즉시 작업을 완료하고 Success 또는 Failure를 반환한다. 이 모델에서 Running 상태는 반환되지 않으며, 단일 Tick 내에서 모든 연산이 종결된다. 조건 노드는 본질적으로 동기적 실행 모델을 따르며, 단순한 산술 연산이나 변수 비교를 수행하는 액션 노드 역시 이 모델에 해당한다.
5.2 비동기적 실행 모델
비동기적 실행 모델에서 실행 노드는 작업이 단일 Tick 주기 내에 완료되지 않을 수 있으며, 작업이 진행 중임을 나타내는 Running 상태를 반환한다. 이후 Tick을 수신하면 작업의 진행 상황을 확인하여 완료되었으면 Success 또는 Failure를, 아직 진행 중이면 Running을 다시 반환한다.
로봇 공학에서 비동기적 실행 모델은 다음과 같은 장시간 소요 작업에 필수적이다:
| 작업 유형 | 설명 |
|---|---|
| 경로 추종(Path Following) | 로봇이 목표 지점까지 이동하는 동안 다수의 Tick 주기에 걸쳐 Running 상태를 반환한다. |
| 매니퓰레이션(Manipulation) | 로봇 팔이 물체를 파지(Grasp)하는 과정에서 다수의 제어 주기가 요구된다. |
| 센서 데이터 수집 | 특정 센서의 캘리브레이션(Calibration)이나 장시간 데이터 축적이 필요한 경우이다. |
| 외부 서비스 호출 | ROS2 서비스(Service) 또는 액션(Action) 서버에 대한 비동기 요청과 응답 대기가 포함된다. |
6. 실행 노드의 생명주기
실행 노드는 행동 트리의 노드 생명주기(Lifecycle) 모델을 따르며, 주요 콜백(Callback)을 통해 상태 전이가 관리된다.
6.1 상태 전이 모델
실행 노드의 생명주기는 다음의 상태 전이를 따른다:
\text{Idle} \xrightarrow{\text{onStart}} \text{Running} \xrightarrow{\text{onRunning}} \text{Success} \mid \text{Failure}
- Idle 상태: Tick을 수신하기 전의 초기 상태이다.
- onStart 콜백: 최초 Tick 수신 시 호출되며, 자원 할당 및 초기화를 수행한다.
- onRunning 콜백: 이미 Running 상태인 노드가 후속 Tick을 수신할 때 호출되며, 작업 진행 상황을 확인한다.
- Success 또는 Failure: 작업이 완료되면 최종 반환 상태로 전이된다.
6.2 Halt에 의한 강제 중단
실행 노드가 Running 상태에 있을 때 상위 제어 흐름 노드로부터 Halt 요청을 수신하면, onHalted 콜백이 호출된다. 이 콜백에서 실행 노드는 진행 중인 작업을 안전하게 중단하고, 할당된 자원을 해제하며, 내부 상태를 Idle로 초기화하여야 한다.
\text{Running} \xrightarrow{\text{onHalted}} \text{Idle}
7. 실행 노드와 블랙보드의 상호작용
실행 노드는 블랙보드(Blackboard)를 통해 행동 트리 내의 다른 노드와 데이터를 교환한다. 블랙보드는 키-값(Key-Value) 저장소로서, 실행 노드 간의 직접적인 의존성 없이 데이터를 공유할 수 있는 간접 통신 메커니즘을 제공한다.
7.1 입력 포트와 출력 포트
실행 노드는 입력 포트(Input Port)를 통해 블랙보드로부터 데이터를 읽고, 출력 포트(Output Port)를 통해 결과 데이터를 블랙보드에 기록한다. 이 포트 메커니즘은 실행 노드의 재사용성(Reusability)을 보장하며, 노드 간의 결합도(Coupling)를 최소화한다.
E_{\text{input}} : \text{Blackboard}[k] \rightarrow v
E_{\text{output}} : v' \rightarrow \text{Blackboard}[k']
여기서 k, k'는 블랙보드의 키, v, v'는 해당 값을 나타낸다.
8. 실행 노드의 설계 원칙
실행 노드의 설계는 다음의 원칙을 준수하여야 한다:
- 단일 책임 원칙(Single Responsibility Principle): 하나의 실행 노드는 하나의 명확한 작업 또는 조건 평가만을 담당하여야 한다. 복수의 작업을 하나의 노드에 집약하면 재사용성이 저하되고 디버깅이 곤란해진다.
- 부작용의 명확한 구분: 액션 노드는 부작용을 수반할 수 있으나, 조건 노드는 부작용이 없어야 한다. 이 구분이 훼손되면 행동 트리의 실행 의미론이 비결정론적(Non-deterministic)으로 변질될 위험이 있다.
- Halt 안전성(Halt Safety): 비동기적 실행 노드는 언제든 Halt 요청에 의해 중단될 수 있어야 하며, 중단 시 자원 누수(Resource Leak)나 불일치 상태가 발생하지 않아야 한다.
- 블랙보드 의존성의 최소화: 실행 노드가 블랙보드에 과도하게 의존하면 노드 간의 암묵적 결합이 증가한다. 필요한 최소한의 포트만을 선언하여 명시적 의존성을 유지하여야 한다.
- 결정론적 동작 보장: 동일한 입력 조건과 시스템 상태에서 실행 노드는 항상 동일한 반환 상태를 생성하여야 한다.
9. 실행 노드의 로봇 공학적 의의
실행 노드는 행동 트리와 로봇 하드웨어·소프트웨어 시스템 사이의 인터페이스 계층(Interface Layer)으로 기능한다. 제어 흐름 노드가 추상적인 의사결정 논리를 표현하는 반면, 실행 노드는 이 논리를 구체적인 로봇 행동으로 변환하는 역할을 수행한다.
ROS2 환경에서 실행 노드는 토픽(Topic) 발행·구독, 서비스 호출, 액션 클라이언트 요청 등 ROS2 통신 인터페이스를 캡슐화하며, 이를 통해 행동 트리의 의사결정 결과가 로봇의 물리적 행동으로 실현된다. 이러한 구조적 분리는 행동 트리의 플랫폼 독립성(Platform Independence)을 보장하며, 동일한 행동 트리 구조를 상이한 로봇 플랫폼에 재사용할 수 있는 기반을 제공한다.
참고 문헌
- Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Marzinotto, A., Colledanchise, M., Smith, C., & Ögren, P. (2014). “Towards a Unified Behavior Trees Framework for Robot Control.” Proceedings of the IEEE International Conference on Robotics and Automation (ICRA), 5420–5427.
- Faconti, D., & Contributors. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/
- Macenski, S., et al. (2020). “The Marathon 2: A Navigation System.” Proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS).
v1.0