1292.53 Switch 제어 노드의 동작 원리
1. Switch 노드의 정의
Switch 노드는 행동 트리(Behavior Tree)의 제어 흐름 노드 중 하나로, 프로그래밍 언어의 switch-case 구문과 유사한 의미론을 구현한다. 이 노드는 변수의 값에 따라 복수의 분기 중 하나를 선택하여 실행하며, IfThenElse 노드의 이진 분기를 다중 분기(multi-way branching)로 확장한 것이다. BehaviorTree.CPP 라이브러리에서는 Switch2, Switch3, Switch4 등 분기 수에 따른 변형이 제공된다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 자식 구조
Switch 노드는 N+1개의 자식을 가진다. 여기서 N은 case 분기의 수이며, 마지막 자식은 기본(default) 분기이다.
| 인덱스 | 역할 | 설명 |
|---|---|---|
| 0 | case 1 분기 | 변수 값이 case 1에 해당할 때 실행 |
| 1 | case 2 분기 | 변수 값이 case 2에 해당할 때 실행 |
| \vdots | \vdots | \vdots |
| N-1 | case N 분기 | 변수 값이 case N에 해당할 때 실행 |
| N | default 분기 | 어떤 case에도 해당하지 않을 때 실행 |
3. 알고리즘
Switch 노드의 동작을 의사 코드로 표현하면 다음과 같다. variable은 분기 선택 기준이 되는 변수이며, case_values는 각 분기에 대응하는 값의 배열이다.
function Switch.tick():
current_value = read_variable()
selected = default_index
for i = 0 to N-1:
if current_value == case_values[i]:
selected = i
break
if selected != previously_selected:
halt_child_if_running(previously_selected)
previously_selected = selected
return child[selected].tick()
이 알고리즘에서 Switch 노드는 매 tick마다 변수의 현재 값을 읽고, 해당 값에 대응하는 분기를 선택한다. 이전 tick에서 선택된 분기와 현재 선택된 분기가 다르면, 이전 분기의 Running 상태 자식에 halt를 요청하고 새로운 분기로 전환한다 (Faconti, 2024).
4. 분기 선택 변수
Switch 노드의 분기 선택은 블랙보드(blackboard)에 저장된 변수의 값에 의해 결정된다. 이 변수는 문자열 또는 정수 타입이며, 각 case 분기에는 해당 변수의 기대 값이 지정된다. 매 tick마다 변수의 현재 값을 읽어 대응하는 분기를 선택하므로, Switch 노드는 반응형(reactive) 특성을 가진다.
5. 실행 흐름 예제
다음의 Switch 노드를 고려한다. 블랙보드 변수 navigation_mode의 값에 따라 세 가지 항법 전략 중 하나를 선택한다.
Switch3 [SW1, variable="navigation_mode"]
├─ Action [A1: GPS 항법] ← case "gps"
├─ Action [A2: 비전 항법] ← case "vision"
├─ Action [A3: 관성 항법] ← case "inertial"
└─ Action [A4: 안전 정지] ← default
5.1 분기 선택과 유지
| Tick | navigation_mode | 선택 분기 | 실행 자식 | SW1 반환 |
|---|---|---|---|---|
| t_1 | “gps” | A1 | A1 | Running |
| t_2 | “gps” | A1 | A1 | Running |
변수 값이 “gps“를 유지하므로 A1이 계속 실행된다.
5.2 변수 변화에 의한 분기 전환
| Tick | navigation_mode | 선택 분기 | 실행 자식 | SW1 반환 | 비고 |
|---|---|---|---|---|---|
| t_3 | “vision” | A2 | A2 | Running | A1에 halt 요청, A2 새로 시작 |
tick t_3에서 변수 값이 “vision“으로 변경되면, A1에 halt가 요청되고 A2가 새로 활성화된다.
5.3 default 분기 실행
| Tick | navigation_mode | 선택 분기 | 실행 자식 | SW1 반환 |
|---|---|---|---|---|
| t_4 | “unknown” | A4 (default) | A4 | Running |
변수 값이 어떤 case에도 해당하지 않으면 default 분기(A4)가 실행된다.
6. IfThenElse 및 WhileDoElse와의 관계
Switch 노드는 IfThenElse와 WhileDoElse의 확장으로 이해할 수 있다.
| 노드 | 분기 수 | 조건 평가 방식 | 재평가 여부 |
|---|---|---|---|
| IfThenElse | 2 (then/else) | 자식 노드의 반환 상태 | 한 번만 |
| WhileDoElse | 2 (do/else) | 자식 노드의 반환 상태 | 매 tick마다 |
| Switch | N + default | 블랙보드 변수의 값 | 매 tick마다 |
Switch 노드는 WhileDoElse와 동일하게 매 tick마다 조건(변수 값)을 재평가하되, 이진 분기가 아닌 다중 분기를 지원한다. 분기 선택 기준이 자식 노드의 반환 상태가 아닌 블랙보드 변수의 값이라는 점도 차이이다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
7. 분기 전환 시의 Halt 처리
Switch 노드에서 분기 전환이 발생하면, 이전 분기의 Running 상태 자식에 halt가 요청된다. 이 halt는 분기 전환이 발생하지 않은 경우에는 수행되지 않으며, 동일한 분기가 연속적으로 선택되면 해당 자식이 중단 없이 계속 실행된다.
8. 로봇 공학에서의 활용
8.1 다중 동작 모드 관리
Switch 노드는 로봇의 다중 동작 모드를 관리하는 데 적합하다. 상위 수준의 임무 관리 시스템이 블랙보드 변수를 통해 현재 동작 모드를 지정하면, Switch 노드가 해당 모드에 대응하는 행동을 자동으로 선택하여 실행한다.
8.2 상태 기반 행동 선택
유한 상태 머신(FSM)의 상태 전이와 유사한 패턴을 행동 트리 내에서 구현할 때 Switch 노드가 활용된다. 블랙보드 변수가 현재 상태를 나타내고, 각 case 분기가 해당 상태에서의 행동을 정의한다. 이 패턴은 FSM의 명시적 상태 관리와 행동 트리의 모듈성을 결합한다 (Faconti, 2024).
참고 문헌
- 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/