조건 위반 시 행동 중단 패턴 (Behavior Abort on Condition Violation Pattern)
1. 개요
조건 위반 시 행동 중단 패턴은 ReactiveSequence 내에서 조건 노드가 FAILURE를 반환할 때, 현재 실행 중인 액션 노드의 halt() 메서드가 호출되어 행동이 즉시 중단되는 메커니즘을 다룬다. 이 패턴은 안전 조건 위반 시 로봇의 즉각적 정지, 환경 변화에 대한 반응적 행동 전환 등에 핵심적으로 활용되며, 행동 트리의 반응성(reactivity)을 구현하는 기본 메커니즘이다.
2. 중단 메커니즘의 동작
2.1 halt() 호출 과정
ReactiveSequence 내부에서 조건이 FAILURE를 반환하면, 다음 과정이 발생한다.
ReactiveSequence가FAILURE를 반환한다.- 이전에
RUNNING상태였던 액션 노드의halt()메서드가 호출된다. - 액션 노드는
halt()내부에서 진행 중인 작업을 정리하고, 상태를IDLE로 전환한다.
Tick N: Condition=SUCCESS, Action=RUNNING → ReactiveSequence=RUNNING
Tick N+1: Condition=FAILURE → Action.halt() 호출 → ReactiveSequence=FAILURE
2.2 halt()의 구현 책임
액션 노드 개발자는 halt() 메서드에서 다음을 보장하여야 한다.
- 모터 명령을 안전 값(예: 속도 0)으로 설정
- 진행 중인 비동기 작업(서비스 호출, 액션 서버 목표) 취소
- 내부 상태 초기화
- 리소스 해제
void NavigateAction::halt()
{
// 속도 명령을 0으로 설정
auto cmd = geometry_msgs::msg::Twist();
cmd_vel_pub_->publish(cmd);
// Nav2 액션 서버 목표 취소
if (action_client_ && goal_handle_)
{
action_client_->async_cancel_goal(goal_handle_);
}
// 기반 클래스의 halt 호출
CoroActionNode::halt();
}
3. 구현 패턴
3.1 안전 조건 위반 시 즉시 정지
<BehaviorTree ID="SafetyAbort">
<Fallback>
<ReactiveSequence>
<Condition ID="IsNotEmergencyStopped"
topic_name="/e_stop"/>
<Condition ID="IsNoCollisionRisk"
topic_name="/scan"
min_distance="0.3"/>
<Action ID="NavigateToGoal"/>
</ReactiveSequence>
<!-- 조건 위반 시 대체 행동 -->
<Action ID="SafeStop"/>
</Fallback>
</BehaviorTree>
비상 정지가 활성화되거나 충돌 위험이 감지되면 NavigateToGoal이 즉시 중단되고, SafeStop 액션이 실행된다.
3.2 단계적 중단 대응
조건 위반의 심각도에 따라 다른 수준의 중단 행동을 실행한다.
<BehaviorTree ID="GradedAbort">
<Fallback>
<!-- 최우선: 비상 정지 -->
<ReactiveSequence>
<Condition ID="IsNotEmergencyStopped"/>
<!-- 차순위: 장애물 감시 -->
<Fallback>
<ReactiveSequence>
<Inverter>
<Condition ID="IsObstacleNear"
detection_range="0.5"/>
</Inverter>
<Action ID="FullSpeedNavigation"/>
</ReactiveSequence>
<ReactiveSequence>
<Inverter>
<Condition ID="IsObstacleNear"
detection_range="0.2"/>
</Inverter>
<Action ID="SlowNavigation"/>
</ReactiveSequence>
<Action ID="StopAndWait"/>
</Fallback>
</ReactiveSequence>
<Action ID="EmergencyStop"/>
</Fallback>
</BehaviorTree>
장애물 거리에 따라 전속 이동, 감속 이동, 정지, 비상 정지의 네 단계 대응을 구현한다.
3.3 중단 후 상태 보존
행동이 중단된 후, 재개 시 이전 상태를 복원하여야 하는 경우가 있다. 블랙보드를 통해 중단 시점의 상태를 저장하고, 재개 시 이를 참조한다.
<ReactiveSequence>
<Condition ID="IsBatteryAbove" min_percentage="0.15"/>
<Action ID="NavigateToGoal"
current_pose_on_abort="{abort_pose}"/>
</ReactiveSequence>
4. 설계 시 고려 사항
4.1 halt()의 비차단 실행
halt() 메서드는 신속하게 완료되어야 한다. 긴 시간이 소요되는 정리 작업은 비동기적으로 수행하고, halt()는 즉시 반환하여야 한다. halt() 내부에서 차단(blocking) 호출이 발생하면 행동 트리의 tick이 지연된다.
4.2 조건 진동에 의한 반복적 중단/재개
조건이 SUCCESS와 FAILURE 사이를 빠르게 진동하면, 액션이 반복적으로 시작과 중단을 반복한다. 이는 모터의 기계적 스트레스 증가, 내비게이션 경로의 빈번한 재계획 등의 문제를 초래한다. 히스테리시스 적용이나 디바운싱(debouncing) 로직을 통해 이를 방지한다.
4.3 ROS2 액션 서버와의 연동
Nav2의 내비게이션 액션은 ROS2 액션 서버를 통해 실행된다. halt() 시 액션 서버의 목표를 취소(cancel_goal)하여야 하며, 취소 요청이 서버에 전달되고 처리되기까지 시간이 소요될 수 있다. 이 지연 동안 로봇이 여전히 이동할 수 있으므로, 추가적인 안전 장치(속도 명령 직접 발행)가 필요할 수 있다.
4.4 중단 이벤트의 로깅
조건 위반에 의한 행동 중단은 중요한 이벤트이므로, 어떤 조건이 위반되었는지, 어떤 행동이 중단되었는지를 상세히 로깅하여 사후 분석에 활용하여야 한다.
5. 참고 문헌
- 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.1 | 2026-04-04 | 초안 작성 |