Behavior Tree
- 로봇의 행동을 트리 구조로 표현하는 의사 결정 시스템
- BT가 로봇의 행동을 전체적으로 제어하는 두뇌 역할
ROS와 상호 작용하는 데 권장되는 방법은 rclcpp_action을 사용
ㄴ 해당 API는 비동기식이므로 사용자는 별도의 스레드를 생성할 필요가 없음
1. Behavior Tree의 기본 구성 요소
- Behavior Tree를 구성하는 가장 기본적인 3가지 노드
1-1) Action Node
- 실제 행동을 수행하는 노드
(ex: 로봇 이동, 팔 동작, 시스템 명령)
1-2) Condition Node
- 상태/조건을 검사하는 노드
(ex: 공이 가까운가?, 배터리 충분한가?)
1-3) Control Node
- 트리의 실행 흐름을 제어하는 노드
➡ 여러 자식을 가지며, 어떤 자식을 언제 실행할지 결정
2. Control Node의 종류
2-1) Sequence (순차적 실행, AND)
- 앞 노드가 SUCCESS여야 다음 실행
- 하나라도 FAILURE면 즉시 종료

- xml 형식
<root BTCPP_format="4" >
<BehaviorTree ID="MainTree">
<Sequence name="root_sequence">
<CheckBattery name="check_battery"/>
<OpenGripper name="open_gripper"/>
<ApproachObject name="approach_object"/>
<CloseGripper name="close_gripper"/>
</Sequence>
</BehaviorTree>
</root>
2-2) Fallback / Selector (OR)
- 왼쪽부터 실행
- 하나라도 SUCCESS면 멈춤
- 모두 실패하면 FAILURE
2-3) Parallel
- 여러 자식을 동시에 실행
- 특정 SUCCESS/FAILURE 수 기준으로 종료
3. Decorator Node
- 자식 노드를 딱 하나만 감싸는 특수 노드
ㄴ 자식의 실행 규칙을 변형하는 역할
대표 데코레이터
ㄴ Inverter: 성공/실패 반전
ㄴ Repeat / Retry: 반복 or 재시도
ㄴ Delay / Timeout: 시간 제어
ㄴ RunOnce: 한 번만 실행
데코레이터 참조 문서 : https://www.behaviortree.dev/docs/nodes-library/DecoratorNode
4. BT 실행 방식 (Tick 방식)
- tick 신호를 수신한 모든 TreeNode는 콜백을 실행
- 이 콜백은 다음 중 하나를 반환해야 함
ㄴ SUCCESS
ㄴ FAILURE
ㄴ RUNNING
Behavior Tree의 장점 (ROS가 채택한 이유)
- 순서 + 조건 처리가 정말 깔끔함
- 중첩/재사용 용이
- ROS2 Navigation2가 BT 기반 (Nav2의 핵심)
- Groot GUI로 직관적으로 작성 가능
참조: https://www.behaviortree.dev/docs/learn-the-basics/BT_basics