1261.72 행동 제어 시스템의 로깅과 진단

1. 로깅과 진단의 정의 및 역할

행동 제어 시스템의 로깅(logging)이란, 행동 제어 소프트웨어의 실행 과정에서 발생하는 이벤트, 상태 변화, 데이터 흐름, 오류 등의 정보를 시간 순서에 따라 체계적으로 기록하는 활동을 의미한다. 진단(diagnostics)이란, 기록된 로그 데이터와 실시간 시스템 상태 정보를 분석하여 행동 제어 시스템의 건전성(health), 성능, 이상 상태를 판별하고 원인을 추적하는 활동이다.

로깅과 진단은 행동 제어 시스템의 개발, 테스트, 운용, 유지보수 전 단계에 걸쳐 필수적인 기능이다. 개발 단계에서는 행동 로직의 정확성 확인과 결함 발견에 활용되며, 운용 단계에서는 현장에서 발생하는 이상 동작의 원인 분석과 사후 검토(post-mortem analysis)에 활용된다. 안전 필수(safety-critical) 로봇 시스템에서는 로깅 기록이 사고 조사와 규제 준수의 증거 자료로서 법적 요건을 충족해야 한다.

2. 로깅 수준과 분류

2.1 심각도 기반 로깅 수준

행동 제어 시스템의 로그 메시지는 심각도(severity)에 따라 계층적으로 분류된다. ROS2의 로깅 시스템(rcutils 기반)은 다음의 심각도 수준을 정의한다.

심각도 수준용도
DEBUG개발 과정에서의 상세한 내부 상태 추적. 운용 환경에서는 비활성화하는 것이 일반적이다.
INFO행동 제어 시스템의 정상적인 운용 상태 기록. 행동 시작, 완료, 상태 전이 등의 이벤트를 기록한다.
WARN잠재적 문제를 나타내지만 즉각적인 기능 장애는 발생하지 않은 상황. 센서 값의 허용 범위 경계 접근, 연산 시간 초과 경고 등이 해당한다.
ERROR특정 기능의 실패가 발생한 상황. 행동 실행 실패, 통신 오류, 리소스 할당 실패 등이 해당한다.
FATAL시스템의 지속적 운용이 불가능한 치명적 오류. 비상 정지 발동, 핵심 노드 비정상 종료 등이 해당한다.

로깅 수준의 적절한 설정은 시스템 성능과 진단 효과 사이의 균형을 결정한다. 과도한 로깅은 저장 공간 소비와 실시간 성능 저하를 유발하며, 불충분한 로깅은 이상 상황의 원인 분석을 어렵게 만든다.

2.2 행동 제어 특화 로깅 항목

행동 제어 시스템에서는 일반적인 소프트웨어 로깅 항목에 더하여, 행동 제어에 특화된 다음의 항목을 기록해야 한다.

  • 행동 상태 전이: 각 행동의 상태(IDLE → RUNNING → SUCCESS/FAILURE/CANCELLED) 전이 시점과 전이 사유
  • 행동 트리/상태 머신 틱(tick): 행동 트리의 매 틱(tick) 시점에서 활성 노드, 반환 상태, 블랙보드(blackboard) 데이터 스냅샷
  • 액션 통신 이벤트: 목표 수신, 수락/거부, 피드백 발행, 결과 전송, 취소 요청 등의 액션 생명주기 이벤트
  • 센서-행동 매핑: 특정 센서 입력이 행동 결정에 기여한 인과 관계
  • 시간 성능 지표: 행동 제어 루프의 실행 주기, 콜백 처리 시간, 추론 소요 시간

3. ROS2 로깅 인프라

3.1 rcutils 로깅 시스템

ROS2의 로깅 인프라는 rcutils 라이브러리에 기반한다. C++ 클라이언트 라이브러리(rclcpp)에서는 RCLCPP_DEBUG(), RCLCPP_INFO(), RCLCPP_WARN(), RCLCPP_ERROR(), RCLCPP_FATAL() 매크로를 통해 노드별 로깅을 수행한다. Python 클라이언트 라이브러리(rclpy)에서는 self.get_logger().info() 등의 메서드를 사용한다.

ROS2 로깅 시스템의 주요 특성은 다음과 같다.

  • 노드 기반 네임스페이스: 각 노드의 이름이 로거 이름으로 사용되어, 노드 단위의 로깅 수준 제어가 가능하다.
  • 런타임 수준 변경: 실행 중 로깅 수준을 동적으로 변경할 수 있어, 운용 중 필요 시 상세 로깅을 임시적으로 활성화할 수 있다.
  • 출력 대상 다중화: 로그 메시지를 표준 출력(stdout), 파일, ROS2 토픽(/rosout) 등 복수의 출력 대상으로 동시에 전달할 수 있다.

3.2 rosbag2를 이용한 데이터 로깅

rosbag2는 ROS2 토픽 메시지를 시간 정보와 함께 기록하고 재생하는 도구이다. 행동 제어 시스템의 진단을 위해, 센서 데이터, 행동 명령, 액션 피드백, 시스템 상태 등의 토픽을 rosbag2로 기록하면, 사후 분석(post-hoc analysis)에서 행동 제어 시스템의 실행 과정을 시간 순서대로 재구성할 수 있다.

rosbag2는 SQLite3, MCAP 등 복수의 저장 플러그인을 지원하며, 대용량 센서 데이터(카메라 영상, 점군 데이터 등)의 효율적 기록을 위한 압축 및 필터링 기능을 제공한다.

4. 진단 시스템

4.1 ROS2 diagnostics 프레임워크

ROS2는 diagnostic_msgs 메시지 타입과 diagnostic_updater, diagnostic_aggregator 패키지를 통해 표준화된 진단 프레임워크를 제공한다. 이 프레임워크는 하드웨어 상태, 소프트웨어 모듈 상태, 통신 상태 등을 통합적으로 모니터링하고 보고하는 체계를 제공한다.

diagnostic_updater를 사용하여 각 행동 제어 노드는 자체 진단 정보를 주기적으로 발행한다. 진단 정보에는 다음의 항목이 포함된다.

  • 노드의 동작 상태(OK, WARN, ERROR, STALE)
  • 행동 제어 루프의 실제 실행 주기와 목표 주기의 편차
  • 센서 데이터 수신 빈도와 기대 빈도의 비교
  • 리소스 사용량(CPU 점유율, 메모리 사용량)
  • 통신 상태(토픽 구독 연결 수, 메시지 손실률)

diagnostic_aggregator는 다수의 노드에서 발행하는 진단 정보를 집계하여, 시스템 전체의 건전성 상태를 계층적으로 요약한다.

4.2 행동 제어 전용 진단 항목

행동 제어 시스템의 특수한 진단 요구를 충족하기 위해, 다음의 전용 진단 항목을 정의하여 운용한다.

행동 실행 통계:

  • 각 행동의 성공/실패/취소 횟수와 비율
  • 행동별 평균 실행 시간과 최대 실행 시간
  • 행동 전이 빈도와 패턴

행동 트리 진단:

  • 현재 활성 행동 노드의 경로(root-to-leaf path)
  • 블랙보드 변수의 현재 값과 변경 이력
  • 조건 노드의 평가 결과 이력

통신 건전성 진단:

  • 액션 서버의 활성 목표(active goal) 수
  • 피드백 발행 주기의 안정성
  • 목표 큐(goal queue)의 깊이와 대기 시간

5. 구조화된 로깅

5.1 구조화된 로그 형식

전통적인 비구조화 텍스트 로그는 인간 가독성은 높으나, 자동화된 분석과 검색에 한계가 있다. 구조화된 로깅(structured logging)은 로그 메시지를 JSON, CBOR 등의 기계 판독 가능한(machine-readable) 형식으로 기록하여, 자동화된 분석 파이프라인과의 통합을 용이하게 한다.

행동 제어 이벤트의 구조화된 로그 항목은 다음의 필드를 포함한다.

  • timestamp: 이벤트 발생 시각(나노초 해상도)
  • node_name: 이벤트를 발생시킨 노드의 이름
  • event_type: 이벤트 유형(behavior_transition, goal_received, feedback_published 등)
  • behavior_id: 관련 행동의 식별자
  • from_state: 전이 이전 상태
  • to_state: 전이 이후 상태
  • context: 이벤트의 추가적 컨텍스트 정보

5.2 분산 추적

분산 행동 제어 시스템에서는 단일 행동의 실행이 다수의 노드에 걸쳐 이루어지며, 각 노드의 로그를 개별적으로 분석하는 것만으로는 행동의 전체적 흐름을 파악하기 어렵다. 분산 추적(distributed tracing)은 단일 행동 또는 임무의 실행 과정을 노드 간에 걸쳐 추적할 수 있는 고유 상관 식별자(correlation ID)를 부여하여, 분산 시스템에서의 이벤트 인과 관계를 재구성하는 기법이다.

OpenTelemetry와 같은 분산 추적 프레임워크를 ROS2 행동 제어 시스템에 통합하면, 행동 목표의 수신, 행동 트리의 평가, 하위 행동의 실행, 결과의 반환에 이르는 전체 경로를 시각화하고 병목 지점을 식별할 수 있다. ROS2 프로젝트에서는 ros2_tracing 패키지가 LTTng(Linux Trace Toolkit next generation) 기반의 저오버헤드 추적을 제공한다.

6. 실시간 모니터링

6.1 실시간 상태 시각화

행동 제어 시스템의 운용 중 실시간 모니터링을 위해, 행동 상태, 센서 데이터, 통신 상태 등을 시각적으로 표시하는 대시보드(dashboard)를 구축한다. ROS2 생태계에서는 다음의 도구가 실시간 모니터링에 활용된다.

  • rqt: Qt 기반의 ROS2 GUI 프레임워크로, 토픽 모니터링(rqt_topic), 노드 그래프 시각화(rqt_graph), 파라미터 관리(rqt_reconfigure) 등의 플러그인을 제공한다.
  • Foxglove Studio: 웹 기반의 로봇 데이터 시각화 플랫폼으로, 실시간 토픽 모니터링, 3D 시각화, 로그 분석 등을 통합적으로 지원한다.
  • Groot2: BehaviorTree.CPP의 공식 시각화 도구로, 행동 트리의 실시간 실행 상태를 그래프 형태로 시각화한다.

6.2 경보 시스템

진단 정보를 기반으로, 행동 제어 시스템의 이상 상태를 자동으로 감지하고 경보(alert)를 발생시키는 체계가 필요하다. 경보 조건의 예는 다음과 같다.

  • 행동 제어 루프의 실행 주기가 허용 범위를 초과한 경우
  • 특정 행동의 연속 실패 횟수가 임계값을 초과한 경우
  • 센서 데이터 수신이 일정 시간 이상 중단된 경우
  • 시스템 리소스(CPU, 메모리) 사용량이 임계값을 초과한 경우

경보는 심각도에 따라 단계적으로 대응 조치를 취한다. 경미한 경보는 운영자에게 통보하는 수준에 그치며, 심각한 경보는 자동 비상 정지(emergency stop) 또는 안전 행동(safe behavior)으로의 자동 전환을 유발한다.

7. 로깅 성능과 실시간 제약

행동 제어 시스템에서 로깅 활동은 실시간 성능에 미치는 영향을 최소화해야 한다. 파일 입출력, 네트워크 전송 등의 로깅 작업이 행동 제어 루프의 실행 시간을 지연시키는 것은 허용될 수 없다.

이를 위한 설계 원칙은 다음과 같다.

  • 비동기 로깅(asynchronous logging): 로그 메시지를 잠금 없는 큐(lock-free queue)에 저장하고, 별도의 저우선순위(low-priority) 스레드에서 파일 기록이나 네트워크 전송을 처리한다.
  • 조건부 로깅(conditional logging): 로깅 수준이 비활성화된 메시지의 문자열 포맷팅 비용을 회피하기 위해, 매크로를 통한 컴파일 시점 또는 런타임 수준 확인을 수행한다.
  • 샘플링 기반 로깅(sampled logging): 고빈도 이벤트(센서 데이터 수신, 틱 등)에 대해서는 N회 중 1회만 로깅하는 샘플링 정책을 적용한다.
  • 환형 버퍼(ring buffer) 로깅: 고정 크기의 환형 버퍼에 최근 로그만 유지하고, 이상 상태 발생 시에만 버퍼 내용을 영구 저장소에 기록하는 방식이다.

참고 문헌

  • Maruyama, Y., Kato, S., & Azumi, T. (2016). “Exploring the Performance of ROS2.” Proceedings of the 13th International Conference on Embedded Software (EMSOFT).
  • Bédard, C., Lütkebohle, I., & Dagenais, M. (2022). “ros2_tracing: Multipurpose Low-Overhead Framework for Real-Time Tracing of ROS 2.” IEEE Robotics and Automation Letters, 7(3), 6511–6518.
  • Olson, T. (2020). Structured Logging in Distributed Systems. O’Reilly Media.
  • IEC 62443 (2018). Industrial Communication Networks — Network and System Security.

v0.1.0