AEGLOSLAB ROS 2 Jazzy 대전

제11부 도구·관측성

11.5 rqt·PlotJuggler·시각 분석

11.5.1 이 장에서 배우는 것 / 선수 지식

RViz2가 3D 공간을 보여준다면, 이 장의 도구들은 시간·구조·텍스트를 보여준다. 제어 게인이 진동하는지, 노드가 어떻게 연결됐는지, 어떤 로그가 언제 나왔는지 — RViz2로는 답할 수 없는 질문들이다.

이 장의 실용적 목표는 "이 질문에는 이 도구" 를 정하는 것이다. 도구가 많은데 각각의 강점이 다르고, 잘못 고르면 시간을 버린다.

배우는 것:

  • rqt 프레임워크 — 구조와 주요 플러그인.
  • rqt_graph — 연결 확인과 그 한계.
  • rqt_console·rqt_reconfigure — 로그와 파라미터.
  • rqt_plot과 PlotJuggler — 시계열, 그리고 왜 후자인가.
  • PlotJuggler 심층 — 변환·수식·bag 분석.
  • 도구 선택 — 질문에서 도구로.
  • CLI와의 조합 — GUI가 답이 아닐 때.
  • 원격에서 보는 법 — 그래프를 늘릴 것인가, 브리지를 둘 것인가(11.5.12).

선수 지식: 1.11(로깅), 1.9(파라미터), 11.2·11.3(bag), 3.3(디스커버리·연결).

정직: rqt 플러그인의 패키지명·설치 여부는 배포판·설치 방식에 따라 다르다(확인 필요). PlotJuggler는 ROS 외부 프로젝트이며 기능·ROS 2 연동은 버전 의존이다(확인 필요). Foxglove 등 상용·외부 도구는 존재를 언급하되 평가하지 않는다. 이 환경에서 실행 검증하지 않았다(목차 3).

검증 상태(추가): 이 장의 서술 가운데 1곳은 이후 회차에서 Jazzy 실물과 대조해 확인했다 — 본문의 (실행 확인) 표기가 그것이다. 표기가 없는 서술은 위 고지가 그대로 적용된다(목차 3의 검증 범위 표).

11.5.2 rqt 프레임워크

Qt 기반 플러그인 컨테이너다. 여러 플러그인을 한 창에 배치할 수 있다.

rqt                                    # 빈 창 — Plugins 메뉴에서 추가
rqt --standalone rqt_graph             # 단일 플러그인
ros2 run rqt_graph rqt_graph           # 직접 실행
플러그인용도
rqt_graph노드·토픽 연결 그래프
rqt_console/rosout 로그 뷰어·필터
rqt_reconfigure파라미터 조회·변경
rqt_plot시계열 그래프
rqt_image_view이미지 표시
rqt_topic·rqt_publisher토픽 모니터·수동 발행
rqt_service_caller서비스 호출
rqt_bagbag 탐색·재생
rqt_tf_treetf 트리
rqt_robot_monitor진단 표시(6.9.8)

정직: 일부 플러그인은 ROS 2에서 미지원이거나 기능이 축소됐을 수 있다(확인 필요). ROS 1 시절 자료를 보고 찾다가 없는 경우가 있다.

견해: rqt의 가치는 "여러 도구를 한 화면에 배치"에 있다. 로그·그래프·진단을 나란히 놓고 보면 상관관계가 눈에 들어온다. 배치를 저장(Perspective)해 두면 매번 구성하지 않아도 된다.

11.5.3 rqt_graph — 연결 확인

"노드가 서로 연결됐는가"를 그림으로 본다.

ros2 run rqt_graph rqt_graph
표시 옵션의미
Nodes only노드만
Nodes/Topics (active)연결된 토픽만 — 기본 유용
Nodes/Topics (all)미연결 포함
Dead sinks 숨기기구독만 있고 발행 없는 것
Debug 숨기기/rosout 등

무엇을 알 수 있나:

확인방법
이름 오타두 노드가 다른 토픽에 연결돼 있음
리매핑 실수예상과 다른 이름(1.1.5)
네임스페이스 문제경로가 다름(1.1.6)
누락된 노드안 보임

함정: rqt_graph는 QoS 불일치를 보여주지 않는다. 이름이 같으면 선이 그어지지만, QoS가 안 맞으면 데이터는 안 흐른다(1.5.4). 선이 있는데 데이터가 없으면 ros2 topic info -v로 QoS를 확인해야 한다.

함정: rqt_graph는 실제 데이터 흐름이 아니라 선언된 연결을 보여준다. 발행자가 있어도 발행을 안 하면 선은 그어진다. ros2 topic hz로 실제 흐름을 확인한다.

견해: rqt_graph는 "구조 파악"에 강하고 "동작 확인"에는 약하다. 처음 보는 시스템의 구성을 이해하거나 리매핑 실수를 찾는 데 좋고, "왜 데이터가 안 오나"에는 CLI가 낫다(11.5.8).

11.5.4 rqt_console — 로그

ros2 run rqt_console rqt_console
기능설명
레벨 필터ERROR만·WARN 이상
노드 필터특정 노드만
메시지 필터정규식 검색
하이라이트강조
일시정지흐름 멈춤
저장파일로

견해: 로그가 폭주할 때 필터가 가치를 발휘한다. ros2 topic echo /rosout은 흐름이 빠르면 못 읽지만, rqt_console은 멈추고 필터링해 볼 수 있다.

CLI 대안:

# 파일로 기록된 로그를 검색 (1.11.3)
grep -r "ERROR" ~/.ros/log/latest/

# 실시간
ros2 topic echo /rosout | grep -i error

견해: 로그 분석에서 궁극적으로 강력한 것은 grep이다. GUI는 실시간 관찰에, grep은 사후 분석에 낫다. 로그를 구조화해 두면(1.11.6) grep이 훨씬 유용해진다.

11.5.5 rqt_reconfigure — 파라미터

ros2 run rqt_reconfigure rqt_reconfigure
기능설명
노드별 파라미터 목록전체 조회
값 변경슬라이더·입력
타입 표시—
설명 표시descriptor(1.9.5)

견해: 튜닝에서 이 도구가 시간을 크게 아낀다. 게인·임계값을 바꿔 가며 즉시 효과를 보는 작업(6.5.5의 제어 튜닝·8.5의 컨트롤러 튜닝)에서, 재시작 없이 조정할 수 있다.

함정: 동적으로 반영되는 파라미터인지 확인하라. 노드가 파라미터 콜백을 구현하지 않았으면(1.9.6) 값은 바뀌지만 동작은 안 바뀐다. 1.9.5·1.9.6에서 "읽기 전용으로 선언하거나 콜백을 구현하라"고 한 이유가 이것이다.

함정: 여기서 바꾼 값은 저장되지 않는다. 재시작하면 YAML 값으로 돌아간다. 좋은 값을 찾았으면 YAML에 반영해야 한다(1.9.7). ros2 param dump로 현재 값을 저장할 수 있다.

ros2 param dump /controller_server > tuned.yaml

11.5.6 시계열 — rqt_plot과 PlotJuggler

시계열 분석은 제어·성능 진단의 핵심 도구다.

ros2 run rqt_plot rqt_plot /odom/twist/twist/linear/x
축rqt_plotPlotJuggler
실시간✅✅
bag 로드제한적✅ 강력
다중 곡선기본적✅ 레이아웃 자유
수식·변환❌✅
성능(대량 데이터)약함좋음
저장·재현제한적레이아웃 저장
ROS 2 연동기본플러그인(확인 필요)

견해: 시계열 분석이 필요하면 PlotJuggler를 쓰라. rqt_plot은 값 하나를 잠깐 보는 데는 충분하지만, 실제 진단은 여러 신호를 겹쳐 보고 파생값을 계산하는 작업이라 곧 한계에 닿는다.

11.5.7 PlotJuggler 심층

bag 분석의 주력 도구다.

데이터 원천 실시간 ROS 2 토픽 rosbag2 파일 CSV 등 시계열 저장소 플롯 레이아웃 변환 · 수식
기능활용
bag 로드·스크럽시간축을 오가며 관찰
다중 플롯 배치명령 vs 실제를 나란히
수식 변환오차·미분·필터 계산
시간 정렬여러 신호 동기
RViz2와 연동(확인 필요)시간 동기 재생
레이아웃 저장반복 분석

전형적 분석:

질문플롯
제어가 잘 따라가나명령 vs 실제 속도·위치(6.5.5)
진동하나오차의 시간 파형
주기가 일정한가메시지 간격(2.5.6)
지연이 있나두 신호의 시간차(7.7.8)
오도메트리가 드리프트하나odom vs map 자세 차(7.6.7)
배터리·온도진단 값(6.9)
CPU·주기성능 지표(11.7)

수식 활용 예:

계산용도
cmd - actual추종 오차
미분가속도·변화율
이동 평균노이즈 제거
sqrt(x^2+y^2)합성 속도·거리

견해: "명령과 실제를 같은 플롯에 겹치는 것"이 제어 진단의 기본 동작이다. 이것만으로 게인이 낮은지(느린 추종)·높은지(진동)·지연이 있는지(위상 차)가 대개 보인다.

견해: 주기 지터를 시계열로 보는 것이 통계보다 정보가 많다(2.5.6). 평균과 최댓값은 "가끔 급증하는지 주기적으로 급증하는지"를 구분 못 하지만, 시계열은 패턴을 보여준다 — 그것이 원인을 가리킨다(주기적이면 다른 주기 작업, 산발적이면 GC·페이지 폴트).

정직: PlotJuggler의 ROS 2 지원·설치 방법·기능 범위는 버전 의존이며 별도 설치가 필요할 수 있다(확인 필요).

기타 도구:

도구성격
Foxglove 등 웹 기반시각화·협업(확인 필요: 라이선스)
Jupyter + rosbag2 API커스텀 분석(11.2.8)
matplotlib 스크립트반복 분석·보고서

견해: 정형화된 반복 분석은 스크립트로 만들라. GUI로 매번 클릭하는 것보다, bag을 입력받아 지표와 그림을 생성하는 스크립트가 재현 가능하고 CI에도 넣을 수 있다(11.3.8). 탐색은 GUI, 반복은 스크립트가 좋은 분업이다.

11.5.8 도구 선택

무엇을 알고 싶은가? 3D 공간 · 자세 · 지도 시간에 따른 값 연결 구조 로그 · 이벤트 실제 데이터 흐름 RViz2 (11.4) PlotJuggler rqt_graph + topic info -v rqt_console · grep CLI: topic hz · echo
질문도구
로봇이 어디 있나RViz2
센서 데이터가 오나ros2 topic hz
왜 안 오나ros2 topic info -v(QoS)
제어가 잘 되나PlotJuggler
노드가 연결됐나rqt_graph
무슨 오류가 났나rqt_console·grep
tf가 맞나view_frames·RViz2(5.2.7)
성능이 어떤가11.7·11.6
시스템 상태rqt_robot_monitor(6.9)

견해: CLI를 먼저 쓰라. ros2 topic hz·ros2 topic info -v·ros2 node info는 GUI를 실행하는 시간보다 빠르고, 원격·헤드리스에서도 되며, 스크립트로 자동화된다. GUI는 CLI로 답이 안 나올 때 쓴다.

견해: GUI 도구는 원격·현장에서 제약이 크다(11.4.6). SSH만 되는 상황에서는 CLI가 유일한 수단이므로, CLI 숙련이 실무 능력을 좌우한다. 11.1에서 이 관점을 정리한다.

11.5.9 진단 도구 조합

실제 진단은 도구 하나로 끝나지 않는다.

예: "로봇이 목표에 못 간다"(8.8.8의 확장)

로봇이 안 간다 1. RViz2: 자세 · 코스트맵 · 경로 2. rqt_console: 오류 로그 3. topic hz /cmd_vel: 명령 나오나 4. PlotJuggler: cmd_vel vs odom 5. rqt_reconfigure: 파라미터 확인 원인 특정
단계답하는 질문
1 RViz2로봇이 상황을 어떻게 보고 있나
2 로그무엇이 실패했나
3 CLI명령이 나오나
4 PlotJuggler명령대로 움직이나
5 파라미터설정이 맞나

견해: "위에서 아래로" 순서가 효율적이다 — 인식(RViz2) → 판단(로그) → 명령(CLI) → 실행(PlotJuggler) → 설정. 이것이 2.1.8에서 세운 계층 식별의 실무 적용이다.

예: "제어가 진동한다"

단계도구
1. 명령 vs 실제 파형PlotJuggler
2. 주기 지터 확인PlotJuggler(간격)
3. 게인 조정rqt_reconfigure
4. 재확인PlotJuggler
5. 값 저장ros2 param dump

견해: "조정 → 즉시 확인" 루프를 짧게 만드는 것이 튜닝의 핵심이다. rqt_reconfigure + PlotJuggler 조합이 그 루프를 초 단위로 줄인다. 재시작이 필요한 구조라면 튜닝이 몇 배 느려지므로, 파라미터 콜백을 구현해 두는 것(1.9.6)이 여기서 값을 한다.

11.5.12 원격에서 본다 — 브리지 계층

번호에 대하여: 이 절은 나중에 추가되었다. 규약(CLD-03)에 따라 번호는 끝에 붙이고 읽는 흐름을 위해 함정 카탈로그 앞에 놓았다.

지금까지의 도구는 전부 ROS 그래프 안에 들어가서 본다. rqt도 RViz2도 노드이며, 자신이 구독해서 그린다. 로봇과 같은 LAN에 노트북을 물리면 그것으로 충분하다.

현장에서는 대개 그렇지 않다. 로봇은 무선 뒤에, NAT 뒤에, 혹은 다른 지역에 있다. 여기서 두 가지 길이 갈린다.

로봇 ROS 2 그래프 ① 그래프를 늘린다 VPN · Discovery Server · zenoh ② 그래프를 끊고 브리지를 둔다 원격에서도 노드처럼 rqt · RViz2 그대로 WebSocket · REST · MQTT 브라우저 · 관제 서버
접근무엇을 하나맞는 상황대가
① 그래프 확장VPN·Discovery Server(3.4)·rmw_zenoh(3.10)로 원격까지 DDS·zenoh 그래프를 잇는다개발·현장 조사, 신뢰할 만한 링크디스커버리 비용(3.3.4), 무선에서의 취약성(3.9), 보안 경계가 넓어진다(13.1)
② 브리지로봇 안에서만 ROS를 쓰고, 밖으로는 다른 프로토콜로 요약을 내보낸다운영·관제·상시 감시브리지가 단일 장애점·성능 병목, 무엇을 내보낼지 설계해야 함

7.8.6이 "원격 운영자에게 필요한 것은 원본 센서 데이터가 아니라 상태 요약과 필요 시의 저품질 영상"이라고 결론지었다. ②는 그 결론을 실행에 옮기는 계층이다.

11.5.12.1 브리지 후보

도구형태전형적 쓰임
rosbridge_suiteWebSocket ↔ ROS(JSON)브라우저·모바일 UI, roslibjs 기반 웹 대시보드. ROS 1 시절부터의 표준적 선택
foxglove_bridgeWebSocket(바이너리 프로토콜)원격 시각화·기록 재생 도구와의 연동
직접 만든 브리지MQTT·REST·gRPC 등사내 관제 시스템과의 통합, 필드 선택·주기 제어를 완전히 통제

실행 확인(2026-08-16): Jazzy apt 인덱스에 ros-jazzy-rosbridge-suite(2.7.0)와 ros-jazzy-foxglove-bridge(3.4.1)가 실재한다. 확인한 것은 패키지의 존재와 버전까지이며, 기능·성능·프로토콜 세부는 실행해 보지 않았다(확인 필요). 도구 평가는 이 책의 방침상 하지 않는다(3.6.1).

11.5.12.2 설계 지점 — 브리지에도 비용이 든다

지점판단
무엇을 내보내나화이트리스트가 원칙. "전부 노출"은 대역·보안 양쪽에서 실패한다(7.8.6)
주기 축소20 Hz 오도메트리를 그대로 보낼 이유는 거의 없다. 브리지에서 다운샘플
직렬화 비용JSON 변환은 비용이 낮지 않다. 대용량 토픽을 JSON으로 내보내면 브리지가 CPU를 점유한다
보안브리지는 그래프 바깥으로 나가는 문이다. 인증·TLS·최소 권한이 필요하며, 특히 명령을 받는 방향은 원격 조작과 같은 수준으로 다뤄야 한다(13.4.3·13.1.6)
장애 처리브리지가 종료되면 관제는 눈이 먼다. 감시·재시작 대상(14.2.6)이며, 브리지 없이도 로봇은 안전하게 동작해야 한다

견해: 브리지 뒤에 로봇의 안전 로직을 두지 말라. 통신이 끊겨도 로봇이 스스로 멈추고 스스로 판단할 수 있어야 하며(3.9.3·8.7), 브리지는 관측과 상위 지시의 통로여야 한다. 이 경계를 흐리면 링크 품질이 안전 수준을 결정하게 된다.

견해: 개발에는 ①, 운영에는 ②가 대체로 맞는다. 개발 중에는 그래프를 늘려 익숙한 도구를 그대로 쓰는 편이 빠르고, 운영에서는 노출면과 대역을 통제할 수 있는 브리지가 안전하다. 둘을 한 시스템에 함께 두되 운영 기본값은 ②, 조사할 때만 ①을 여는 구성이 실무적이다.

11.5.10 함정 카탈로그

#함정증상대처
1rqt_graph 선을 데이터 흐름으로 오해QoS 문제 놓침topic info -v
2발행자 존재를 발행으로 오해헤맴topic hz
3rqt_reconfigure 값이 반영 안 됨콜백 미구현1.7.7
4튜닝 값 미저장재시작 시 소실param dump·YAML
5rqt_plot으로 복잡 분석한계PlotJuggler
6GUI를 원격에서느림·불가CLI
7반복 분석을 GUI로시간 낭비·비재현스크립트
8도구를 먼저 고름비효율질문에서 출발
9통계만 보고 지터 판단패턴 놓침시계열로
10ROS 1 자료의 플러그인 기대없음지원 확인

11.5.11 체크포인트

  • rqt의 주요 플러그인 열 가지와 각각의 용도를 말할 수 있는가.
  • rqt의 핵심 가치는 무엇인가.
  • rqt_graph가 보여주지 않는 것 둘은? 그것을 확인하는 CLI 명령은?
  • rqt_graph가 강한 영역과 약한 영역을 구분할 수 있는가.
  • rqt_console과 grep의 분업은?
  • rqt_reconfigure의 두 함정과 각각의 대처는?
  • rqt_plot과 PlotJuggler의 차이 일곱 가지, 그리고 후자를 권하는 이유는?
  • PlotJuggler의 전형적 분석 여섯 가지와 수식 활용 네 가지를 말할 수 있는가.
  • "명령과 실제를 겹쳐 보기"가 제어 진단의 기본인 이유는?
  • 주기 지터를 시계열로 봐야 하는 이유와, 패턴이 알려주는 것은?
  • 탐색과 반복의 도구 분업 원칙은?
  • CLI를 먼저 쓰라는 조언의 근거 셋은?
  • "로봇이 안 간다" 진단의 다섯 단계와, 그 순서의 원리는?
  • 튜닝 루프를 짧게 만드는 조합과, 그것을 가능하게 하는 사전 조치는?
  • 원격에서 보는 두 접근(그래프 확장·브리지)의 트레이드오프를 말하고, 개발과 운영에 각각 무엇이 맞는지 설명할 수 있는가.
  • 브리지 뒤에 로봇의 안전 로직을 두면 안 되는 이유는?

다음 장 11.6는 이 도구들로도 보이지 않는 것 — 실행 내부의 타이밍을 보는 트레이싱을 다룬다.