396.47 행동 트리 기반 유연한 임무 제어

396.47 행동 트리 기반 유연한 임무 제어

1. 유연한 임무 제어의 필요성

자율 로봇 시스템이 복잡하고 동적인 환경에서 임무를 수행하기 위해서는, 사전에 정의된 고정적 행동 시퀀스를 넘어 실시간으로 변화하는 상황에 적응하는 유연한 임무 제어(Flexible Mission Control) 메커니즘이 필수적이다. 행동 트리(Behavior Tree, BT)는 이러한 유연성을 구조적으로 보장하는 대표적 프레임워크로서, 모듈성(modularity), 반응성(reactivity), 확장성(scalability)을 동시에 제공한다. 본 절에서는 행동 트리의 구조적 특성이 어떻게 유연한 임무 제어를 가능하게 하는지를 체계적으로 분석한다.

2. 행동 트리의 반응성과 적응적 실행

2.1 틱(Tick) 기반 실행 메커니즘

행동 트리의 핵심적 실행 메커니즘은 틱(tick) 기반 순환 평가이다. 루트 노드에서 주기적으로 발생하는 틱 신호가 트리를 순회하면서, 각 노드의 상태를 매 주기마다 재평가한다. 이때 각 노드는 다음 세 가지 상태 중 하나를 반환한다:

\text{Status}(n_i) \in \{\texttt{SUCCESS}, \texttt{FAILURE}, \texttt{RUNNING}\}

여기서 n_i는 트리 내의 i번째 노드를 나타낸다. 이 틱 기반 메커니즘은 상태 머신(Finite State Machine, FSM)과 달리 명시적 전이(transition) 정의 없이도 환경 변화에 대한 즉각적 반응을 가능하게 한다.

2.2 반응적 시퀀스와 반응적 폴백

반응성을 극대화하기 위해 **반응적 시퀀스(Reactive Sequence)**와 반응적 폴백(Reactive Fallback) 노드가 활용된다. 일반 시퀀스 노드가 자식 노드를 순차적으로 실행하되, 이전에 성공한 노드를 재평가하지 않는 반면, 반응적 시퀀스 노드는 매 틱마다 첫 번째 자식 노드부터 재평가를 수행한다. 이를 형식적으로 표현하면 다음과 같다:

\text{ReactiveSequence}(c_1, c_2, \ldots, c_n) = \begin{cases} \texttt{SUCCESS} & \text{if } \forall i, \; \text{Status}(c_i) = \texttt{SUCCESS} \\ \texttt{FAILURE} & \text{if } \exists i, \; \text{Status}(c_i) = \texttt{FAILURE} \\ \texttt{RUNNING} & \text{otherwise} \end{cases}

반응적 폴백(Reactive Fallback)은 매 틱마다 첫 번째 자식부터 재평가하여, 우선순위가 높은 조건이 충족되면 즉시 해당 분기로 전환한다:

\text{ReactiveFallback}(c_1, c_2, \ldots, c_n) = \begin{cases} \texttt{SUCCESS} & \text{if } \exists i, \; \text{Status}(c_i) = \texttt{SUCCESS} \\ \texttt{FAILURE} & \text{if } \forall i, \; \text{Status}(c_i) = \texttt{FAILURE} \\ \texttt{RUNNING} & \text{otherwise} \end{cases}

이러한 반응적 노드 구조는 로봇이 임무 수행 중 환경 변화(장애물 출현, 배터리 부족, 통신 두절 등)를 감지하고 즉시 대응 행동으로 전환하는 것을 가능하게 한다.

3. 조건-행동 쌍(Condition-Action Pair) 기반 임무 구조화

3.1 조건 노드를 활용한 상황 인식 통합

행동 트리에서 **조건 노드(Condition Node)**는 환경 상태를 평가하는 함수로 작동하며, 행동 노드(Action Node)와 결합하여 **조건-행동 쌍(Condition-Action Pair)**을 형성한다. 이 구조는 다음과 같이 표현된다:

\text{Sequence}\bigl(\text{Condition}(\phi), \text{Action}(a)\bigr)

여기서 \phi는 환경 상태에 대한 논리적 명제(predicate)이고, a는 수행할 행동이다. 조건 \phi가 참(TRUE)일 때만 행동 a가 실행되며, 반응적 시퀀스 내에서는 행동 실행 중에도 조건이 매 틱마다 재검사된다. 이를 통해 전제 조건 위반 시 자동 중단(preemption) 메커니즘이 트리 구조 자체에 내재화된다.

3.2 다중 조건 분기를 통한 상황별 행동 선택

폴백(Fallback) 노드와 조건-행동 쌍을 조합하면, 다중 조건에 따른 상황별 행동 선택 구조를 유연하게 설계할 수 있다:

\text{Fallback}\Bigl(\text{Seq}(\phi_1, a_1), \; \text{Seq}(\phi_2, a_2), \; \ldots, \; \text{Seq}(\phi_k, a_k), \; a_{\text{default}}\Bigr)

이 구조에서 폴백 노드는 자식을 순서대로 평가하며, 첫 번째로 조건이 충족되는 분기의 행동을 실행한다. 마지막 자식 a_{\text{default}}는 모든 조건이 실패할 경우의 기본 행동(default behavior)을 정의한다. 이 패턴은 우선순위 기반 행동 선택(priority-based behavior selection)을 직관적으로 구현할 수 있게 한다.

4. 서브트리(Subtree) 기반 모듈형 임무 구성

4.1 서브트리의 정의와 재사용

행동 트리의 핵심적 모듈성은 서브트리(Subtree) 개념에 의해 실현된다. 특정 임무의 부분 행동을 독립적인 서브트리로 캡슐화하면, 이를 상위 트리 내의 임의의 위치에 삽입하여 재사용할 수 있다. 서브트리 T_s는 다음과 같이 정의된다:

T_s = (V_s, E_s, r_s)

여기서 V_s는 서브트리의 노드 집합, E_s는 간선 집합, r_s는 서브트리의 루트 노드이다. 상위 트리 T에 서브트리 T_s를 삽입하는 연산은 다음과 같이 정의된다:

T' = \text{Insert}(T, n_p, T_s)

여기서 n_p는 상위 트리에서 서브트리가 삽입되는 부모 노드이다. 이 연산은 n_p의 자식으로 r_s를 추가함으로써 수행되며, 기존 트리의 다른 부분에 영향을 주지 않는다.

4.2 임무 라이브러리와 동적 조립

서브트리의 모듈성을 활용하면, 사전에 검증된 행동 서브트리들의 라이브러리를 구축하고, 임무 요구사항에 따라 이를 동적으로 조립(assembly)하여 복합 임무를 구성할 수 있다. 이 접근법은 다음과 같은 이점을 제공한다:

특성설명
재사용성(Reusability)검증된 서브트리를 다양한 임무에 반복 활용
유지보수성(Maintainability)개별 서브트리 단위의 독립적 수정과 테스트
조합 유연성(Compositional Flexibility)임무 요구에 따른 동적 트리 재구성
점진적 개발(Incremental Development)서브트리 단위의 단계적 시스템 확장

5. 블랙보드(Blackboard) 패턴을 통한 데이터 공유

5.1 블랙보드 메커니즘의 구조

행동 트리의 노드 간 데이터 공유를 위해 블랙보드(Blackboard) 패턴이 널리 활용된다. 블랙보드는 키-값(key-value) 저장소로서, 트리 내의 모든 노드가 공유 상태 정보에 접근할 수 있도록 한다. 블랙보드 \mathcal{B}는 다음과 같이 정의된다:

\mathcal{B}: \mathcal{K} \rightarrow \mathcal{V}

여기서 \mathcal{K}는 키(key)의 집합이고, \mathcal{V}는 값(value)의 집합이다. 각 노드는 블랙보드에 대해 읽기(read) 또는 쓰기(write) 연산을 수행한다:

\text{Read}: n_i \times \mathcal{K} \rightarrow \mathcal{V}, \quad \text{Write}: n_i \times \mathcal{K} \times \mathcal{V} \rightarrow \mathcal{B}'

5.2 포트(Port) 기반 데이터 흐름

BehaviorTree.CPP 프레임워크에서는 블랙보드와 함께 **입력 포트(Input Port)**와 출력 포트(Output Port) 개념을 도입하여, 노드 간 데이터 의존성을 명시적으로 선언한다. 노드 n_i의 입력 포트 p^{\text{in}}_j는 블랙보드의 특정 키에 바인딩되며, 출력 포트 p^{\text{out}}_k는 실행 결과를 블랙보드에 기록한다:

p^{\text{in}}_j(n_i) \leftarrow \mathcal{B}[k_j], \quad \mathcal{B}[k_k] \leftarrow p^{\text{out}}_k(n_i)

이 메커니즘은 노드 간 직접적 결합(coupling) 없이 데이터 흐름을 관리할 수 있게 하며, 서브트리의 독립성을 더욱 강화한다.

6. 데코레이터(Decorator) 노드를 활용한 행동 수정

6.1 데코레이터의 역할과 유형

데코레이터(Decorator) 노드는 단일 자식 노드의 행동을 감싸(wrap) 그 실행 방식을 수정하는 역할을 한다. 데코레이터는 자식 노드의 반환 상태를 변환하거나, 실행 횟수를 제어하거나, 시간 제약을 부과하는 등 다양한 방식으로 행동을 조절한다. 주요 데코레이터 유형은 다음과 같다:

데코레이터 유형기능
Inverter자식의 SUCCESS/FAILURE 상태를 반전
Repeat(N)자식 노드를 N회 반복 실행
Retry(N)자식이 FAILURE를 반환할 경우 최대 N회 재시도
Timeout(\Delta t)자식 실행이 \Delta t 시간을 초과하면 FAILURE 반환
ForceSuccess자식의 반환 상태와 무관하게 항상 SUCCESS 반환
ForceFailure자식의 반환 상태와 무관하게 항상 FAILURE 반환

6.2 데코레이터의 형식적 표현

데코레이터 D는 자식 노드 c의 상태를 입력으로 받아 변환된 상태를 출력하는 함수로 정의된다:

D: \{\texttt{SUCCESS}, \texttt{FAILURE}, \texttt{RUNNING}\} \rightarrow \{\texttt{SUCCESS}, \texttt{FAILURE}, \texttt{RUNNING}\}

예를 들어, Inverter 데코레이터는 다음과 같이 정의된다:

D_{\text{inv}}(s) = \begin{cases} \texttt{FAILURE} & \text{if } s = \texttt{SUCCESS} \\ \texttt{SUCCESS} & \text{if } s = \texttt{FAILURE} \\ \texttt{RUNNING} & \text{if } s = \texttt{RUNNING} \end{cases}

Timeout 데코레이터는 시간 제약을 부과하여 실시간 임무 관리에서 특히 유용하게 활용된다:

D_{\text{timeout}}(s, t) = \begin{cases} s & \text{if } t < \Delta t \\ \texttt{FAILURE} & \text{if } t \geq \Delta t \end{cases}

여기서 t는 자식 노드의 누적 실행 시간이다.

7. 동적 트리 수정(Dynamic Tree Modification)

7.1 런타임 트리 재구성

행동 트리의 유연성을 극대화하는 핵심 기법은 **런타임 트리 수정(runtime tree modification)**이다. 임무 수행 중 환경 변화나 새로운 목표 발생에 따라, 트리의 구조 자체를 동적으로 변경할 수 있다. 이 과정은 다음과 같은 연산들로 구성된다:

삽입(Insertion): 새로운 서브트리 T_{\text{new}}를 기존 트리의 특정 위치에 추가한다:

T_{t+1} = T_t \oplus (n_p, T_{\text{new}})

제거(Removal): 불필요한 서브트리를 제거한다:

T_{t+1} = T_t \ominus T_{\text{old}}

교체(Replacement): 기존 서브트리를 새로운 서브트리로 교체한다:

T_{t+1} = T_t[T_{\text{old}} \mapsto T_{\text{new}}]

7.2 계획 기반 트리 생성

자동 계획(automated planning) 시스템과의 연계를 통해, 주어진 목표와 현재 환경 상태로부터 행동 트리를 자동 생성하는 접근이 연구되고 있다. 이 방법에서는 STRIPS(Stanford Research Institute Problem Solver) 형식의 행동 명세로부터 다음과 같은 매핑을 수행한다:

f_{\text{plan}}: (\mathcal{G}, \mathcal{S}_0, \mathcal{A}) \rightarrow T

여기서 \mathcal{G}는 목표 상태 집합, \mathcal{S}_0는 초기 상태, \mathcal{A}는 가용 행동 집합이다. Colledanchise and Ögren (2018)은 이러한 자동 생성 기법을 통해 최적 행동 트리를 합성하는 알고리즘을 제안하였다.

8. 병렬 실행과 동시 임무 제어

8.1 병렬 노드(Parallel Node)의 활용

행동 트리의 병렬(Parallel) 노드는 다수의 자식 노드를 동시에 실행하며, 성공 또는 실패 기준을 매개변수로 설정한다. 성공 임계값 M을 갖는 병렬 노드의 의미론은 다음과 같다:

\text{Parallel}_M(c_1, \ldots, c_n) = \begin{cases} \texttt{SUCCESS} & \text{if } \lvert\{i : \text{Status}(c_i) = \texttt{SUCCESS}\}\rvert \geq M \\ \texttt{FAILURE} & \text{if } \lvert\{i : \text{Status}(c_i) = \texttt{FAILURE}\}\rvert > n - M \\ \texttt{RUNNING} & \text{otherwise} \end{cases}

이 구조는 동시 감시(concurrent monitoring), 동기화(synchronization), 독립 임무의 병렬 수행 등 다양한 유연한 임무 패턴을 지원한다.

8.2 감시-행동 병렬 패턴

가장 대표적인 병렬 활용 패턴은 감시-행동 병렬(Monitor-Action Parallel) 구조이다. 한 분기에서 환경 조건을 지속적으로 감시하고, 다른 분기에서 주요 행동을 수행한다:

\text{Parallel}_1\bigl(\text{Monitor}(\phi_{\text{safety}}), \; \text{Action}(a_{\text{main}})\bigr)

감시 노드가 안전 조건 \phi_{\text{safety}} 위반을 탐지하여 FAILURE를 반환하면, 병렬 노드 전체가 FAILURE가 되어 상위 폴백 노드에서 비상 행동으로 전환된다. 이 패턴은 안전-임계적(safety-critical) 임무에서 핵심적 역할을 수행한다.

9. 사례 연구: 자율 탐색-구조 임무

자율 로봇의 탐색-구조(search-and-rescue) 임무를 행동 트리로 설계하면, 환경 불확실성에 대응하는 유연한 제어 구조를 구현할 수 있다. 다음은 이 임무의 행동 트리 구조를 개념적으로 나타낸 것이다:

Root [Fallback]
├── [ReactiveSequence] 비상 대응
│   ├── [Condition] 배터리 임계치 이하?
│   └── [Action] 귀환 행동
├── [ReactiveSequence] 구조 대상 발견 시 대응
│   ├── [Condition] 구조 대상 탐지?
│   ├── [Action] 접근 및 위치 보고
│   └── [Action] 구조 지원 요청
├── [Sequence] 탐색 수행
│   ├── [Action] 다음 탐색 지점 계산
│   ├── [Action] 경로 추종
│   └── [Action] 센서 스캔 실행
└── [Action] 대기(Idle)

이 구조에서 폴백 노드의 자식은 우선순위 순서로 배치된다. 배터리 부족이 감지되면 가장 높은 우선순위로 귀환 행동이 실행되고, 구조 대상이 탐지되면 탐색을 중단하고 구조 대응으로 전환된다. 어떤 조건도 충족되지 않으면 기본 탐색 행동이 수행되며, 모든 탐색 지점을 완료하면 대기 상태로 진입한다.

10. 행동 트리 기반 유연성의 이론적 근거

10.1 안전성과 활동성 보장

행동 트리의 유연한 임무 제어에서 두 가지 핵심적 속성은 **안전성(safety)**과 **활동성(liveness)**이다. 안전성은 시스템이 금지된 상태에 도달하지 않음을 보장하며, 활동성은 시스템이 목표 상태에 결국 도달함을 보장한다.

안전성 속성은 반응적 폴백의 최상위에 안전 조건을 배치함으로써 구조적으로 보장된다:

\text{Safe}(T) \iff \forall t, \; \mathcal{S}(t) \notin \mathcal{S}_{\text{forbidden}}

활동성 속성은 적절한 데코레이터(Retry, Repeat)와 함께 행동 노드의 진행성(progress)을 보장하는 전제 조건에 의해 성립된다:

\text{Live}(T) \iff \forall t, \; \exists t' > t \text{ s.t. } \mathcal{S}(t') \in \mathcal{S}_{\text{goal}}

Colledanchise and Ögren (2018)은 행동 트리가 적절히 설계되면, 이러한 안전성과 활동성을 형식적으로 증명할 수 있음을 보였다.

10.2 확장성과 구성성

행동 트리의 핵심적 이론적 강점은 **구성성(compositionality)**이다. 두 행동 트리가 각각 안전하고 활동적이면, 이들을 조합하여 생성된 트리 역시 안전성과 활동성을 유지한다. 이 속성은 모듈형 설계의 신뢰성을 이론적으로 뒷받침하며, 대규모 임무 시스템의 점진적이고 검증 가능한 구축을 가능하게 한다.

11. 참고 문헌

  • Colledanchise, M. and Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • Iovino, M., Scukins, E., Styrud, J., Ögren, P., and Smith, C. (2022). “A Survey of Behavior Trees in Robotics and AI.” Robotics and Autonomous Systems, 154, 104096.
  • Faconti, D. (2019). BehaviorTree.CPP: A C++ library for behavior trees. GitHub Repository.
  • Colledanchise, M. and Ö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.
  • Marzinotto, A., Colledanchise, M., Smith, C., and Ö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.

본 절은 로봇공학 서적 Volume 9, Part 53, Chapter 396의 일부로 작성되었다. v1.0