ROS2에서 로그 및 디버깅을 효과적으로 하기 위해 다양한 도구들이 제공된다. 이 도구들은 시스템의 상태를 모니터링하고, 잠재적인 오류를 파악하며, 성능 병목을 진단하는 데 유용하다. 본 절에서는 ROS2의 디버깅 도구에 대한 설명과 그 사용법을 다룬다.
1. rqt_console와 rqt_logger_level
ROS2는 rqt_console
과 rqt_logger_level
이라는 GUI 기반의 로그 모니터링 및 로그 레벨 설정 툴을 제공한다. 이를 통해 노드에서 발생하는 로그 메시지를 실시간으로 확인하고, 필요한 경우 로그 레벨을 동적으로 변경할 수 있다.
rqt_console 사용법
rqt_console
은 ROS2 노드에서 생성된 로그 메시지를 실시간으로 볼 수 있는 GUI 도구이다. 이를 실행하려면 다음 명령어를 사용할 수 있다.
rqt_console
이 툴은 로그 메시지 필터링 기능을 제공하며, 특정 노드의 로그 메시지만을 선택적으로 볼 수 있다. 필터링 옵션은 메시지의 심각도(예: DEBUG, INFO, WARN, ERROR, FATAL)에 따라 로그를 분류할 수 있다. 다음과 같은 로그 레벨을 지원한다:
- DEBUG: 디버깅을 위한 상세한 정보
- INFO: 일반적인 정보 메시지
- WARN: 경고, 하지만 시스템이 계속 작동할 수 있는 상태
- ERROR: 치명적인 에러가 발생했을 때 기록되는 메시지
- FATAL: 시스템이 작동을 멈추는 치명적인 오류
rqt_logger_level 사용법
rqt_logger_level
은 각 노드의 로그 레벨을 동적으로 변경할 수 있는 툴이다. 이는 시스템의 성능에 영향을 주지 않으면서도 특정 노드의 디버깅 정보를 얻고자 할 때 유용하다.
rqt_logger_level
이 툴을 실행하면, 현재 활성화된 노드들의 목록이 표시되며, 각 노드의 로그 레벨을 설정할 수 있다. 로그 레벨을 변경하면 해당 노드의 로그 메시지 출력이 실시간으로 변경되며, 이를 통해 특정 문제를 진단할 때 필요한 로그 레벨만 활성화할 수 있다.
2. ROS2 CLI 디버깅 도구
ROS2는 명령줄 인터페이스(CLI)를 통해 다양한 디버깅 명령어를 제공한다. 이를 활용하여 토픽, 서비스, 액션의 상태를 모니터링하거나 노드 간의 통신을 디버깅할 수 있다.
ros2 topic 명령어
ros2 topic
명령어는 ROS2 토픽과 관련된 디버깅을 할 때 유용하다. 이를 통해 활성화된 토픽을 확인하고, 특정 토픽의 메시지를 구독하거나 퍼블리셔의 상태를 모니터링할 수 있다.
다음 명령어로 현재 활성화된 모든 토픽을 나열할 수 있다:
ros2 topic list
특정 토픽의 메시지 유형을 확인하려면:
ros2 topic type /토픽_이름
특정 토픽의 데이터를 구독하여 실시간으로 메시지를 확인하고자 할 경우:
ros2 topic echo /토픽_이름
또한, ros2 topic info /토픽_이름
명령어를 사용하여 퍼블리셔와 서브스크라이버의 상태를 확인할 수 있다.
ros2 service 명령어
ros2 service
명령어는 서비스에 대한 정보를 제공한다. 이를 통해 현재 활성화된 서비스를 확인하고, 특정 서비스에 요청을 보내거나 응답을 받을 수 있다.
모든 활성화된 서비스를 나열하려면:
ros2 service list
특정 서비스의 유형을 확인하려면:
ros2 service type /서비스_이름
특정 서비스에 요청을 보내려면:
ros2 service call /서비스_이름 서비스_타입 "요청_데이터"
ros2 node 명령어
ros2 node
명령어는 ROS2 노드에 대한 정보를 제공하며, 현재 활성화된 노드를 나열하고, 각 노드의 상태를 확인할 수 있다.
ros2 node list
특정 노드에서 퍼블리싱하고 있는 토픽이나 사용하고 있는 서비스, 액션을 확인할 수 있다:
ros2 node info /노드_이름
3. ros2_tracing
ros2_tracing
은 ROS2의 성능을 측정하고 분석하는 데 유용한 도구이다. 이 도구는 시스템의 성능 병목을 찾아내는 데 도움을 준다. ros2_tracing
을 사용하면 노드 간 통신의 지연, 메시지 전달 시간, 그리고 노드의 실행 시간을 측정할 수 있다.
먼저 ros2_tracing
패키지를 설치해야 한다:
sudo apt install ros-<ros2_distro>-ros2-tracing
4. Visualizing Data in rviz
디버깅 시 시스템의 상태나 로봇의 위치 등을 시각적으로 모니터링할 때 rviz
는 매우 유용하다. 이를 통해 실시간으로 데이터가 어떻게 흘러가는지 파악할 수 있다.
rviz2
rviz에서는 다양한 메시지를 시각화할 수 있으며, 특히 토픽에 퍼블리시되는 데이터를 화면에 표시하여 문제가 발생한 영역을 쉽게 파악할 수 있다.
5. gdb와 valgrind
ROS2 노드의 C++ 코드를 디버깅할 때는 gdb
와 valgrind
같은 표준 디버깅 툴을 활용할 수 있다. 이들 도구는 C++ 노드의 메모리 누수, 비정상 종료, 성능 문제를 진단하는 데 도움을 준다.
gdb 사용법
gdb
는 프로그램이 비정상적으로 종료되었을 때 그 원인을 추적할 수 있는 강력한 도구이다. ROS2 노드를 gdb
와 함께 실행하면, 프로그램이 충돌할 경우 정확히 어느 부분에서 오류가 발생했는지 확인할 수 있다. 이를 실행하려면 ROS2 노드를 gdb
로 감싸서 실행해야 한다.
gdb --args ros2 run 패키지_이름 노드_이름
그 후 run
명령어를 통해 노드를 실행할 수 있다. 프로그램이 비정상적으로 종료되면, gdb
를 통해 오류가 발생한 코드 위치를 추적할 수 있다. 또한 backtrace
명령어를 통해 함수 호출 스택을 확인할 수 있다.
(gdb) run
(gdb) backtrace
valgrind 사용법
valgrind
는 프로그램의 메모리 누수를 확인하고, 메모리 사용과 관련된 문제를 진단하는 데 사용된다. 이를 통해 메모리 관리가 잘못된 경우(예: 메모리 누수, 잘못된 메모리 접근)를 발견할 수 있다.
valgrind
를 사용하여 ROS2 노드를 실행하려면 다음과 같이 명령어를 입력한다:
valgrind --leak-check=full ros2 run 패키지_이름 노드_이름
valgrind
는 프로그램 실행 후 메모리와 관련된 문제를 보고서 형식으로 출력해 준다. 이 보고서를 분석하면 메모리 누수가 발생한 위치나 잘못된 메모리 접근이 이루어진 부분을 확인할 수 있다.
6. lttng을 통한 트레이싱
lttng
은 ros2_tracing
을 위한 기반 도구로, 시스템의 성능을 세부적으로 측정하고 분석하는 데 사용된다. 이를 통해 ROS2 노드 간의 메시지 전달 지연 시간, 토픽 퍼블리싱 주기, 서비스 호출 시간을 세밀하게 분석할 수 있다.
먼저 lttng
을 설치해야 한다:
sudo apt install lttng-tools
그 후 트레이싱을 활성화하여 ROS2 노드의 성능을 기록할 수 있다. ros2_tracing
과 함께 사용하면 더욱 구체적인 성능 데이터를 수집할 수 있다. 트레이싱을 활성화하려면 다음 명령어를 사용한다:
lttng create my-session
lttng enable-event --kernel --syscall
lttng start
트레이싱 세션이 활성화된 상태에서 ROS2 노드를 실행하면, lttng
은 시스템 호출 및 ROS2 메시지 전달 시간을 기록한다. 트레이싱을 중단하려면 다음과 같이 명령어를 입력한다:
lttng stop
lttng view
이제 수집된 데이터를 분석하여 시스템의 병목이나 성능 문제를 해결할 수 있다.
7. ros2 doctor
ros2 doctor
는 ROS2 시스템의 상태를 진단하는 데 유용한 명령어이다. 이를 통해 ROS2 설치 상태, 네트워크 연결 상태, 노드의 상태 등을 종합적으로 점검할 수 있다. 시스템에 문제가 발생했을 때, 이를 가장 먼저 사용하여 일반적인 문제를 확인할 수 있다.
ros2 doctor
ros2 doctor
는 시스템의 환경 변수, 패키지 설치 상태, 네트워크 상태 등을 점검한 후, 그 결과를 출력해 준다. 또한 문제를 해결할 수 있는 권장 사항을 함께 제공하므로, 이를 기반으로 빠르게 시스템을 복구할 수 있다.