1291.50 행동 트리의 확장성 원칙 (Scalability Principle of Behavior Trees)
1. 확장성의 정의와 행동 제어 시스템에서의 요구
확장성(scalability)이란 시스템의 규모가 증가하거나 요구사항이 변경될 때, 기존 구조의 근본적 재설계 없이 새로운 기능을 추가하거나 기존 기능을 수정할 수 있는 능력을 나타내는 설계 속성이다. 소프트웨어 공학에서 확장성은 시스템의 장기적 생존 가능성(long-term viability)을 결정하는 핵심 품질 요인이며, 특히 요구사항이 점진적으로 증가하는 대규모 시스템에서 그 중요성이 극대화된다.
로봇 행동 제어 시스템에서 확장성에 대한 요구는 필연적이다. 로봇의 초기 배치(deployment) 단계에서는 제한된 수의 단순한 행동만이 필요하지만, 운용 환경의 확장, 임무 유형의 다양화, 안전 요구사항의 추가, 그리고 새로운 센서 및 액추에이터의 통합에 따라 행동 제어 시스템의 규모는 지속적으로 증가한다. 확장성이 부족한 행동 제어 아키텍처에서는 새로운 행동의 추가가 기존 행동에 대한 광범위한 수정을 요구하며, 이는 회귀 오류(regression error)의 발생 확률을 높이고 개발 비용을 급증시킨다.
행동 트리(Behavior Tree, BT)는 그 구조적 특성에 의하여 높은 확장성을 내재적으로 제공하는 행동 제어 프레임워크이다. 행동 트리의 확장성 원칙이란, 트리 자료 구조의 구성적(compositional) 특성과 노드 간의 느슨한 결합(loose coupling)에 기반하여 행동의 추가, 제거, 수정이 기존 트리 구조에 미치는 영향을 최소화하는 설계 속성을 의미한다.
2. 확장성의 구조적 기반
2.1 구성적 구조에 의한 점진적 확장
행동 트리의 확장성은 트리 자료 구조가 본질적으로 **구성적(compositional)**이라는 속성에 기반한다. 구성적 구조란, 개별 구성 요소를 결합하여 더 큰 구성 요소를 형성하고, 이 과정을 재귀적으로 반복하여 임의의 규모의 시스템을 구축할 수 있는 구조를 의미한다.
행동 트리에서 임의의 서브트리(subtree)는 그 자체로 완전한 행동 트리이다. 하나의 서브트리를 더 큰 트리의 노드로 삽입하거나, 기존 트리에서 서브트리를 분리하는 연산이 트리의 나머지 부분에 구조적 영향을 미치지 않는다. 이 속성을 형식적으로 표현하면 다음과 같다.
\mathcal{T} = f(\mathcal{T}_1, \mathcal{T}_2, \ldots, \mathcal{T}_n)
여기서 \mathcal{T}는 전체 행동 트리, \mathcal{T}_i는 각 서브트리, f는 제어 흐름 노드에 의한 구성 연산을 나타낸다. 새로운 서브트리 \mathcal{T}_{n+1}의 추가는 구성 연산 f의 인수를 확장하는 것에 해당하며, 기존 서브트리 \mathcal{T}_1, \ldots, \mathcal{T}_n의 내부 구조에는 어떠한 변경도 필요하지 않다.
2.2 노드 간 느슨한 결합
행동 트리에서 노드 간의 상호작용은 부모-자식 관계를 통한 **반환 상태(return status)**의 전달로 한정된다. 자식 노드는 부모 노드에 Success, Failure, 또는 Running 중 하나의 상태만을 반환하며, 부모 노드는 이 반환 상태에 기반하여 제어 흐름을 결정한다.
이 인터페이스의 단순성과 통일성에 의하여, 자식 노드의 내부 구현이 외부에 노출되지 않는 **정보 은닉(information hiding)**이 자연스럽게 달성된다. 특정 Action 노드의 구현을 완전히 다른 알고리즘으로 교체하더라도, 해당 노드가 동일한 3값 반환 상태 프로토콜을 따르는 한 트리의 나머지 부분에는 영향이 없다. 이는 노드 수준에서의 **대체 가능성(substitutability)**을 보장하며, 기능 확장의 국소적 영향을 구조적으로 보장한다.
2.3 서브트리에 의한 기능 캡슐화
서브트리(subtree)는 행동 트리의 확장성을 실현하는 핵심 메커니즘이다. 복잡한 행동 패턴을 하나의 서브트리로 캡슐화하면, 상위 트리에서 해당 서브트리는 단일 노드로 취급된다. 서브트리의 추가, 제거, 교체가 상위 트리의 구조에 미치는 영향은 해당 서브트리가 연결된 단일 지점에 한정된다.
BehaviorTree.CPP에서는 별도의 XML 파일로 정의된 서브트리를 <SubTree> 태그를 통하여 참조할 수 있다. 이 메커니즘에 의하여 개별 서브트리를 독립적으로 개발, 테스트, 그리고 배포할 수 있으며, 다수의 서브트리를 조합하여 점진적으로 규모를 확장하는 것이 가능하다.
3. 확장 유형별 행동 트리의 대응
3.1 행동 추가에 의한 수평적 확장
새로운 행동을 기존 시스템에 추가하는 **수평적 확장(horizontal scaling)**은 행동 트리에서 가장 자연스러운 확장 형태이다. 새로운 행동 노드 또는 서브트리를 기존 제어 노드의 자식으로 삽입하면 된다.
예를 들어, 기존의 순찰 임무 트리에 장애물 회피 기능을 추가하는 경우를 고려한다.
확장 이전:
Sequence
├── Action: "ComputePatrolPath"
├── Action: "FollowPath"
└── Action: "ReportArrival"
확장 이후:
Sequence
├── Action: "ComputePatrolPath"
├── ReactiveFallback
│ ├── Sequence
│ │ ├── Condition: "IsObstacleDetected"
│ │ └── Action: "AvoidObstacle"
│ └── Action: "FollowPath"
└── Action: "ReportArrival"
이 확장에서 ComputePatrolPath와 ReportArrival 노드는 어떠한 수정도 받지 않았다. 변경의 범위는 FollowPath 노드가 위치한 지점에 국한되며, 기존 노드의 로직에는 전혀 영향을 미치지 않는다.
3.2 행동 세분화에 의한 수직적 확장
기존 행동을 더 세밀한 하위 행동으로 분해하는 **수직적 확장(vertical scaling)**은 행동 트리의 계층적 구조에 의하여 자연스럽게 지원된다. 기존의 단일 Action 노드를 여러 하위 노드로 구성된 서브트리로 대체하는 것이 이에 해당한다.
\text{Action}_{단일} \rightarrow \text{Sequence}(\text{Action}_{하위1}, \text{Action}_{하위2}, \ldots, \text{Action}_{하위k})
이 대체에서 상위 트리의 관점에서는 해당 노드가 여전히 3값 반환 상태를 반환하는 단일 요소로 인식되므로, 상위 트리의 구조적 수정이 불필요하다. 이는 객체 지향 설계에서의 **리스코프 치환 원칙(Liskov Substitution Principle)**과 유사한 속성이다.
3.3 임무 유형 확장
행동 트리에서 다수의 임무 유형을 지원하는 확장은 최상위 수준의 Fallback 또는 Sequence 노드에 새로운 임무 서브트리를 추가하는 것으로 달성된다. 각 임무 유형이 독립적인 서브트리로 캡슐화되어 있으므로, 새로운 임무 유형의 추가가 기존 임무 서브트리에 영향을 미치지 않는다.
ReactiveFallback
├── SubTree: "EmergencyResponse"
├── SubTree: "ChargingMission"
├── SubTree: "PatrolMission"
└── SubTree: "InspectionMission" ← 새로 추가된 임무
이 구조에서 InspectionMission 서브트리의 추가는 EmergencyResponse, ChargingMission, PatrolMission 서브트리에 어떠한 영향도 미치지 않는다.
4. 유한 상태 머신과의 확장성 비교
유한 상태 머신(Finite State Machine, FSM)과 행동 트리의 확장성을 체계적으로 비교하면 다음과 같다.
| 확장성 요소 | 유한 상태 머신 | 행동 트리 |
|---|---|---|
| 새 행동 추가 시 수정 범위 | 기존 상태에서 새 상태로의 전이 규칙 추가 필요 | 해당 위치에 노드 삽입, 기존 노드 수정 불필요 |
| 추가에 따른 복잡도 증가 | O(n)~O(n^2) (전이 규칙 수) | O(1) (국소적 삽입) |
| 기존 기능에 대한 파급 효과 | 새 전이의 추가가 기존 전이 조건과 충돌 가능 | 서브트리 격리에 의하여 파급 효과 차단 |
| 기능 제거 시 영향 | 해당 상태로의 모든 전이를 식별하고 제거 필요 | 해당 노드 또는 서브트리 삭제로 완료 |
| 팀 간 분업 개발 | 상태 전이의 전역적 의존성으로 병렬 개발 어려움 | 독립적 서브트리 단위 병렬 개발 가능 |
유한 상태 머신에서 n개의 상태에 새로운 상태 s_{n+1}을 추가하는 경우, s_{n+1}로의 진입 전이와 s_{n+1}에서의 탈출 전이를 정의하여야 하며, 이 과정에서 기존 상태의 전이 규칙을 수정하여야 할 수 있다. 이 수정은 기존 전이 조건과의 우선순위 충돌, 비결정적 전이의 발생, 또는 도달 불가능 상태(unreachable state)의 생성 등 부작용을 유발할 위험이 있다.
반면, 행동 트리에서 새로운 행동의 추가는 적절한 제어 노드의 자식으로 새 노드를 삽입하는 국소적 연산이다. 기존 노드의 내부 로직이나 다른 서브트리의 구조에 대한 수정은 요구되지 않는다.
5. 확장 시의 구조적 무결성 보존
5.1 인터페이스 일관성에 의한 호환성 보장
행동 트리의 모든 노드가 동일한 3값 반환 상태 인터페이스를 준수하므로, 확장 과정에서 새로 추가되는 노드는 기존 노드와 동일한 프로토콜로 상호작용한다. 이 인터페이스 일관성은 확장에 의하여 시스템의 구조적 무결성이 훼손되지 않음을 보장한다.
\forall n \in \mathcal{N}: \text{output}(n) \in \{Success, Failure, Running\}
여기서 \mathcal{N}은 트리의 전체 노드 집합이다. 새로 추가되는 노드 n_{new}가 이 조건을 만족하는 한, n_{new}의 삽입이 기존 트리의 의미론적 정합성(semantic consistency)에 영향을 미치지 않는다.
5.2 블랙보드 네임스페이스에 의한 격리
서브트리 간의 데이터 격리는 확장성의 실용적 전제 조건이다. BehaviorTree.CPP 4.x에서는 블랙보드(blackboard)의 네임스페이스(namespace) 분리 메커니즘을 제공한다. 각 서브트리는 독립적인 블랙보드 인스턴스를 가질 수 있으며, 상위 트리와의 데이터 교환은 명시적으로 선언된 포트(port) 매핑을 통해서만 이루어진다.
이 격리 메커니즘에 의하여, 서로 다른 서브트리가 동일한 블랙보드 키 명칭을 사용하더라도 충돌이 발생하지 않는다. 따라서 독립적으로 개발된 서브트리를 하나의 트리에 통합하는 과정에서 이름 충돌(naming collision)에 의한 오류가 방지된다.
6. 대규모 행동 트리의 확장 사례
6.1 Nav2 네비게이션 스택
ROS2의 Nav2(Navigation2) 프레임워크는 행동 트리의 확장성 원칙이 대규모 시스템에서 실현된 대표적 사례이다. Nav2는 자율 이동 로봇의 네비게이션 기능을 행동 트리로 구성하며, 기본 제공 행동 트리에 사용자 정의 노드와 서브트리를 추가하여 기능을 확장하는 아키텍처를 채택하고 있다.
Nav2의 기본 네비게이션 트리는 경로 계산(ComputePathToPose), 경로 추종(FollowPath), 복구 행동(RecoveryNode) 등의 서브트리로 구성되며, 사용자는 이 구조를 유지하면서 경유지 추종(waypoint following), 커버리지 경로(coverage path), 또는 임무별 조건 검사 등의 기능을 서브트리 단위로 추가할 수 있다.
6.2 점진적 프로토타이핑에서 완전 배치까지의 확장 경로
행동 트리의 확장성 원칙은 로봇 시스템의 개발 생명주기(development lifecycle) 전반에 걸쳐 점진적 확장 경로를 제공한다.
| 개발 단계 | 행동 트리 구조 | 노드 수 (예시) |
|---|---|---|
| 초기 프로토타입 | 단일 Sequence: 이동 → 정지 | 3~5 |
| 기능 검증 | Fallback 추가: 비상 정지 + 기본 임무 | 10~20 |
| 현장 시험 | 복구 행동, 배터리 관리 서브트리 추가 | 30~60 |
| 완전 배치 | 다중 임무, 환경 적응, 원격 갱신 서브트리 통합 | 100~300 |
각 단계에서의 확장은 기존 트리 구조의 보존 하에 서브트리의 추가로 이루어지므로, 이전 단계에서 검증된 행동 논리가 훼손되지 않는다. 이 점진적 확장 경로는 행동 트리의 확장성 원칙이 실제 개발 프로세스에서 갖는 실용적 가치를 보여준다.
7. 확장성의 한계와 보완 전략
7.1 블랙보드 의존성의 전역적 확산
서브트리 간의 데이터 공유가 블랙보드를 통하여 이루어질 때, 블랙보드 키에 대한 암묵적 의존성이 서브트리 경계를 넘어 확산될 수 있다. 다수의 서브트리가 동일한 블랙보드 키를 읽고 쓰는 경우, 하나의 서브트리 수정이 다른 서브트리의 동작에 예기치 않은 영향을 미칠 수 있다. 이를 방지하기 위하여 명시적 포트 매핑과 네임스페이스 분리를 엄격히 적용하는 설계 지침이 필요하다.
7.2 트리 규모 증대에 따른 관리 복잡도
행동 트리의 노드 수가 수백 개 이상으로 증가하면, 트리 전체의 구조를 파악하고 관리하는 복잡도가 증가한다. 서브트리에 의한 추상화가 이 문제를 완화하지만, 서브트리 간의 고수준 의존 관계를 체계적으로 관리하기 위한 문서화와 설계 규약의 수립이 수반되어야 한다.
7.3 동적 확장의 제약
정적으로 정의된 행동 트리의 구조를 실행 중에 동적으로 변경하는 것은 일반적으로 제한적이다. BehaviorTree.CPP에서는 XML 파일의 교체를 통한 행동 트리의 동적 전환(switching)을 지원하지만, 실행 중인 노드의 상태를 보존하면서 트리 구조를 변경하는 연산은 추가적인 설계 고려를 요구한다.
8. 참고 문헌
- Colledanchise, M., & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Colledanchise, M., & Ögren, P. (2017). “How Behavior Trees Modularize Hybrid Control Systems and Generalize Sequential Behavior Compositions, the Subsumption Architecture, and Decision Trees.” IEEE Transactions on Robotics, 33(2), 372–389.
- Faconti, D. (2022). BehaviorTree.CPP 4.x Documentation. https://www.behaviortree.dev/
- Iovino, M., Scukins, E., Styrud, J., Ögren, P., & Smith, C. (2022). “A Survey of Behavior Trees in Robotics and AI.” Robotics and Autonomous Systems, 154, 104096.
- Macenski, S., Martín, F., White, R., & Clavero, J. G. (2020). “The Marathon 2: A Navigation System.” IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 2718–2725.
버전: 2026-03-31