조건 지속 감시 패턴 (Continuous Condition Monitoring Pattern)

조건 지속 감시 패턴 (Continuous Condition Monitoring Pattern)

1. 개요

조건 지속 감시 패턴은 행동의 실행 중에도 조건을 지속적으로 재평가하여, 조건이 위반되면 즉시 행동을 중단하는 행동 트리 설계 패턴이다. 이 패턴은 ReactiveSequence를 활용하여 구현되며, 안전 조건 감시, 전제 조건 유지 확인, 환경 변화에 대한 즉각적 대응 등에 핵심적으로 사용된다.

2. 패턴의 구조

2.1 기본 구조

<ReactiveSequence>
    <Condition ID="MonitoredCondition"/>
    <Action ID="GuardedAction"/>
</ReactiveSequence>

MonitoredCondition은 매 tick마다 재평가되며, FAILURE를 반환하는 순간 GuardedAction이 중단(halt)된다. GuardedActionRUNNING 상태로 수 초에 걸쳐 실행되는 동안에도, 조건은 매 tick마다 감시된다.

2.2 패턴의 의미론

이 패턴은 다음 의미론을 표현한다.

“조건이 유지되는 동안에만 행동을 수행하라. 조건이 위반되면 행동을 즉시 중단하라.”

이는 가드(guard) 조건 또는 불변 조건(invariant)의 개념에 해당한다.

3. 실용적 변형

3.1 다중 조건 감시

<ReactiveSequence>
    <Condition ID="IsBatteryAbove" min_percentage="0.15"/>
    <Condition ID="IsNotEmergencyStopped"/>
    <Condition ID="IsScanReceived" max_age_sec="0.5"/>
    <Action ID="NavigateToGoal"/>
</ReactiveSequence>

세 개의 조건이 모두 유지되는 동안에만 내비게이션을 수행한다.

3.2 조건 위반 시 대체 행동 실행

<Fallback>
    <ReactiveSequence>
        <Condition ID="IsAllClear"/>
        <Action ID="NormalOperation"/>
    </ReactiveSequence>
    <Action ID="FallbackBehavior"/>
</Fallback>

조건이 유지되면 정상 운용, 위반되면 대체 행동을 실행한다.

3.3 계층적 감시

<ReactiveSequence name="SafetyGuard">
    <Condition ID="IsNotEmergencyStopped"/>

    <ReactiveSequence name="OperationalGuard">
        <Condition ID="IsBatteryAbove" min_percentage="0.2"/>

        <ReactiveSequence name="MissionGuard">
            <Condition ID="IsInsideGeofence"/>
            <Action ID="ExecuteMission"/>
        </ReactiveSequence>
    </ReactiveSequence>
</ReactiveSequence>

안전 조건 → 운용 조건 → 임무 조건의 계층적 감시 구조를 형성한다. 상위 조건이 위반되면 하위의 모든 행동이 중단된다.

4. 감시 패턴의 변형: 단발 확인 후 감시

일부 조건은 최초에 한 번 확인하면 되고, 다른 조건은 지속적으로 감시하여야 한다. 이 경우 두 가지 패턴을 결합한다.

<Sequence>
    <!-- 일회성 전제 조건 (Sequence: 한 번만 확인) -->
    <Condition ID="IsSystemInitialized"/>
    <Condition ID="IsCalibrationComplete"/>

    <!-- 지속적 감시 조건 (ReactiveSequence: 매 tick 재평가) -->
    <ReactiveSequence>
        <Condition ID="IsBatteryAbove" min_percentage="0.15"/>
        <Condition ID="IsSensorDataFresh"/>
        <Action ID="PerformMission"/>
    </ReactiveSequence>
</Sequence>

외부 Sequence에서 초기화와 캘리브레이션을 한 번 확인하고, 내부 ReactiveSequence에서 배터리와 센서를 지속적으로 감시한다.

5. Nav2에서의 조건 감시 패턴

Nav2의 기본 행동 트리는 조건 지속 감시 패턴을 광범위하게 활용한다.

<!-- Nav2의 전형적 내비게이션 행동 트리 구조 (간략화) -->
<ReactiveSequence>
    <RateController hz="1.0">
        <Condition ID="GoalUpdated"/>
    </RateController>
    <Fallback>
        <ReactiveSequence>
            <Condition ID="IsPathValid"/>
            <Action ID="FollowPath"/>
        </ReactiveSequence>
        <Action ID="ComputePathToPose"/>
    </Fallback>
</ReactiveSequence>

경로가 유효한 동안에는 경로를 추종하고, 유효하지 않으면 경로를 재계산한다. 목표가 갱신되면 전체 내비게이션 로직이 재시작된다.

6. 설계 시 고려 사항

6.1 감시 빈도와 tick 주기

조건 감시의 빈도는 행동 트리의 tick 주기에 의해 결정된다. tick 주기가 100ms이면 조건은 초당 10회 재평가된다. 안전 요구에 따라 더 높은 감시 빈도가 필요한 경우 tick 주기를 줄여야 한다.

6.2 행동 중단의 안전성

조건 위반으로 액션이 중단될 때, 액션이 안전한 상태에서 종료되도록 하여야 한다. halt() 메서드에서 적절한 정리 작업(속도 0 설정, 그리퍼 유지 등)을 수행하여야 한다.

6.3 조건 진동에 의한 반복 중단/재개

조건 결과가 빠르게 SUCCESSFAILURE 사이를 진동하면, 행동이 반복적으로 시작과 중단을 반복하여 시스템이 불안정해질 수 있다. 히스테리시스를 적용하여 조건 전환에 필요한 변화량을 증가시키면 이 문제를 방지할 수 있다.

7. 참고 문헌

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

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