ROS2에서 로그 및 디버깅을 효과적으로 하기 위해 다양한 도구들이 제공된다. 이 도구들은 시스템의 상태를 모니터링하고, 잠재적인 오류를 파악하며, 성능 병목을 진단하는 데 유용하다. 본 절에서는 ROS2의 디버깅 도구에 대한 설명과 그 사용법을 다룬다.

1. rqt_console와 rqt_logger_level

ROS2는 rqt_consolerqt_logger_level이라는 GUI 기반의 로그 모니터링 및 로그 레벨 설정 툴을 제공한다. 이를 통해 노드에서 발생하는 로그 메시지를 실시간으로 확인하고, 필요한 경우 로그 레벨을 동적으로 변경할 수 있다.

rqt_console 사용법

rqt_console은 ROS2 노드에서 생성된 로그 메시지를 실시간으로 볼 수 있는 GUI 도구이다. 이를 실행하려면 다음 명령어를 사용할 수 있다.

rqt_console

이 툴은 로그 메시지 필터링 기능을 제공하며, 특정 노드의 로그 메시지만을 선택적으로 볼 수 있다. 필터링 옵션은 메시지의 심각도(예: 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++ 코드를 디버깅할 때는 gdbvalgrind 같은 표준 디버깅 툴을 활용할 수 있다. 이들 도구는 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을 통한 트레이싱

lttngros2_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는 시스템의 환경 변수, 패키지 설치 상태, 네트워크 상태 등을 점검한 후, 그 결과를 출력해 준다. 또한 문제를 해결할 수 있는 권장 사항을 함께 제공하므로, 이를 기반으로 빠르게 시스템을 복구할 수 있다.