조건 노드와 ReactiveSequence의 조합 (Condition Nodes with ReactiveSequence)

조건 노드와 ReactiveSequence의 조합 (Condition Nodes with ReactiveSequence)

1. 개요

ReactiveSequence와 조건 노드의 조합은 행동 트리에서 가장 빈번히 사용되는 패턴 중 하나이다. ReactiveSequence는 매 tick마다 첫 번째 자식부터 모든 자식을 재평가하므로, 조건 노드를 앞쪽에 배치하면 조건을 지속적으로 감시하면서 후속 행동을 실행하는 구조를 구현할 수 있다. 이 패턴은 안전 조건 감시, 전제 조건 유지 확인, 반응적 행동 제어 등에 핵심적으로 활용된다.

2. ReactiveSequence의 동작 원리

2.1 일반 Sequence와의 차이

특성SequenceReactiveSequence
재평가 방식SUCCESS인 자식을 건너뜀매 tick마다 처음부터 재평가
조건 변화 반영한 번 통과하면 재확인하지 않음항상 최신 상태 반영
행동 중단이전 조건의 변화를 감지하지 못함조건 실패 시 즉시 행동 중단

2.2 tick 흐름

ReactiveSequence(C1, C2, A1) 구조에서 (C1, C2는 조건 노드, A1은 액션 노드):

매 tick에서:

  1. C1을 평가한다.
  • FAILUREReactiveSequenceFAILURE를 반환, A1이 실행 중이면 halt 호출
  1. C2를 평가한다.
  • FAILUREReactiveSequenceFAILURE를 반환, A1이 실행 중이면 halt 호출
  1. A1을 평가한다.
  • RUNNINGReactiveSequenceRUNNING을 반환
  • SUCCESSReactiveSequenceSUCCESS를 반환

핵심은 A1RUNNING 상태로 실행 중이더라도, 다음 tick에서 C1C2가 다시 평가된다는 점이다. 조건이 FAILURE로 변경되면 A1의 실행이 즉시 중단된다.

3. 기본 패턴: 조건 감시 하 행동 실행

<ReactiveSequence>
    <Condition ID="IsBatteryAbove"
               topic_name="/battery_state"
               min_percentage="0.15"/>
    <Action ID="NavigateToGoal"/>
</ReactiveSequence>

배터리 잔량이 15% 이상인 동안에만 내비게이션을 수행하고, 잔량이 15% 미만으로 감소하면 내비게이션이 즉시 중단된다.

4. 다중 조건 감시

<ReactiveSequence>
    <Condition ID="IsNotEmergencyStopped"/>
    <Condition ID="IsBatteryAbove" min_percentage="0.1"/>
    <Condition ID="IsCommsConnected" timeout_sec="3.0"/>
    <Condition ID="IsLocalizationReliable" max_xy_std="1.0"/>
    <Action ID="ExecuteMission"/>
</ReactiveSequence>

네 개의 안전/전제 조건이 모두 SUCCESS인 동안에만 임무를 수행한다. 어느 하나라도 FAILURE가 되면 임무가 즉시 중단된다.

5. 조건과 서브트리의 조합

<ReactiveSequence>
    <SubTree ID="SafetyConditions"/>
    <SubTree ID="MissionExecution"/>
</ReactiveSequence>

안전 조건들을 서브트리로 캡슐화하면 구조의 가독성이 향상되고, 안전 조건 서브트리를 다른 행동 트리에서도 재사용할 수 있다.

6. 조건 위반 시 대체 행동

ReactiveSequenceFallback을 결합하여, 조건 위반 시 대체 행동을 실행하는 패턴이다.

<Fallback>
    <ReactiveSequence>
        <Condition ID="IsPathClear"/>
        <Action ID="FollowPath"/>
    </ReactiveSequence>
    <Action ID="AvoidObstacle"/>
</Fallback>

경로가 명확한 동안에는 경로를 추종하고, 장애물이 감지되면 즉시 회피 행동으로 전환한다.

7. 계층적 ReactiveSequence

<ReactiveSequence name="SystemLevel">
    <!-- 시스템 수준 안전 조건 -->
    <Condition ID="IsNotEmergencyStopped"/>
    <Condition ID="IsSystemHealthy"/>

    <ReactiveSequence name="MissionLevel">
        <!-- 임무 수준 전제 조건 -->
        <Condition ID="IsBatteryAbove" min_percentage="0.2"/>
        <Condition ID="IsInsideGeofence"/>
        <Action ID="ExecuteMission"/>
    </ReactiveSequence>
</ReactiveSequence>

외부 ReactiveSequence는 시스템 수준 안전 조건을, 내부 ReactiveSequence는 임무 수준 전제 조건을 감시한다. 시스템 수준 조건이 실패하면 임무 수준의 모든 행동이 중단된다.

8. 설계 시 고려 사항

8.1 조건 평가 비용

ReactiveSequence에서 조건 노드는 매 tick마다 재평가되므로, 계산 비용이 높은 조건이 포함되면 전체 tick 주기에 영향을 미친다. 비용이 높은 조건에는 캐싱 전략을 적용하여야 한다.

8.2 조건 노드의 배치 순서

FAILURE 확률이 높은 조건이나 비용이 낮은 조건을 앞에 배치하면 효율이 향상된다. 단락 평가에 의해, 앞쪽 조건이 FAILURE를 반환하면 뒤쪽 조건과 액션은 평가되지 않는다.

8.3 액션 노드의 halt 처리

조건 실패로 인해 액션 노드가 중단될 때, 액션 노드의 halt() 메서드가 호출된다. 액션 노드는 halt() 메서드에서 진행 중인 작업을 안전하게 정리(cleanup)하여야 한다. 예를 들어, 내비게이션 액션이 중단되면 속도 명령을 0으로 설정하여 로봇을 정지시켜야 한다.

8.4 ReactiveSequence와 일반 Sequence의 선택 기준

지속적 감시가 필요한 조건(안전, 센서 상태)은 ReactiveSequence를, 일회성 전제 조건(초기화 확인)은 일반 Sequence를 사용한다.

9. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/
  • Macenski, S., et al. (2020). “The Marathon 2: A Navigation System.” arXiv preprint arXiv:2003.00368.

버전날짜변경 사항
v0.12026-04-04초안 작성