rqt_console 소개

rqt_console는 ROS2에서 로그 메시지를 확인하고 관리할 수 있는 도구이다. 이는 개발자가 ROS2 노드에서 발생하는 로그 메시지를 실시간으로 확인하고, 필요에 따라 필터링할 수 있게 도와준다. rqt_console는 로그의 심각도(Severity Level)를 기준으로 메시지를 분류하여 디버깅 작업을 보다 효율적으로 할 수 있도록 한다.

주요 기능

  1. 실시간 로그 보기: rqt_console는 노드에서 생성된 로그 메시지를 실시간으로 보여주며, 시스템 상태를 파악하는 데 도움을 준다.
  2. 필터링: 심각도 또는 특정 키워드를 기준으로 로그 메시지를 필터링할 수 있다.
  3. 검색 기능: 과거 로그 메시지에서도 특정 메시지를 검색할 수 있어, 디버깅 과정에서 필요한 정보를 쉽게 찾을 수 있다.

실행 방법

rqt_console는 ROS2 시스템 상에서 다음 명령어를 통해 실행할 수 있다:

ros2 run rqt_console rqt_console

명령어를 실행하면 GUI 창이 뜨며, 이곳에서 각종 로그 메시지를 실시간으로 확인하고 필터링할 수 있다.

rqt_logger_level 소개

rqt_logger_level는 ROS2 노드의 로그 레벨을 실시간으로 조정할 수 있는 도구이다. 기본적으로 ROS2에서는 로그 레벨이 DEBUG, INFO, WARN, ERROR, FATAL의 5가지로 나뉘며, 개발자는 이 도구를 통해 원하는 노드의 로그 수준을 조정하여 필요 없는 로그는 무시하고 중요한 정보만을 확인할 수 있다.

주요 기능

  1. 로그 레벨 실시간 변경: 특정 노드의 로그 레벨을 실시간으로 변경할 수 있다. 이를 통해 개발자는 디버깅 중에 로그의 양을 조절할 수 있다.
  2. 여러 노드 관리: rqt_logger_level은 다수의 노드를 동시에 관리할 수 있으며, 각 노드에 대해 별도의 로그 레벨을 설정할 수 있다.

실행 방법

rqt_logger_level는 다음 명령어로 실행할 수 있다:

ros2 run rqt_logger_level rqt_logger_level

이 명령어를 실행하면 GUI가 나타나고, 해당 창에서 활성화된 ROS2 노드들의 로그 레벨을 확인하고 변경할 수 있다.

로그 레벨의 종류

로그 레벨은 총 5가지로 분류되며, 각 레벨은 로그의 중요도를 나타낸다:

  1. DEBUG: 디버깅에 관련된 정보. 주로 개발 중에 필요한 세부 정보.
  2. INFO: 시스템의 정상적인 상태를 나타내는 정보.
  3. WARN: 주의가 필요한 상태를 나타내는 정보. 시스템이 정상적으로 동작하지만 주의가 필요함.
  4. ERROR: 시스템에 문제가 발생한 상황.
  5. FATAL: 치명적인 오류가 발생한 상황으로, 즉각적인 조치가 필요함.

예제

다음은 ROS2 노드 my_node의 로그 레벨을 DEBUG에서 WARN으로 변경하는 예이다:

ros2 run rqt_logger_level rqt_logger_level

GUI에서 my_node를 선택하고 로그 레벨을 WARN으로 설정한다.

rqt_console와 rqt_logger_level의 연동

두 도구는 연동되어 사용되기도 한다. rqt_logger_level로 로그 레벨을 조정한 후, rqt_console에서 해당 레벨 이상의 로그만 출력되도록 할 수 있다. 예를 들어, rqt_logger_level에서 로그 레벨을 ERROR로 설정하면 rqt_console에서는 ERRORFATAL 로그만 출력된다.

로그 레벨 조정 시 고려 사항

실시간 로그 레벨 변경은 디버깅 중에 매우 유용하지만, 다음 사항을 고려해야 한다:

rqt_console 필터링

rqt_console의 가장 강력한 기능 중 하나는 필터링 기능이다. 이를 통해 특정 심각도 또는 특정 노드에서 발생한 로그만을 확인할 수 있다. 예를 들어, 전체 로그 메시지 중에서 ERROR 수준 이상의 로그만 보고 싶다면 다음과 같이 설정할 수 있다.

  1. 필터링 설정: GUI 상단에서 필터 버튼을 클릭한다.
  2. 심각도 선택: 심각도 선택 옵션에서 ERROR 또는 그 이상의 수준만 선택한다.
  3. 특정 노드 로그 확인: 특정 노드에서 발생한 로그만 보고 싶다면 노드 이름을 입력한다.

이러한 필터링을 통해 개발자는 불필요한 로그 메시지를 무시하고, 중요한 정보만을 집중적으로 확인할 수 있다. 필터링 규칙은 여러 개 설정할 수 있으며, 각각의 규칙에 대해 AND, OR 등의 논리 연산을 적용할 수도 있다.

필터링 예제

다음은 특정 노드 my_node에서 발생한 ERROR 수준 이상의 로그만 확인하는 필터링 설정이다.

  1. rqt_console 실행 후 필터 버튼을 클릭한다.
  2. 필터 규칙에서 노드 이름으로 my_node를 입력한다.
  3. 로그 심각도에서 ERRORFATAL 수준만 선택한다.
  4. 필터를 적용하면 해당 조건에 맞는 로그만 화면에 표시된다.

로그 메시지 포맷

ROS2 로그 메시지는 다음과 같은 구조로 출력된다:

[시간] [심각도] [노드명] [파일명:라인번호] [메시지 내용]

예를 들어, 아래와 같은 로그 메시지를 통해 문제를 추적할 수 있다:

[1629991810.123456] [ERROR] [my_node]: /home/user/my_package/src/my_node.cpp:42: Something went wrong

이 로그 메시지에서 각 요소는 다음과 같은 의미를 가진다: - 시간: 로그가 발생한 타임스탬프 - 심각도: 로그의 심각도 (ERROR 수준) - 노드명: 로그가 발생한 ROS2 노드 이름 (my_node) - 파일명:라인번호: 로그가 발생한 파일과 라인 (my_node.cpp, 42번 줄) - 메시지 내용: 로그의 실제 내용

로그 메시지 포맷은 일관되게 적용되어 있어, 이를 통해 로그 파일이나 실시간 로그 스트림에서 문제를 신속히 파악할 수 있다.

rqt_logger_level와 rqt_console의 실습

시나리오 1: 로그 레벨 변경 실습

  1. rqt_logger_level을 통해 특정 노드 example_node의 로그 레벨을 DEBUG로 설정한다.
  2. rqt_console에서 해당 노드의 로그를 실시간으로 확인한다.
  3. 필터링을 통해 INFO 이상의 로그만 보도록 설정한다.
  4. example_node에서 특정 작업을 수행하면서, 로그가 어떻게 변화하는지 확인한다.

이 과정을 통해 실시간 로그 레벨 변경과 필터링을 적용하는 방법을 익힐 수 있다.

시나리오 2: 성능 최적화를 위한 로그 레벨 관리

  1. rqt_logger_level에서 여러 노드의 로그 레벨을 각각 다르게 설정한다. 예를 들어, 자주 사용하는 노드는 INFO로, 중요하지 않은 노드는 WARN으로 설정한다.
  2. 시스템 성능에 미치는 영향을 관찰하고, 로그 레벨이 시스템 성능에 미치는 영향을 확인한다.

이와 같은 실습을 통해 성능 최적화를 위해 적절한 로그 레벨을 설정하는 방법을 배우게 된다.

rqt_console와 rqt_logger_level의 통합적 사용

rqt_consolerqt_logger_level은 함께 사용될 때 더 큰 효율성을 발휘한다. rqt_logger_level로 각 노드의 로그 수준을 적절히 설정하고, rqt_console에서 필터링과 검색을 통해 로그 메시지를 분석하는 것이 효과적인 디버깅 방법이다.

예를 들어, 큰 시스템에서 여러 노드가 동시에 실행 중일 때, 모든 노드의 로그를 무작위로 확인하는 것은 비효율적이다. 대신, rqt_logger_level로 중요한 노드의 로그 수준을 INFO 또는 DEBUG로 설정한 후, rqt_console에서 해당 노드의 로그만 필터링해 확인하면 디버깅 작업이 훨씬 수월해진다.