Precondition의 스크립트 기반 조건 평가 (Precondition’s Script-Based Condition Evaluation)
1. 개요
Precondition 데코레이터의 스크립트 기반 조건 평가는 블랙보드 변수를 참조하는 표현식을 런타임에 해석하여, 자식 노드의 실행 여부를 결정하는 메커니즘이다. BehaviorTree.CPP 4.x의 내장 스크립트 엔진을 통해 구현되며, XML 행동 트리 정의에서 별도의 조건 노드 없이도 경량 조건을 인라인(inline)으로 표현할 수 있다.
2. 스크립트 엔진의 구조
2.1 표현식 파싱
스크립트 표현식은 행동 트리 로딩 시 파싱되어 내부 표현(abstract syntax tree)으로 변환된다. 매 tick에서의 평가는 파싱된 표현을 기반으로 수행되므로, 문자열 파싱에 의한 런타임 오버헤드가 최소화된다.
2.2 블랙보드 변수 참조
스크립트 내에서 블랙보드 변수는 이름으로 직접 참조된다.
_skipIf="battery_level < 0.2"
위 표현식에서 battery_level은 블랙보드의 키 이름이며, 런타임에 해당 키의 현재 값이 조회되어 비교 연산에 사용된다.
2.3 지원되는 데이터 타입
| 타입 | 스크립트 표현 예시 |
|---|---|
| 정수 | count > 5 |
| 부동소수점 | distance < 1.5 |
| 불리언 | is_armed == true |
| 문자열 | mode == "autonomous" |
3. 표현식 평가의 동작 규칙
3.1 평가 시점
스크립트 표현식은 데코레이터의 tick() 메서드 시작 시, 자식 노드를 tick하기 전에 평가된다. 이는 전처리(pre-processing) 단계에 해당한다.
3.2 평가 결과에 따른 분기
| 표현식 결과 | _skipIf | _failureIf | _successIf | _while |
|---|---|---|---|---|
| true | SKIPPED | FAILURE | SUCCESS | 자식 tick |
| false | 자식 tick | 자식 tick | 자식 tick | SKIPPED |
_skipIf와 _while은 의미론이 반대이다. _skipIf는 조건이 참이면 skip하고, _while은 조건이 참인 동안 실행한다.
4. 복합 표현식
4.1 논리 연산자의 사용
<Action ID="Navigate"
_skipIf="goal_reached == true || emergency_stop == true"/>
goal_reached가 참이거나 emergency_stop이 참이면 Navigate를 skip한다.
4.2 산술 표현식
<Action ID="ReduceSpeed"
_failureIf="current_speed < max_speed * 0.5"/>
일부 구현에서는 산술 연산도 지원한다.
5. 스크립트 평가의 성능
스크립트 표현식 평가의 계산 비용은 전용 조건 노드의 tick 비용보다 약간 높을 수 있으나, 노드 생성과 관리의 오버헤드가 제거되므로 전체적으로는 동등하거나 더 효율적이다. 간단한 블랙보드 값 비교의 경우 스크립트 방식이 더 경량이다.
6. 스크립트 표현식과 전용 조건 노드의 비교
| 특성 | 스크립트 표현식 | 전용 조건 노드 |
|---|---|---|
| 구현 위치 | XML 속성 | C++ 클래스 |
| 복잡도 | 간단한 비교/논리 | 임의의 복잡도 |
| 외부 데이터 접근 | 블랙보드만 | 토픽, 서비스, 파라미터 |
| 테스트 가능성 | 제한적 | 단위 테스트 가능 |
| 재사용성 | 인라인 (일회성) | 등록 후 재사용 |
| 가독성 | 짧은 조건에 적합 | 복잡한 조건에 적합 |
7. 설계 시 고려 사항
7.1 표현식 오류 처리
스크립트 표현식에 문법 오류가 있거나 참조하는 블랙보드 키가 존재하지 않는 경우, BehaviorTree.CPP는 예외를 발생시키거나 기본값을 사용한다. 행동 트리 로딩 시 표현식의 유효성을 사전에 검증하여야 한다.
7.2 디버깅의 어려움
인라인 스크립트 표현식은 전용 조건 노드에 비해 디버깅이 어렵다. 표현식 평가 결과의 로깅이 제한적이므로, 복잡한 조건이나 디버깅이 필요한 조건에는 전용 노드를 사용하는 것이 바람직하다.
8. 참고 문헌
- BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
- Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
| 버전 | 날짜 | 변경 사항 |
|---|---|---|
| v0.1 | 2026-04-05 | 초안 작성 |