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) 분기이다.

인덱스역할설명
0case 1 분기변수 값이 case 1에 해당할 때 실행
1case 2 분기변수 값이 case 2에 해당할 때 실행
\vdots\vdots\vdots
N-1case N 분기변수 값이 case N에 해당할 때 실행
Ndefault 분기어떤 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 분기 선택과 유지

Ticknavigation_mode선택 분기실행 자식SW1 반환
t_1“gps”A1A1Running
t_2“gps”A1A1Running

변수 값이 “gps“를 유지하므로 A1이 계속 실행된다.

5.2 변수 변화에 의한 분기 전환

Ticknavigation_mode선택 분기실행 자식SW1 반환비고
t_3“vision”A2A2RunningA1에 halt 요청, A2 새로 시작

tick t_3에서 변수 값이 “vision“으로 변경되면, A1에 halt가 요청되고 A2가 새로 활성화된다.

5.3 default 분기 실행

Ticknavigation_mode선택 분기실행 자식SW1 반환
t_4“unknown”A4 (default)A4Running

변수 값이 어떤 case에도 해당하지 않으면 default 분기(A4)가 실행된다.

6. IfThenElse 및 WhileDoElse와의 관계

Switch 노드는 IfThenElse와 WhileDoElse의 확장으로 이해할 수 있다.

노드분기 수조건 평가 방식재평가 여부
IfThenElse2 (then/else)자식 노드의 반환 상태한 번만
WhileDoElse2 (do/else)자식 노드의 반환 상태매 tick마다
SwitchN + 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/