Chapter 1299. BehaviorTree.CPP 라이브러리 아키텍처 (BehaviorTree.CPP Library Architecture)

Chapter 1299. BehaviorTree.CPP 라이브러리 아키텍처 (BehaviorTree.CPP Library Architecture)

1. 개요

BehaviorTree.CPP는 C++로 구현된 행동 트리 라이브러리로, 로봇 공학 분야에서 가장 널리 사용되는 행동 트리 프레임워크이다. Nav2(Navigation2), MoveIt2 등 주요 ROS2 패키지에서 행동 계획 및 임무 관리의 핵심 엔진으로 채택되고 있다. 본 장에서는 BehaviorTree.CPP의 소프트웨어 아키텍처, 핵심 클래스 계층, 노드 등록 및 생성 메커니즘, XML 파싱, 블랙보드 시스템, 로깅 인프라 등을 체계적으로 다룬다.

2. 라이브러리의 설계 철학

BehaviorTree.CPP는 다음 설계 원칙에 기반하여 개발되었다.

  1. XML 기반 행동 트리 정의: 행동 트리의 구조를 XML로 정의하여, 코드 재컴파일 없이 행동 로직을 변경할 수 있다.
  2. 타입 안전 블랙보드: 블랙보드 포트 시스템을 통해 노드 간 데이터 전달의 타입 안전성을 보장한다.
  3. 플러그인 아키텍처: 사용자 정의 노드를 플러그인으로 등록하여 라이브러리를 확장한다.
  4. 실시간 시각화: Groot2와의 연동을 통해 행동 트리의 실시간 모니터링과 편집을 지원한다.
  5. 경량성: 최소한의 외부 의존성으로 임베디드 시스템에서도 사용 가능하다.

3. 핵심 아키텍처 구성 요소

3.1 클래스 계층

BT::TreeNode (모든 노드의 기반)
├── BT::ControlNode (제어 노드)
│   ├── SequenceNode, FallbackNode, ParallelNode
│   ├── ReactiveSequence, ReactiveFallback
│   └── IfThenElse, WhileDoElse, Switch
├── BT::DecoratorNode (데코레이터 노드)
│   ├── InverterNode, ForceSuccessNode, ...
│   └── TimeoutNode, RetryNode, RepeatNode, ...
├── BT::ActionNodeBase (액션 노드)
│   ├── SyncActionNode
│   ├── StatefulActionNode
│   └── CoroActionNode
└── BT::ConditionNode (조건 노드)

3.2 핵심 컴포넌트

컴포넌트역할
BT::BehaviorTreeFactory노드 등록 및 트리 생성
BT::Tree행동 트리 인스턴스
BT::Blackboard노드 간 데이터 공유
BT::TreeNode모든 노드의 기반 클래스
BT::NodeConfiguration노드 설정 (포트, 블랙보드)

4. BehaviorTreeFactory

BehaviorTreeFactory는 행동 트리 시스템의 진입점으로, 노드 등록과 트리 생성을 담당한다.

BT::BehaviorTreeFactory factory;

// 노드 등록
factory.registerNodeType<MyAction>("MyAction");
factory.registerNodeType<MyCondition>("MyCondition");

// XML에서 트리 생성
auto tree = factory.createTreeFromText(xml_text);
// 또는 파일에서 생성
auto tree = factory.createTreeFromFile("tree.xml");

// 트리 실행
tree.tickWhileRunning();

5. Tree 객체

BT::Tree는 생성된 행동 트리의 인스턴스를 나타내며, tick 실행, halt, 블랙보드 접근 등의 인터페이스를 제공한다.

// 단일 tick
BT::NodeStatus status = tree.tickOnce();

// 완료될 때까지 반복 tick
BT::NodeStatus status = tree.tickWhileRunning();

// 트리 halt
tree.haltTree();

// 루트 블랙보드 접근
auto blackboard = tree.rootBlackboard();

6. Blackboard 시스템

블랙보드는 행동 트리 내의 노드 간 데이터를 공유하는 키-값 저장소이다.

auto bb = BT::Blackboard::create();
bb->set("target_x", 5.0);
bb->set("mode", std::string("autonomous"));

double x;
bb->get("target_x", x);

7. XML 파싱 엔진

BehaviorTree.CPP의 XML 파서는 BTCPP_format="4" 형식의 XML을 파싱하여 행동 트리 구조를 생성한다.

<root BTCPP_format="4">
    <BehaviorTree ID="MainTree">
        <Sequence>
            <Action ID="MoveBase" goal="{target}"/>
            <Action ID="GraspObject"/>
        </Sequence>
    </BehaviorTree>
</root>

8. 로깅 및 관찰 인프라

도구기능
BT::FileLogger2로그 파일 기록
BT::PublisherZMQGroot2 실시간 연동
BT::TreeObserver노드 상태 전환 통계
BT::MinitraceLoggerChrome Tracing 형식 로그

9. 버전 변천

버전주요 변경
3.x기본 행동 트리, XML 지원
4.x스크립트 엔진, SKIPPED 상태, SkipUnlessUpdated, 개선된 포트 시스템

10. 설계 시 고려 사항

10.1 ROS2와의 통합

BehaviorTree.ROS2 패키지를 통해 ROS2 액션, 서비스, 토픽 기반 노드를 기본 지원한다. RosActionNode, RosServiceNode, RosTopicSubNode 등의 기반 클래스가 제공된다.

10.2 스레드 안전성

BehaviorTree.CPP의 tick은 기본적으로 단일 스레드에서 실행된다. ROS2 콜백과의 데이터 공유 시 뮤텍스를 통한 동기화가 필요하다.

11. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
  • BehaviorTree.CPP GitHub. https://github.com/BehaviorTree/BehaviorTree.CPP

버전날짜변경 사항
v0.12026-04-05초안 작성