1261.74 행동 제어에서의 예외 처리 전략
1. 행동 제어와 예외 처리의 본질적 관계
로봇 행동 제어 시스템은 센서 고장, 액추에이터 오류, 통신 단절, 환경 변화, 소프트웨어 결함 등 다양한 예외적 상황(exceptional condition)에 노출된다. 예외 처리(exception handling)란 이러한 비정상적 조건이 발생하였을 때, 시스템이 안전하고 예측 가능한 방식으로 대응하여 임무의 계속, 안전한 중단, 또는 복구를 수행하도록 하는 체계적 전략을 의미한다(Lee, 2006).
행동 제어 시스템에서의 예외 처리는 범용 소프트웨어의 예외 처리와 근본적으로 상이한 요구사항을 갖는다. 첫째, 행동 제어 시스템은 물리적 환경과 실시간으로 상호작용하므로, 예외 발생 시 즉각적인 대응이 필요하다. 예외 처리 지연은 로봇의 충돌, 하드웨어 손상, 또는 인명 사고로 직결될 수 있다. 둘째, 행동 제어의 예외는 단순한 프로그래밍 오류뿐 아니라, 물리적 세계의 불확실성(uncertainty)에서 기인하는 경우가 빈번하다. 셋째, 예외 처리의 결과가 로봇의 물리적 동작으로 나타나므로, 예외 처리 전략 자체가 안전성 분석(safety analysis)의 대상이 된다.
2. 예외의 분류 체계
행동 제어 시스템에서 발생하는 예외를 원인과 특성에 따라 분류하면 다음과 같다.
2.1 하드웨어 예외
하드웨어 예외는 센서, 액추에이터, 전원 공급 장치, 연산 장치 등의 물리적 구성 요소에서 발생하는 이상을 포함한다.
- 센서 고장(sensor failure): 센서 데이터의 유실, 고정값 출력(stuck-at fault), 범위 초과 값 출력, 노이즈 급증 등이 해당된다.
- 액추에이터 고장(actuator failure): 모터 과열, 인코더 불량, 토크 부족, 기계적 고착(mechanical jamming) 등이 포함된다.
- 전원 이상(power anomaly): 배터리 전압 강하, 순간 정전, 전원 공급 불안정 등이 해당된다.
2.2 통신 예외
분산 ROS2 시스템에서 노드 간 통신의 이상은 행동 제어에 직접적 영향을 미친다.
- 메시지 유실(message loss): DDS의 Best-Effort QoS 정책 하에서 네트워크 혼잡 또는 버퍼 초과로 인해 메시지가 유실되는 경우이다.
- 통신 지연(communication delay): 기대 응답 시간을 초과하는 지연이 발생하여 행동 제어 루프의 타이밍 제약을 위반하는 경우이다.
- 노드 단절(node disconnection): 행동 제어에 참여하는 노드가 비정상 종료되거나 네트워크에서 분리되는 경우이다.
- QoS 불일치(QoS mismatch): 발행자와 구독자 간 QoS 정책의 호환 불량으로 인해 통신이 수립되지 않는 경우이다.
2.3 소프트웨어 예외
행동 제어 소프트웨어 내부에서 발생하는 논리적·시스템적 오류를 포함한다.
- 프로그래밍 오류: 널 포인터 역참조(null pointer dereference), 배열 범위 초과(out-of-bounds access), 정수 오버플로우(integer overflow), 0으로 나누기(division by zero) 등이 해당된다.
- 논리적 오류: 행동 전이 조건의 논리적 결함, 교착 상태(deadlock), 경합 조건(race condition), 무한 루프 등이 포함된다.
- 자원 고갈(resource exhaustion): 메모리 누수(memory leak), 파일 디스크립터 고갈, CPU 과부하 등이 해당된다.
2.4 환경 예외
로봇이 동작하는 물리적 환경에서 예상치 못한 조건의 발생을 의미한다.
- 예상 외 장애물(unexpected obstacle): 사전 지도에 없는 장애물의 출현으로 인한 경로 차단이다.
- 환경 조건 변화: 조명 급변, 지면 상태 변화, 기상 조건 악화 등이 포함된다.
- 동적 객체 간섭(dynamic object interference): 예측 불가능한 이동 객체(보행자, 타 로봇 등)에 의한 간섭이다.
3. 예외 처리 전략의 아키텍처적 접근
3.1 방어적 프로그래밍
방어적 프로그래밍(defensive programming)은 예외 발생을 사전에 방지하기 위해, 입력 데이터의 유효성 검증(input validation), 전제 조건 검사(precondition check), 불변 조건 검증(invariant assertion)을 코드 수준에서 체계적으로 수행하는 전략이다.
행동 제어 시스템에서의 방어적 프로그래밍 기법은 다음과 같다.
- 센서 데이터 유효성 검증: 센서 데이터가 물리적으로 가능한 범위(예: LiDAR 거리 측정값이 양수이며 최대 측정 범위 이내) 내에 있는지를 매 수신 시 검증한다.
- 타임스탬프 검증: 수신된 메시지의 타임스탬프가 현재 시간과 허용 범위 내에 있는지를 확인하여, 지연되거나 순서가 역전된 메시지를 탐지한다.
- 상태 전이 조건 검증: 행동 전이 시 현재 상태와 전이 대상 상태가 합법적 전이(valid transition)인지를 상태 전이 테이블 또는 허용 전이 집합에 대하여 검증한다.
3.2 감시자 패턴
감시자(watchdog) 패턴은 행동 제어 시스템의 건전성(health)을 주기적으로 감시하고, 이상 탐지 시 사전 정의된 복구 절차를 기동하는 아키텍처 패턴이다.
하트비트 감시(heartbeat monitoring): 행동 제어 노드가 주기적으로 하트비트(heartbeat) 메시지를 발행하고, 감시자 노드가 하트비트의 수신 여부와 주기를 감시한다. 하트비트가 기대 주기 내에 도착하지 않으면, 해당 노드의 비정상 상태(hang, crash 등)로 판단하여 복구 절차를 개시한다.
타임아웃 감시(timeout monitoring): 행동의 실행 시간이 사전 정의된 최대 허용 시간(timeout)을 초과하면 이상으로 판단한다. ROS2 액션 서버에서는 목표(goal)의 실행 시간을 감시하여, 타임아웃 발생 시 목표를 취소(cancel)하거나 폴백 행동으로 전환한다.
리소스 감시(resource monitoring): CPU 사용률, 메모리 사용량, 디스크 여유 공간, 배터리 잔량 등의 시스템 자원을 주기적으로 감시하여, 임계치(threshold)를 초과하면 행동 제어 시스템에 경고를 발송하거나 행동 조정을 요청한다.
3.3 행동 트리에서의 예외 처리
BehaviorTree.CPP(Faconti, 2019) 기반 행동 트리에서는 트리 구조 자체에 예외 처리 논리를 내장할 수 있다.
폴백(Fallback) 노드: 폴백(또는 선택자, Selector) 노드는 자식 노드를 좌에서 우로 순차 실행하며, 첫 번째로 SUCCESS를 반환하는 자식이 발견되면 전체 노드가 SUCCESS를 반환한다. 주 행동이 FAILURE를 반환하면 대안 행동이 자동으로 시도되므로, 행동 수준의 예외 처리를 트리 구조로 명시적으로 표현할 수 있다.
데코레이터(Decorator) 노드를 활용한 예외 처리: 재시도(Retry) 데코레이터는 자식 노드가 FAILURE를 반환하면 지정된 횟수만큼 재시도한다. 타임아웃(Timeout) 데코레이터는 자식 노드의 실행 시간이 지정된 시간을 초과하면 FAILURE를 반환하여 타임아웃 기반 예외 처리를 구현한다. 역전(Inverter) 데코레이터는 자식 노드의 반환 결과를 역전시켜, 조건 검사(condition check)의 논리를 유연하게 구성한다.
블랙보드 기반 상태 전파: 예외 발생 시 블랙보드(blackboard)에 오류 코드, 오류 설명, 발생 시점 등의 정보를 기록하고, 상위 계층의 행동 노드가 이를 참조하여 적절한 복구 전략을 선택하도록 한다.
3.4 유한 상태 머신에서의 예외 처리
유한 상태 머신(FSM) 기반 행동 제어에서는 예외 상황을 전용 오류 상태(error state)로 모델링하는 것이 일반적이다.
전역 오류 전이(global error transition): 모든 정상 상태에서 오류 상태로의 전이를 정의한다. SMACH(Bohren and Cousins, 2010)에서는 smach.StateMachine의 outcome에 'error'를 추가하고, 각 상태의 출력 결과에 오류 전이를 매핑하여 구현한다.
오류 복구 하위 상태 머신(error recovery sub-state machine): 오류 상태에 진입한 후 복구 절차를 하위 상태 머신으로 구성한다. 복구가 성공하면 중단된 임무의 적절한 재개 지점으로 전이하고, 복구가 실패하면 안전 정지(safe stop) 상태로 전이한다.
최대 재시도 제한: 동일한 유형의 오류가 반복적으로 발생하면 재시도 횟수를 카운트하여, 최대 재시도 횟수를 초과한 경우 상위 계층의 의사결정 모듈에 에스컬레이션(escalation)한다.
4. ROS2에서의 예외 처리 메커니즘
4.1 네이티브 C++ 예외 처리
ROS2의 C++ 클라이언트 라이브러리(rclcpp)에서는 표준 C++ 예외 처리 메커니즘(try-catch)을 사용할 수 있다. 그러나 콜백(callback) 내부에서 발생한 미처리 예외(unhandled exception)는 실행자(executor)에 의해 포착되며, 이 경우 노드의 비정상 종료를 야기할 수 있으므로 주의가 필요하다.
행동 제어 콜백에서의 예외 처리 원칙은 다음과 같다.
- 콜백 함수의 최외곽에
try-catch블록을 배치하여, 미처리 예외가 실행자로 전파되는 것을 방지한다. - 예외 발생 시
RCLCPP_ERROR매크로를 통해 오류 정보를 로깅(logging)한다. - 예외의 유형에 따라 행동의 상태를 적절히 갱신(예: 액션 목표를 ABORTED로 설정)한다.
4.2 관리형 노드의 생명주기 예외 처리
ROS2의 관리형 노드(managed node, lifecycle node)는 상태 전이 콜백에서 예외 상황을 반영할 수 있다. on_configure(), on_activate(), on_deactivate(), on_cleanup(), on_shutdown() 등의 전이 콜백에서 CallbackReturn::FAILURE를 반환하면, 해당 전이가 거부되고 노드는 ErrorProcessing 상태로 진입한다. 이 메커니즘을 통해 행동 제어 노드의 초기화 실패, 활성화 조건 불만족 등의 예외를 체계적으로 처리할 수 있다.
4.3 액션 서버의 예외 처리
ROS2 액션 서버에서 행동 제어의 실행 중 예외가 발생하면, 목표 핸들(goal handle)의 abort() 메서드를 호출하여 목표를 중단(ABORTED) 상태로 전환하고, 결과 메시지에 오류 코드와 오류 설명을 포함시켜 클라이언트에게 원인 정보를 전달한다.
try {
// 행동 제어 로직 실행
execute_behavior(goal_handle);
} catch (const SensorTimeoutException& e) {
auto result = std::make_shared<ActionT::Result>();
result->error_code = ErrorCode::SENSOR_TIMEOUT;
result->error_message = e.what();
goal_handle->abort(result);
RCLCPP_ERROR(get_logger(), "행동 중단: %s", e.what());
}
위 예시에서 SensorTimeoutException은 센서 타임아웃에 특화된 사용자 정의 예외 클래스이다. 예외 유형별로 세분화된 예외 클래스를 정의하면, 클라이언트 측에서 오류 유형에 따른 분기 처리(branching)가 가능하다.
5. 복구 전략
5.1 재시도 전략
재시도(retry) 전략은 일시적 오류(transient fault)에 대해 동일 행동을 지정된 횟수만큼 반복 시도하는 가장 기본적인 복구 방법이다. 재시도 간격은 고정 간격(fixed interval), 지수 백오프(exponential backoff), 또는 적응적 간격(adaptive interval)으로 설정할 수 있다. 지수 백오프는 네트워크 혼잡이나 자원 경합 상황에서 시스템 부하를 점진적으로 완화하는 데 효과적이다.
5.2 대체 행동 전략
대체 행동(alternative behavior) 전략은 주 행동이 실패하였을 때 동일한 임무 목표를 달성할 수 있는 대안적 행동을 실행하는 방법이다. 예를 들어, 전방 장애물에 의해 직진 경로가 차단된 경우, 우회 경로를 통한 네비게이션 행동으로 전환하는 것이 대표적이다. 행동 트리에서는 폴백 노드를 통해 대체 행동을 자연스럽게 구조화할 수 있다.
5.3 안전 정지 전략
복구가 불가능하거나 안전 위험이 예상되는 경우, 로봇을 안전한 상태(safe state)로 전이시키는 안전 정지(safe stop) 전략을 적용한다. 안전 정지 전략은 다음의 단계를 포함할 수 있다.
- 현재 실행 중인 모든 행동을 즉시 중단한다.
- 액추에이터에 정지 명령을 발송한다.
- 비상 정지(emergency stop) 토픽에 정지 신호를 발행한다.
- 로봇의 현재 상태와 오류 정보를 로깅하고 원격 관제 시스템에 통보한다.
- 운용자의 수동 개입(manual intervention)을 대기한다.
5.4 점진적 성능 저하 전략
점진적 성능 저하(graceful degradation) 전략은 시스템의 일부 구성 요소에 결함이 발생하더라도, 가용한 구성 요소만으로 축소된 기능을 유지하는 접근법이다(Laprie, 1992). 예를 들어, 하나의 센서가 고장 난 경우 나머지 센서 데이터만으로 행동 제어를 계속 수행하거나, 정밀한 작업 대신 안전한 대기 위치로의 복귀 행동만을 실행하는 것이 해당된다. 이 전략은 고가용성(high availability)이 요구되는 임무에서 필수적이다.
6. 예외 처리의 설계 원칙
행동 제어 시스템의 예외 처리를 설계할 때 준수해야 하는 원칙은 다음과 같다.
- 실패 가정 원칙(Design for Failure): 모든 행동은 실패할 수 있다는 전제 하에 설계하며, 각 행동에 대해 실패 시의 대응 경로를 사전에 정의한다.
- 안전 우선 원칙(Safety First): 예외 처리의 모든 경로는 로봇과 주변 환경의 안전을 최우선으로 보장하여야 한다.
- 최소 놀라움 원칙(Principle of Least Surprise): 예외 처리의 결과가 운용자와 관찰자에게 예측 가능하고 직관적이어야 한다.
- 명시적 오류 전파(Explicit Error Propagation): 예외 정보(오류 유형, 발생 위치, 발생 시점, 원인 추정)를 명시적으로 상위 계층에 전달하여, 상위 계층의 적절한 의사결정을 지원한다.
- 결정론적 예외 처리(Deterministic Exception Handling): 동일한 예외 조건에 대해 항상 동일한 복구 행동이 실행되어야 하며, 비결정적 요소에 의한 예외 처리 결과의 변동을 최소화한다.
참고 문헌
- Bohren, J. & Cousins, S. (2010). “The SMACH High-Level Executive.” IEEE Robotics & Automation Magazine, 17(4), 18–20.
- Faconti, D. (2019). BehaviorTree.CPP: A C++ library to create Behavior Trees. GitHub Repository.
- Laprie, J. C. (1992). Dependability: Basic Concepts and Terminology. Springer-Verlag.
- Lee, E. A. (2006). “The Problem with Threads.” IEEE Computer, 39(5), 33–42.
- Macenski, S., Foote, T., Gerkey, B., Lalancette, C., & Woodall, W. (2022). “Robot Operating System 2: Design, Architecture, and Uses in the Wild.” Science Robotics, 7(66), eabm6074.
v0.2.0