1292.75 onHalted 콜백의 역할
1. onHalted 콜백의 정의
onHalted 콜백은 행동 트리의 상태 보존 액션 노드(StatefulActionNode)가 Running 상태에서 halt 요청을 수신할 때 호출되는 생명주기 콜백이다. 이 콜백은 행동의 중단 단계(termination phase)에 해당하며, 진행 중인 행동을 안전하게 중단하고, 할당된 자원을 정리하는 역할을 수행한다 (Faconti, BehaviorTree.CPP Documentation, 2024).
2. 호출 시점
onHalted가 호출되는 조건은 다음과 같다.
| 조건 | 설명 |
|---|---|
| 현재 상태가 Running | 노드가 행동을 수행 중이다 |
| halt 요청 수신 | 상위 노드로부터 halt 요청이 전달된다 |
onHalted는 노드의 정상적인 완료(Success 또는 Failure 반환)가 아닌, 외부의 강제 중단에 의해 호출된다. 노드가 Idle 상태일 때는 halt 요청이 발생하지 않으며, onHalted도 호출되지 않는다.
3. halt 요청의 발생 원인
halt 요청은 상위 제어 흐름 노드의 동작에 의해 발생한다. 주요 원인은 다음과 같다.
| 원인 | 설명 | 예시 |
|---|---|---|
| Sequence의 실패 전파 | 선행 자식 실패 시 Running 자식에 halt | 조건 노드 실패 |
| ReactiveSequence의 재평가 | 선행 자식 재평가 실패 시 halt | 안전 조건 위반 |
| Fallback의 성공 전파 | 상위 대안 성공 시 현재 대안 halt | 상위 대안 복원 |
| Parallel의 정책 충족 | 성공/실패 임계값 도달 시 잔여 자식 halt | 다수결 달성 |
| WhileDoElse의 분기 전환 | 조건 변화 시 이전 분기 halt | 조건 반전 |
| 외부 트리 중단 | 행동 트리 전체 실행 중단 | 비상 정지 |
4. 수행하여야 하는 작업
4.1 진행 중인 행동의 취소
외부 시스템에 위임된 행동에 취소 요청을 송신한다. ROS2 액션 서버에 목표 취소(cancel goal) 요청을 송신하거나, 진행 중인 계산 프로세스를 중단시킨다.
4.2 자원 해제
onStart에서 할당된 자원을 해제한다. 파일 핸들, 통신 채널, 하드웨어 인터페이스 등의 자원이 이 시점에서 정리된다.
4.3 안전 상태 전이
로봇이 안전한 상태로 전이되도록 보장한다. 모터 정지 명령 송신, 그리퍼 상태 고정, 비상 감속 등의 안전 조치가 onHalted에서 수행된다.
4.4 내부 상태 정리
노드의 내부 멤버 변수를 정리한다. 중간 결과, 타이머, 카운터 등의 내부 상태를 초기화하여, 다음 onStart 호출 시 깨끗한 상태에서 시작할 수 있도록 한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).
5. 반환 상태
onHalted는 반환값이 없다(void). onHalted 호출 후 노드는 자동으로 Idle 상태로 복귀한다. halt는 행동의 성공이나 실패가 아닌 강제 중단이므로, Success 또는 Failure의 반환이 의미를 갖지 않는다.
6. 구현 예시
class NavigateToGoal : StatefulActionNode {
action_client // ROS2 액션 클라이언트
goal_handle // 액션 목표 핸들
onHalted():
if goal_handle is active:
action_client.cancel_goal(goal_handle) // 목표 취소
goal_handle = null // 핸들 정리
// 노드는 자동으로 Idle로 복귀
}
7. onHalted 미구현의 위험
onHalted를 올바르게 구현하지 않으면 다음의 문제가 발생할 수 있다.
| 문제 | 설명 |
|---|---|
| 자원 누수 | 할당된 자원이 해제되지 않아 시스템 자원 고갈 |
| 좀비 행동 | 취소되지 않은 외부 행동이 계속 진행 |
| 불일치 상태 | 노드 상태와 외부 시스템 상태 간의 불일치 |
| 안전 위험 | 중단되어야 할 물리적 행동이 계속 수행 |
8. onStart, onRunning과의 관계
세 가지 생명주기 콜백의 관계를 요약하면 다음과 같다.
| 콜백 | 호출 조건 | 역할 | 반환값 |
|---|---|---|---|
| onStart | Idle → tick | 초기화, 행동 시작 | Success/Failure/Running |
| onRunning | Running → tick | 진행 확인, 완료 판단 | Success/Failure/Running |
| onHalted | Running → halt | 행동 중단, 자원 정리 | 없음 |
onStart에서 할당된 모든 자원은 onHalted에서 해제되어야 한다는 대칭 원칙이 적용된다 (Faconti, 2024).
9. 로봇 공학에서의 의의
onHalted는 로봇의 안전한 행동 중단을 보장하는 핵심 메커니즘이다. 행동 트리의 제어 흐름 변화에 의해 행동이 강제 중단되는 상황에서, 로봇이 물리적으로 안전한 상태로 전이되도록 보장한다. 이동 중 정지, 파지 상태 유지, 비상 감속 등의 안전 조치가 onHalted에 의해 실행된다 (Colledanchise & Ögren, 2018).
참고 문헌
- 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/