시간 제어 데코레이터 (Time Control Decorators)

1. 개요

시간 제어 데코레이터는 자식 노드의 실행에 시간적 제약(타임아웃, 지연, 빈도 제한)을 부여하는 데코레이터 노드의 범주이다. 로봇 시스템에서 시간적 제약은 행동의 응답성 보장, 무한 실행 방지, 시스템 자원의 효율적 활용 등에 필수적이며, 시간 제어 데코레이터는 이를 행동 트리 수준에서 선언적으로 구현할 수 있게 한다.

2. 주요 시간 제어 데코레이터

2.1 TimeoutNode (타임아웃)

자식 노드의 실행 시간을 제한하며, 지정된 시간 내에 완료되지 않으면 자식을 halt하고 FAILURE를 반환한다.

동작 규칙:

자식 상태시간 조건TimeoutNode 결과
SUCCESS시간 내SUCCESS
FAILURE시간 내FAILURE
RUNNING시간 내RUNNING
RUNNING시간 초과FAILURE (자식 halt)
<Timeout msec="30000">
    <Action ID="NavigateToGoal"/>
</Timeout>

내비게이션이 30초 이내에 완료되지 않으면 FAILURE를 반환하고 내비게이션 액션을 halt한다.

시간 측정 시점: 타이머는 데코레이터가 처음 RUNNING 상태에 진입할 때 시작되며, 자식이 SUCCESS 또는 FAILURE로 완료되거나 halt되면 타이머가 리셋된다.

2.2 Delay (지연)

자식 노드의 실행을 지정된 시간만큼 지연시킨다. 지연 동안 RUNNING을 반환하며, 지연이 완료되면 자식을 tick한다.

동작 규칙:

단계동작결과
지연 중자식을 tick하지 않음RUNNING
지연 완료 후자식을 tick자식의 상태를 그대로 전달
<Delay delay_msec="2000">
    <Action ID="StartMotor"/>
</Delay>

모터 시작을 2초 지연시킨다. 이전 행동의 완료 후 안정화 시간을 제공하는 데 활용된다.

2.3 RateController (빈도 제한)

자식 노드의 tick 빈도를 제한한다. 지정된 주기 이내에서는 이전 결과를 캐싱하여 반환하고, 주기가 경과한 후에만 자식을 다시 tick한다.

동작 규칙:

시간 조건동작결과
주기 이내자식을 tick하지 않음이전 결과 반환
주기 경과자식을 tick자식의 상태 반환
<RateController hz="1.0">
    <Condition ID="IsPathValid"/>
</RateController>

경로 유효성 확인을 초당 1회로 제한하여 서비스 호출 빈도를 줄인다. 행동 트리의 tick 주기가 10Hz인 경우, RateController가 없으면 초당 10회 호출되지만, 이를 적용하면 초당 1회로 제한된다.

3. 시간 소스의 선택

3.1 ROS2 시간과의 호환

시간 제어 데코레이터는 rclcpp::Clock을 통해 시간을 측정하여야 시뮬레이션 시간과 호환된다. use_sim_time 파라미터가 활성화된 환경에서는 시뮬레이션 시간이 자동으로 적용된다.

시간 소스특성적합한 용도
RCL_ROS_TIME시뮬레이션 호환일반적 용도 (권장)
RCL_STEADY_TIME단조 증가, 점프 없음정밀 타이밍 측정
RCL_SYSTEM_TIME시스템 시각절대 시각 기반 제어

BehaviorTree.CPP의 내장 시간 제어 데코레이터는 std::chrono::steady_clock을 사용하는 경우가 많으므로, 시뮬레이션 환경에서의 호환성을 확인하여야 한다.

4. 시간 제어 데코레이터의 조합

4.1 Timeout + Retry

<Timeout msec="120000">
    <RetryNode num_attempts="5">
        <Action ID="DownloadUpdate"/>
    </RetryNode>
</Timeout>

전체 2분 이내에서 업데이트 다운로드를 최대 5회 재시도한다.

4.2 Delay + Action

<Sequence>
    <Action ID="StopMotor"/>
    <Delay delay_msec="500">
        <Action ID="ReverseMotor"/>
    </Delay>
</Sequence>

모터 정지 후 500ms 대기 후 역회전을 시작한다.

4.3 RateController + 비용 높은 조건

<ReactiveSequence>
    <RateController hz="0.5">
        <Condition ID="IsPathValid"/>
    </RateController>
    <Action ID="FollowPath"/>
</ReactiveSequence>

경로 유효성 확인을 2초에 1회로 제한하여 서비스 호출 부하를 줄인다.

5. XML 행동 트리에서의 활용 패턴

5.1 타임아웃 기반 안전 내비게이션

<Fallback>
    <Timeout msec="60000">
        <Action ID="NavigateToGoal"/>
    </Timeout>
    <Action ID="NavigationTimeout Recovery"/>
</Fallback>

5.2 지연 시작 임무

<Delay delay_msec="5000">
    <SubTree ID="MainMission"/>
</Delay>

시스템 시작 후 5초 대기 후 메인 임무를 실행한다.

6. 설계 시 고려 사항

6.1 시간 정밀도

행동 트리의 tick 주기가 시간 제어의 정밀도를 결정한다. tick 주기가 100ms인 경우, 타임아웃이나 지연의 정밀도는 ±100ms이다.

6.2 Timeout과 halt의 관계

TimeoutNode가 시간 초과로 자식을 halt할 때, 자식의 halt() 메서드가 신속하게 완료되어야 한다. halt 처리가 지연되면 전체 tick 주기에 영향을 미친다.

6.3 RateController와 ReactiveSequence

ReactiveSequence 내부에서 RateController를 사용하면, 조건의 재평가 빈도를 제한할 수 있다. 이는 비용 높은 조건의 성능 최적화에 유용하다.

7. 참고 문헌

  • Colledanchise, M., & Ogren, P. (2018). Behavior Trees in Robotics and AI: An Introduction. CRC Press.
  • BehaviorTree.CPP 공식 문서. https://www.behaviortree.dev/

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