1292.102 이벤트 주도 실행 의미론
1. 이벤트 주도 실행 의미론의 정의
이벤트 주도 실행 의미론(event-driven execution semantics)이란, 행동 트리의 tick이 고정된 주기에 따라 수행되는 것이 아니라, 특정 이벤트의 발생에 의해 촉발되어 수행되는 실행 모델이다. 이벤트 주도 실행에서 행동 트리는 관련 이벤트가 발생할 때에만 tick되며, 이벤트가 없는 기간에는 트리의 평가가 수행되지 않는다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 주기적 실행과 이벤트 주도 실행의 비교
전통적인 행동 트리의 실행은 고정된 주기(예: 10Hz, 100Hz)로 tick을 반복하는 주기적 실행(periodic execution) 모델을 따른다. 이벤트 주도 실행은 이와 대비되는 패러다임이다.
| 비교 항목 | 주기적 실행 | 이벤트 주도 실행 |
|---|---|---|
| Tick 촉발 조건 | 고정 주기의 타이머 | 이벤트 발생 |
| Tick 빈도 | 일정 (설정된 주파수) | 가변 (이벤트 빈도에 비례) |
| 유휴 시 CPU 사용 | 트리 전체를 반복 평가 | 평가 없음 (유휴 대기) |
| 응답 지연 | 최대 1 tick 주기 | 이벤트 처리 지연만큼 |
| 구현 복잡도 | 낮음 | 높음 (이벤트 관리 필요) |
3. 이벤트 주도 실행의 동작 원리
이벤트 주도 실행에서 행동 트리는 이벤트 루프(event loop)와 결합되어 동작한다. 이벤트 루프는 이벤트 큐에서 이벤트를 수신하고, 해당 이벤트와 관련된 트리의 부분 또는 전체를 tick한다.
function event_driven_execution(tree):
while not shutdown:
event = wait_for_event() // 블로킹 대기
// 이벤트에 의해 tick 촉발
if event.requires_full_tick:
tree.root.tick()
else:
// 관련 서브트리만 tick (선택적 최적화)
affected_subtree = find_affected_subtree(event)
affected_subtree.tick()
4. 이벤트의 유형
행동 트리의 이벤트 주도 실행에서 tick을 촉발하는 이벤트는 다음과 같이 분류된다.
| 이벤트 유형 | 설명 | 예시 |
|---|---|---|
| 상태 변경 이벤트 | 블랙보드 값의 변경 | 목표 좌표 갱신, 장애물 감지 |
| 완료 이벤트 | 비동기 작업의 완료 | 네비게이션 완료, 파지 완료 |
| 외부 입력 이벤트 | 센서 데이터 수신, 사용자 명령 | LiDAR 데이터 갱신, 정지 명령 |
| 타이머 이벤트 | 지정된 시간의 경과 | 타임아웃, 주기적 점검 |
| 오류 이벤트 | 시스템 오류 발생 | 통신 실패, 하드웨어 오류 |
5. 블랙보드 이벤트와 반응형 실행
BehaviorTree.CPP 4.x에서는 블랙보드 항목의 변경을 감지하는 이벤트 메커니즘을 제공한다. 노드는 블랙보드의 특정 키에 대한 변경 리스너를 등록할 수 있으며, 해당 키의 값이 변경되면 이벤트가 발생하여 관련 서브트리의 재평가를 촉발한다 (Faconti, 2024).
function setup_blackboard_event(tree, key):
tree.blackboard.on_change(key, callback):
// 블랙보드 값 변경 시 트리 tick 촉발
tree.root.tick()
6. 이벤트 주도 실행과 조건부 tick
이벤트 주도 실행의 핵심 최적화는 조건부 tick(conditional tick)이다. 이벤트에 의해 영향을 받는 노드만을 선택적으로 tick함으로써, 불필요한 노드 평가를 완전히 제거할 수 있다.
Fallback
├─ Sequence
│ ├─ Condition [battery_ok] ← battery 이벤트에 반응
│ └─ Action [Navigate]
└─ Action [ReturnToBase]
battery 값이 변경되는 이벤트가 발생하면 battery_ok 조건 노드를 포함하는 서브트리만 재평가하면 되며, battery와 무관한 서브트리의 평가는 생략된다.
7. 이벤트 주도 실행의 구현 고려 사항
7.1 이벤트 우선순위
다수의 이벤트가 동시에 발생하는 경우, 이벤트의 우선순위에 따라 처리 순서를 결정해야 한다. 안전 관련 이벤트는 최우선으로 처리되어야 한다.
7.2 이벤트 병합
동일한 블랙보드 키에 대한 다수의 변경 이벤트가 짧은 시간 내에 발생하는 경우, 이벤트를 병합(coalescing)하여 불필요한 다중 tick을 방지할 수 있다.
7.3 이벤트 누락 방지
이벤트가 처리되기 전에 새로운 이벤트가 발생하는 경우, 이벤트 큐의 관리를 통해 이벤트 누락을 방지해야 한다.
| 고려 사항 | 해결 방안 |
|---|---|
| 이벤트 폭주 | 이벤트 병합, 디바운싱(debouncing) |
| 처리 순서 보장 | 우선순위 큐 사용 |
| 이벤트 누락 | 큐 기반 이벤트 버퍼링 |
| 결정론 보장 | 이벤트 처리 순서의 결정론적 정의 |
8. 이벤트 주도 실행의 장점
| 장점 | 설명 |
|---|---|
| 계산 효율 | 변경이 없는 기간에 CPU 자원을 소비하지 않음 |
| 응답성 | 이벤트 발생 즉시 반응 가능 |
| 확장성 | 트리의 크기가 증가해도 이벤트당 비용 일정 |
| 전력 효율 | 유휴 시 대기 상태로 전력 소비 감소 |
9. 로봇 공학에서의 의의
이벤트 주도 실행 의미론은 자원이 제한된 로봇 시스템에서 행동 트리의 실행 효율을 극대화하는 수단이다. 주기적 실행에서는 환경 변화가 없더라도 매 tick에서 전체 트리를 평가해야 하나, 이벤트 주도 실행에서는 실제로 변경이 발생한 경우에만 필요한 부분을 평가한다. 이는 배터리 구동 로봇, 다수의 행동 트리를 동시에 실행하는 다중 로봇 시스템 등에서 특히 유용하다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
참고 문헌
- Colledanchise, M. & Ögren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
- Faconti, D. (2024). BehaviorTree.CPP Documentation. https://www.behaviortree.dev/