get_logger, 로그 레벨, rqt_console

print 대신 get_logger를 쓰는 이유는 무엇일까?

get_logger

누가, 언제, 얼마나 중요한지

self.get_logger()는 노드의 로거(logger)를 돌려줍니다. 로거로 남긴 한 줄에는 레벨, 시각, 노드 이름이 함께 붙습니다. 노드가 여럿 돌 때 누가 무슨 말을 했는지 가릴 수 있습니다.

시각은 1970년부터 센 초입니다. 그림의 값은 예시입니다.

다섯 레벨

DEBUG부터 FATAL까지 다섯 단계

로그 레벨(log level)은 그 로그가 얼마나 심각한지를 나타냅니다. rclpy 로거는 레벨마다 메서드가 있습니다. 평소 진행은 info(), 이상한 일은 warning(), 실패는 error()로 남깁니다.

기본은 INFO

기준보다 낮은 로그는 안 보입니다

기본 레벨은 INFO라서 debug()로 남긴 로그는 찍히지 않습니다. 실행할 때 --ros-args --log-level debug를 붙이면 DEBUG까지 보입니다. 반대로 WARN으로 올리면 INFO가 숨습니다.

내 노드만 낮추려면 --log-level talker:=debug처럼 로거 이름을 붙입니다.

/rosout

로그는 /rosout으로도 모입니다

노드가 남긴 로그는 터미널에 찍히는 동시에 /rosout 토픽으로도 발행됩니다. 그래서 여러 터미널에 흩어진 로그를 한곳에서 모아 볼 수 있습니다. 그 일을 하는 화면 도구가 rqt_console입니다.

/rosout은 3강 3편의 ros2 topic list에서 본 그 토픽입니다.

따라 하기

rqt_console로 모아 봅니다

새 터미널에서 ros2 run rqt_console rqt_console로 창을 띄우고, turtlesim을 켭니다. 3강 6편의 ros2 topic pub로 거북이를 벽 쪽으로 계속 몰면, 벽에 부딪혔다는 Warn 로그가 계속 쌓입니다.

공식 튜토리얼은 ros2 topic pub -r 1 /turtle1/cmd_vel로 linear.x를 2.0으로 보냅니다.

걸러 보기

레벨과 글자로 걸러 봅니다

rqt_console 가운데 칸에서는 보지 않을 레벨을 빼고(exclude), 아래 칸에서는 글자가 든 줄을 강조합니다(highlight). 로그가 많아도 문제가 된 노드와 레벨만 남겨 볼 수 있습니다.

rqt_console은 ros-jazzy-desktop에 함께 들어 있습니다. 창 모양은 줄여 그렸습니다.

다음 편

이제 내 노드로 거북이를 몰아 볼까요?

8편거북이를 코드로 몰기 6강 목록