1292.82 Halt 시 자원 정리

1. Halt 시 자원 정리의 필요성

행동 트리의 노드가 halt를 수신하면, 실행 과정에서 할당된 모든 자원을 안전하게 해제하여야 한다. halt는 행동의 정상적인 완료가 아닌 강제 중단이므로, 자원이 자동으로 해제되지 않을 수 있다. 자원 정리가 누락되면 자원 누수(resource leak), 외부 시스템의 상태 불일치, 후속 실행에서의 오동작이 발생한다 (Faconti, BehaviorTree.CPP Documentation, 2024).

2. 정리 대상 자원의 분류

halt 시 정리하여야 하는 자원은 다음과 같이 분류된다.

자원 유형할당 시점정리 내용미정리 시 영향
외부 시스템 요청onStart취소 요청 송신좀비 행동 지속
하드웨어 인터페이스onStart정지 명령, 안전 상태 전이물리적 위험
통신 자원onStart구독 해제, 클라이언트 정리자원 고갈
동적 메모리onStart/onRunning할당 해제메모리 누수
내부 상태onStart/onRunning초기화후속 실행 오동작
파일 핸들onStart파일 닫기파일 디스크립터 고갈

3. 자원 정리의 구현

자원 정리는 onHalted 콜백에서 구현된다.

class NavigateAction : StatefulActionNode {
    goal_handle       // 액션 서버 목표 핸들
    data_buffer       // 수집 데이터 버퍼

    onStart():
        goal_handle = action_client.send_goal(target)
        data_buffer = allocate_buffer()
        return Running

    onRunning():
        if navigation_completed():
            release_buffer(data_buffer)
            return Success
        return Running

    onHalted():
        action_client.cancel_goal(goal_handle)  // 외부 요청 취소
        release_buffer(data_buffer)              // 메모리 해제
        goal_handle = null                       // 핸들 무효화
}

4. 외부 시스템에 대한 취소 요청

halt 시 가장 중요한 정리 작업은 외부 시스템에 위임된 행동의 취소이다.

4.1 ROS2 액션 서버

ROS2 액션 서버에 송신된 목표(goal)는 halt 시 취소 요청(cancel goal)을 송신하여야 한다. 취소 요청을 송신하지 않으면, 행동 트리에서 노드가 Idle로 복귀하였음에도 액션 서버에서 행동이 계속 진행되는 불일치가 발생한다.

4.2 하드웨어 명령

모터 구동, 그리퍼 작동 등의 하드웨어 명령이 진행 중인 경우, halt 시 정지 명령을 송신하여야 한다. 정지 명령이 누락되면 로봇이 의도하지 않은 물리적 행동을 계속 수행하여 안전 위험이 발생한다 (Colledanchise & Ögren, Behavior Trees in Robotics and AI: An Introduction, 2018).

5. 정상 완료와 Halt의 정리 통합

자원 정리 로직이 정상 완료 경로와 halt 경로에서 중복되는 것을 방지하기 위해, 공통 정리 함수를 별도로 정의하여 두 경로에서 호출하는 패턴이 권장된다.

class MyAction : StatefulActionNode {
    cleanup():
        cancel_if_active(goal_handle)
        release_buffer(data_buffer)

    onRunning():
        if completed():
            cleanup()
            return Success
        return Running

    onHalted():
        cleanup()
}

6. 정리 실패의 처리

자원 정리 자체가 실패할 수 있다. 네트워크 오류로 취소 요청이 송신되지 않거나, 하드웨어 인터페이스가 응답하지 않는 경우가 이에 해당한다. onHalted는 반환값이 없으므로 실패를 상위 노드에 전달할 수 없다. 따라서 정리 실패는 로그 기록, 진단 이벤트 발행 등의 비동기적 방법으로 보고하여야 한다 (Faconti, 2024).

7. 로봇 공학에서의 의의

halt 시 자원 정리는 장시간 운영되는 로봇 시스템의 안정성에 필수적이다. 로봇은 행동 트리를 반복적으로 실행하며, 매 실행에서 halt가 발생할 수 있다. 자원 정리가 올바르게 수행되지 않으면, 반복 실행에 따라 자원이 점진적으로 고갈되어 시스템이 불안정해진다 (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/