And Brain said,
Behavior Tree, 뿌리에서 잎까지. 피어나는 판단의 미학 - 설계 원칙과 분석 본문
Behavior Tree, 뿌리에서 잎까지. - 피어나는 판단의 미학
개요
설계 원칙과 분석
Behavior Tree(BT)는 단순한 설계 구조로 다양한 상황을 효과적으로 제어할 수 있지만, 잘 설계된 트리는 다음과 같은 원칙을 따라야 합니다. 이 장에서는 BT 설계의 기본 원칙과 이를 실현하는 방법에 대해 설명합니다.
1. 캡슐화 (Encapsulation)
각 노드는 독립적인 단위로 동작해야 합니다. 노드의 내부 구현은 다른 노드와 독립적이어야 하며, 노드 간의 상호작용은 오직 부모-자식 관계를 통해 이루어져야 합니다.
2. 재사용성 (Reusability)
BT의 각 구성 요소는 다른 시나리오에서 재사용 가능해야 합니다. 일반적인 행동(예: 장애물 탐지, 목표로 이동)은 별도의 하위 트리로 구현하여 재활용할 수 있어야 합니다.
3. 가독성 (Readability)
트리 구조는 시각적으로 직관적이고 이해하기 쉬워야 하고, 각 노드의 역할이 명확하게 정의되어 있어야 합니다.
간결한 노드 이름을 사용: SearchObject, GrabObject 등.
상위 레벨 행동을 단순하게 표현: Root → Search → Grab → Move.
4. 확장성 (Scalability)
트리는 작은 단위로 설계되어야 하며, 새로운 노드를 쉽게 추가할 수 있어야 합니다. 기존 구조를 변경하지 않고 새로운 기능을 추가하는 것이 중요합니다.
새로운 행동은 별도의 하위 트리(Subtree)로 설계하여 기존 트리에 추가.
5. 실패 처리 (Failure Handling)
트리는 실패를 허용하고 이를 처리할 수 있어야 합니다. 실패한 작업에 대한 대안을 제공하거나 트리를 초기 상태로 복구해야 합니다.
Fallback 노드 사용: 작업 실패 시 대체 동작을 실행.
Retry 메커니즘: 실패한 작업을 일정 횟수 재시도.
6. 상태 유지 (State Management)
노드는 외부 상태와 상호작용할 수 있어야 하지만, 상태 변경은 최소화해야 합니다. 노드는 가능한 한 상태 비의존적으로 설계해야 합니다.
조건 노드와 상태 노드 분리: BatteryLow는 조건 확인만 수행.
전역 상태 관리: 공통적으로 사용하는 상태(예: 목표 위치)를 전역으로 저장.
7. 실행 시간 최적화 (Runtime Efficiency)
트리의 실행은 최소한의 자원으로 이루어져야 합니다. 불필요한 계산을 방지하고, 실행 중인 노드만 활성화해야 합니다.
Tick 최적화: 실행 중인 노드만 Tick 신호를 받아야 합니다.
Lazy Evaluation: 필요한 시점에만 노드를 평가.
그럼, 로봇이 물체를 탐지하고 집은 후 목표 위치로 이동한다는 시나리오를 가정해볼까요. 아마 이 상황을 위해 BT 설계 원칙을 반영하여 설계한다면, 아래와 같을 것입니다.
Root (Sequence)
├── SearchAndRetrieve (Fallback)
│ ├── ObjectDetected (Condition)
│ └── SearchObject (Action)
├── GrabObject (Action)
├── AvoidObstacle (Fallback)
│ ├── ObstacleDetected (Condition)
│ └── Avoid (Action)
└── MoveToTarget (Sequence)
├── BatteryCheck (Condition)
└── NavigateToTarget (Action)
마지막으로, 설계한 Behavior Tree를 분석해봅시다. 잘 설계된 BT는 효율성(Efficiency), 안전성(Safety), 그리고 견고성(Robustness)을 제공할 수 있도록 설계됩니다.
효율성(Efficiency) 분석
SearchAndRetrieve는 ObjectDetected 조건을 먼저 확인하고 실패 시에만 SearchObject를 실행합니다. 불필요한 탐색 작업을 방지하여 효율성을 높임.
안전성(Safety) 분석
Fallback을 통한 안전성 확보: SearchAndRetrieve와 AvoidObstacle 노드는 Fallback 구조를 사용하여 실패 시 대체 동작을 실행합니다. 장애물이 감지되지 않을 경우에도 Avoid 동작이 실행되어 안전한 이동을 보장합니다.
BatteryCheck 조건: 배터리가 부족하면 NavigateToTarget이 실행되지 않아 안전하게 시스템을 중단할 수 있습니다.
하지만 이 설계 구조상, 배터리 상태가 부족한 경우에 충전 스테이션으로 이동하는 동작을 추가한다면 안정성이 더 높아질 수 있습니다.
견고성(Robustness) 분석
Retry 및 Timeout이 없음: GrabObject나 NavigateToTarget에서 실패 시 재시도 동작이 없습니다. 이는 실행 실패 시 트리가 종료될 위험을 내포합니다.
분석을 통해, 더 개선된 BT 구조를 만들어봅시다. 개선된 설계는 아래와 같을 것입니다.
Root (Sequence)
├── SearchAndRetrieve (Fallback)
│ ├── ObjectDetected (Condition)
│ └── SearchObject (Action)
├── Decorator (Retry=3)
│ └── GrabObject (Action)
├── AvoidObstacle (Fallback)
│ ├── ObstacleDetected (Condition)
│ └── Avoid (Action)
└── MoveToTarget (Sequence)
├── BatteryCheck (Condition)
├── Decorator(Timeout=5s)
│ └── NavigateToTarget (Action)
└── MoveToChargingStation (Action)
다음 3가지를 추가하여 우리의 트리를 개선해보았습니다.
Retry 추가: 물체 잡기 실패 시 3번까지 재시도.
Timeout 추가: 이동 작업이 제한 시간 내 완료되지 않으면 실패 처리.
충전 행동 추가: 배터리 부족 시 충전소로 이동.
이 장에서는, 여러분들의 Behavior Tree를 유지보수성, 확장성, 재사용성을 갖춘 강력한 구조로 갖추어줄 원칙과 분석에 대해서 살펴보았습니다. 다음 장에서는, BT의 구조적 근본과 활용가능한 가능성에 대해서 알아보겠습니다.
'AI' 카테고리의 다른 글
Behavior Tree, 뿌리에서 잎까지. 피어나는 판단의 미학 - 개요 (0) | 2024.12.10 |
---|