Behavior Tree란?
**행동 트리(Behavior Tree, BT)**는 로봇·게임 AI에서 행동 순서와 분기를 트리로 표현하는 방식입니다. 상태 기계(FSM)처럼 상태 전이를 일일이 그리기보다, 모듈화된 행동(리프 노드) 을 합성 노드(컴포지트) 로 묶어 재사용·확장하기 쉽습니다. ROS 2 Nav2도 내비게이션 흐름을 BT XML로 정의합니다.
구조
- 루트: 트리 최상단. 여기서 주기적으로 틱(tick) 이 내려갑니다.
- 내부 노드(컴포지트·데코레이터): 자식을 어떻게 실행할지 결정.
- 리프(Leaf): 실제 조건·동작(예:
NavigateToPose,IsBatteryLow).
노드 실행 결과(3가지)
| 상태 | 의미 |
|---|---|
| Success | 목표 달성 또는 조건 만족 |
| Failure | 실패 또는 조건 불만족 |
| Running | 아직 진행 중(비동기 작업). 다음 틱까지 같은 노드에서 재개 |
대표 컴포지트
Sequence (순차)
자식을 왼쪽→오른쪽 순으로 실행. 한 자식이 Failure면 전체 Failure, 모두 Success면 Success. 중간에 Running이면 전체 Running.
→ “A 그리고 B 그리고 C” 모두 성공해야 할 때.
Selector / Fallback (선택)
자식을 순서대로 실행. 한 자식이 Success면 전체 Success. 모두 Failure면 Failure. Running이면 Running.
→ “A 아니면 B 아니면 C” 중 하나만 성공하면 될 때(대안 시도).
Parallel (병렬)
자식 여러 개를 동시에 진행. 정책에 따라 “N개 성공 시 성공” 등으로 종료 조건을 둡니다(Nav2·라이브러리마다 세부 규칙이 다름).
틱(Tick)
루트에서 한 번 내려가며 노드를 평가하는 주기를 틱이라고 합니다. Running인 노드는 다음 틱에서 이어서 실행됩니다. 따라서 BT는 이벤트 루프와 잘 맞고, 장시간 동작(경로 추종 등)을 리프에서 Running으로 표현합니다.
데코레이터(간단히)
한 자식을 감싸 동작을 바꿉니다. 예: Inverter(성공↔실패 반전), Repeat, Timeout, ForceSuccess 등.
FSM과 비교(직관)
- FSM: 상태와 전이가 중심. 복잡해지면 전이가 많아짐.
- BT: 계층적 “시도 순서” 가 중심. 새 행동을 리프·서브트리로 추가하기 쉬움.
ROS / Nav2와의 연결
Nav2는 BehaviorTree.CPP 등으로 BT를 실행하고, XML에 플래너·컨트롤러·복구 행동을 노드로 매핑합니다. “목표까지 가기 → 막히면 회전/후진” 같은 흐름을 코드가 아닌 트리 정의로 바꿀 수 있습니다.