rqt_console 소개
rqt_console
는 ROS2에서 로그 메시지를 확인하고 관리할 수 있는 도구이다. 이는 개발자가 ROS2 노드에서 발생하는 로그 메시지를 실시간으로 확인하고, 필요에 따라 필터링할 수 있게 도와준다. rqt_console
는 로그의 심각도(Severity Level)를 기준으로 메시지를 분류하여 디버깅 작업을 보다 효율적으로 할 수 있도록 한다.
주요 기능
- 실시간 로그 보기:
rqt_console
는 노드에서 생성된 로그 메시지를 실시간으로 보여주며, 시스템 상태를 파악하는 데 도움을 준다. - 필터링: 심각도 또는 특정 키워드를 기준으로 로그 메시지를 필터링할 수 있다.
- 검색 기능: 과거 로그 메시지에서도 특정 메시지를 검색할 수 있어, 디버깅 과정에서 필요한 정보를 쉽게 찾을 수 있다.
실행 방법
rqt_console
는 ROS2 시스템 상에서 다음 명령어를 통해 실행할 수 있다:
ros2 run rqt_console rqt_console
명령어를 실행하면 GUI 창이 뜨며, 이곳에서 각종 로그 메시지를 실시간으로 확인하고 필터링할 수 있다.
rqt_logger_level 소개
rqt_logger_level
는 ROS2 노드의 로그 레벨을 실시간으로 조정할 수 있는 도구이다. 기본적으로 ROS2에서는 로그 레벨이 DEBUG
, INFO
, WARN
, ERROR
, FATAL
의 5가지로 나뉘며, 개발자는 이 도구를 통해 원하는 노드의 로그 수준을 조정하여 필요 없는 로그는 무시하고 중요한 정보만을 확인할 수 있다.
주요 기능
- 로그 레벨 실시간 변경: 특정 노드의 로그 레벨을 실시간으로 변경할 수 있다. 이를 통해 개발자는 디버깅 중에 로그의 양을 조절할 수 있다.
- 여러 노드 관리:
rqt_logger_level
은 다수의 노드를 동시에 관리할 수 있으며, 각 노드에 대해 별도의 로그 레벨을 설정할 수 있다.
실행 방법
rqt_logger_level
는 다음 명령어로 실행할 수 있다:
ros2 run rqt_logger_level rqt_logger_level
이 명령어를 실행하면 GUI가 나타나고, 해당 창에서 활성화된 ROS2 노드들의 로그 레벨을 확인하고 변경할 수 있다.
로그 레벨의 종류
로그 레벨은 총 5가지로 분류되며, 각 레벨은 로그의 중요도를 나타낸다:
- DEBUG: 디버깅에 관련된 정보. 주로 개발 중에 필요한 세부 정보.
- INFO: 시스템의 정상적인 상태를 나타내는 정보.
- WARN: 주의가 필요한 상태를 나타내는 정보. 시스템이 정상적으로 동작하지만 주의가 필요함.
- ERROR: 시스템에 문제가 발생한 상황.
- 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
에서는 ERROR
와 FATAL
로그만 출력된다.
로그 레벨 조정 시 고려 사항
실시간 로그 레벨 변경은 디버깅 중에 매우 유용하지만, 다음 사항을 고려해야 한다:
- 성능: 로그 레벨이
DEBUG
로 설정된 경우 불필요하게 많은 로그가 출력될 수 있어 시스템 성능에 영향을 미칠 수 있다. - 로그 관리: 너무 많은 로그는 디버깅에 오히려 방해가 될 수 있으므로, 적절한 로그 레벨을 설정하는 것이 중요하다.
rqt_console 필터링
rqt_console
의 가장 강력한 기능 중 하나는 필터링 기능이다. 이를 통해 특정 심각도 또는 특정 노드에서 발생한 로그만을 확인할 수 있다. 예를 들어, 전체 로그 메시지 중에서 ERROR
수준 이상의 로그만 보고 싶다면 다음과 같이 설정할 수 있다.
- 필터링 설정: GUI 상단에서 필터 버튼을 클릭한다.
- 심각도 선택: 심각도 선택 옵션에서
ERROR
또는 그 이상의 수준만 선택한다. - 특정 노드 로그 확인: 특정 노드에서 발생한 로그만 보고 싶다면 노드 이름을 입력한다.
이러한 필터링을 통해 개발자는 불필요한 로그 메시지를 무시하고, 중요한 정보만을 집중적으로 확인할 수 있다. 필터링 규칙은 여러 개 설정할 수 있으며, 각각의 규칙에 대해 AND, OR 등의 논리 연산을 적용할 수도 있다.
필터링 예제
다음은 특정 노드 my_node
에서 발생한 ERROR
수준 이상의 로그만 확인하는 필터링 설정이다.
rqt_console
실행 후 필터 버튼을 클릭한다.- 필터 규칙에서 노드 이름으로
my_node
를 입력한다. - 로그 심각도에서
ERROR
및FATAL
수준만 선택한다. - 필터를 적용하면 해당 조건에 맞는 로그만 화면에 표시된다.
로그 메시지 포맷
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: 로그 레벨 변경 실습
rqt_logger_level
을 통해 특정 노드example_node
의 로그 레벨을DEBUG
로 설정한다.rqt_console
에서 해당 노드의 로그를 실시간으로 확인한다.- 필터링을 통해
INFO
이상의 로그만 보도록 설정한다. example_node
에서 특정 작업을 수행하면서, 로그가 어떻게 변화하는지 확인한다.
이 과정을 통해 실시간 로그 레벨 변경과 필터링을 적용하는 방법을 익힐 수 있다.
시나리오 2: 성능 최적화를 위한 로그 레벨 관리
rqt_logger_level
에서 여러 노드의 로그 레벨을 각각 다르게 설정한다. 예를 들어, 자주 사용하는 노드는INFO
로, 중요하지 않은 노드는WARN
으로 설정한다.- 시스템 성능에 미치는 영향을 관찰하고, 로그 레벨이 시스템 성능에 미치는 영향을 확인한다.
이와 같은 실습을 통해 성능 최적화를 위해 적절한 로그 레벨을 설정하는 방법을 배우게 된다.
rqt_console와 rqt_logger_level의 통합적 사용
rqt_console
와 rqt_logger_level
은 함께 사용될 때 더 큰 효율성을 발휘한다. rqt_logger_level
로 각 노드의 로그 수준을 적절히 설정하고, rqt_console
에서 필터링과 검색을 통해 로그 메시지를 분석하는 것이 효과적인 디버깅 방법이다.
예를 들어, 큰 시스템에서 여러 노드가 동시에 실행 중일 때, 모든 노드의 로그를 무작위로 확인하는 것은 비효율적이다. 대신, rqt_logger_level
로 중요한 노드의 로그 수준을 INFO
또는 DEBUG
로 설정한 후, rqt_console
에서 해당 노드의 로그만 필터링해 확인하면 디버깅 작업이 훨씬 수월해진다.