# rRViz2 및 rqt를 활용한 시각화 디버깅

#### rRViz2의 기본 개념

ROS2 환경에서 시각화와 디버깅을 위해 가장 널리 사용되는 도구 중 하나가 rRViz2다. 일반적으로 ROS1의 RViz와 기능 면에서 유사하나, ROS2 구조에 맞도록 내부가 개선되고 QoS 설정 등에 대응하도록 설계되었다. rRViz2는 로컬에서 시각화할 수 있는 다양한 유형의 플러그인을 제공하여, 센서 데이터나 TF 변환, 지형 정보, 로봇 모델 등을 직관적으로 확인할 수 있다.

* **패널(Panel):** rRViz2 내에서 특정 데이터를 시각적으로 표현하거나, 상호작용 UI를 제공하는 역할을 한다. 예를 들어 TF Panel, Displays, Tool 등.
* **Display(디스플레이):** 센서 메시지 유형에 따라 서로 다른 Display 타입을 사용하여 데이터(레이저 스캔, 포인트 클라우드, 이미지 등)를 시각화한다.
* **Global Options:** 배경색, 고정 프레임(fixed frame) 등 rRViz2 전체 환경 설정에 관한 옵션들이 위치한다. 대표적으로 로봇의 기본 좌표계를 무엇으로 설정할 것인지를 정한다.

#### rRViz2 실행과 초기 설정

rRViz2를 실행하기 위해서는 터미널에서 다음과 같은 명령을 입력한다.

```bash
rviz2
```

만약 특정 설정 파일(rviz2 설정 파일, 예: `my_robot.rviz`)을 사용하려면 아래와 같이 옵션을 줄 수 있다.

```bash
rviz2 -d my_robot.rviz
```

실행 후 rRViz2 내부에서 다음 항목을 체크해보는 것이 좋다.

* **Fixed Frame:** 로봇의 메인 좌표계(주로 `map`, `odom`, `base_link` 등)를 지정한다.
* **Displays 패널:** ‘Add’ 버튼을 눌러 필요한 Display를 추가하고, 토픽을 정확히 설정한다.
* **Tool 패널:** 2D Pose Estimate, 2D Nav Goal 등 툴을 사용하여 상호작용을 수행한다.

#### TF(Transform) 시각화와 디버깅

로봇 시스템에서 좌표계 변환은 매우 중요하다. rRViz2에서는 TF를 확인해봄으로써 특정 센서와 로봇 본체 간의 좌표관계가 올바른지 검사할 수 있다.

1. **TF Display 추가:** Displays에서 ‘TF’를 선택해 추가한다.
2. **Transforms 설정 확인:** TF Display의 옵션에서 불필요한 프레임은 숨기거나, 색상과 크기를 조절하여 시각적으로 구분하기 쉽게 만든다.

ROS2의 TF 시스템은 대부분 $tf2$ 라이브러리와 메시지 타입을 이용한다. 좌표계 변환은 회전 행렬과 병진 벡터를 이용하여 표현할 수 있으며, 예를 들어 2D 회전 및 평행이동은 다음처럼 나타낼 수 있다.

$$
\mathbf{p}' =  \begin{bmatrix} \cos\theta & -\sin\theta \ \sin\theta & \cos\theta \end{bmatrix} \mathbf{p} + \begin{bmatrix} t\_x \ t\_y \end{bmatrix}
$$

여기서 $\theta$는 회전 각도, $\mathbf{p}$는 원점으로부터의 좌표, $(t\_x, t\_y)$는 평행이동 벡터다. 3차원 공간에 대해서는 3x3 또는 4x4 동차좌표계 행렬을 사용하여 표현한다. rRViz2에서 이러한 변환이 제대로 이루어지고 있는지 시각적으로 확인함으로써, TF 세팅 오류 또는 URDF 상 불일치 등을 빠르게 찾아낼 수 있다.

#### 센서 토픽 시각화

다양한 센서 데이터(카메라, 라이다, IMU 등)는 토픽 기반으로 발행되며, rRViz2에서 이를 확인하면 문제점을 조기에 파악할 수 있다.

* **PointCloud2 Display:** 포인트 클라우드 토픽을 시각화하여 센서가 측정한 3D 지형 정보나 장애물 정보를 확인할 수 있다.
* **LaserScan Display:** 라이다 토픽을 통해 받은 2D 스캔 정보가 올바른 각도로 표시되는지를 검증할 수 있다.
* **Image Display:** 카메라 이미지를 시각화하거나, 센서 인지 결과를 오버레이(Overlay)하여 확인할 수 있다.

특히 시뮬레이션 환경(Gazebo 등)에서 발행되는 센서 데이터가 실제 데이터와 얼마나 차이가 있는지 rRViz2를 통해 빠르게 비교할 수 있다.

#### rqt 개념과 특징

rqt는 ROS2에서 다양한 플러그인을 모아놓은 GUI 툴킷으로, 노드 그래프, 토픽 시각화, 파라미터 조정, 메시지 플로팅 등 여러 가지 작업을 통합된 형태에서 수행할 수 있다.

```bash
rqt
```

명령을 통해 rqt를 실행하면, 상황에 따라 필요한 플러그인을 추가하고 제거할 수 있다. 대표적인 플러그인 예시는 다음과 같다.

* **rqt\_graph:** 노드 간 토픽 흐름을 그래프로 시각화한다.
* **rqt\_plot:** 토픽에서 실시간으로 수치 데이터를 추출해 그래프로 그려준다.
* **rqt\_tf\_tree:** TF 트리를 한눈에 확인하여 좌표계 관계를 파악할 수 있다.
* **rqt\_logger\_level:** 로그 레벨 동적 변경, 디버깅 모드 전환 등 편의 기능을 제공한다.

#### rqt와 rRViz2의 연동

ROS2 환경에서 rRViz2와 rqt는 상호보완적이다. rRViz2는 3D/2D 형태로 센서 데이터와 TF를 직관적으로 시각화하는 데 뛰어난 반면, rqt는 주로 통계적·수치적 데이터 모니터링, 노드·토픽 구조 파악, 파라미터 동적 변경 등에 강점이 있다. 두 툴을 함께 활용하면 다음과 같은 이점이 있다.

* **이중 확인:** 예컨대 rqt\_graph에서 특정 노드가 올바른 토픽을 퍼블리시하는지 확인하고, 그 데이터가 rRViz2에서 제대로 시각화되는지 다시 검증할 수 있다.
* **실시간 파라미터 튜닝:** rqt에서 파라미터 서버(노드 파라미터)를 변경하고, 곧바로 rRViz2 화면을 통해 로봇 동작이나 센서 출력 변화를 확인한다.
* **토픽 모니터링 및 수치 분석**: rqt\_plot이나 rqt\_multiplot 등의 플러그인으로 특정 토픽에 대한 실시간 그래프를 확인하고, 동시에 rRViz2에서 물리적 위치나 3D 정보를 시각화함으로써 상관관계를 찾아내기 쉽다.

#### rqt\_graph와 토픽 흐름 분석

rqt\_graph는 현재 구동 중인 ROS2 노드와 토픽의 연결 관계를 그래프로 시각화하는 대표적인 도구다. 각 노드, 퍼블리셔, 서브스크라이버, 서비스, 액션 등의 흐름을 확인할 수 있어, 통신 구조 파악에 매우 유용하다.

```bash
rqt_graph
```

* **노드 연결 누락 확인:** 예상하던 토픽 이름이 다르거나, QoS 설정 불일치로 노드 연결이 되지 않는 경우 그래프에서 노드 사이가 끊겨 보인다.
* **복수 노드 디버깅:** 특정 노드가 메시지를 잘 퍼블리시하는지, 여러 구독 노드가 메시지를 잘 받는지 등 관계를 한눈에 파악한다.
* **QoS 호환성 문제 디버깅:** ROS2에서는 QoS(프로파일 불일치) 문제가 발생하면 토픽 연결이 이루어지지 않는다. rqt\_graph에서 노드 간 연결이 안 될 경우 QoS 설정을 다시 확인해야 한다.

#### rqt\_plot을 이용한 실시간 데이터 관찰

rqt\_plot은 토픽의 데이터를 실시간 그래프로 표시해준다. 간단한 수치형 메시지(`std_msgs/msg/Float32`, `sensor_msgs/msg/Temperature` 등)나, 복합 메시지(예: `geometry_msgs/msg/Twist`) 중 원하는 필드를 모니터링할 수 있다.

```bash
rqt_plot
```

* **토픽 및 필드 설정:** 예를 들어 `/odom` 토픽 중 선속도($`wist.linear.x`)만 모니터링하고 싶다면, rqt\_plot의 입력 필드에 `/odom/twist/linear/x`를 지정하면 된다.
* **이상값 검출:** 센서나 로봇 자체에서 비정상적으로 큰 값이 발생하는지, 데이터가 예상보다 일정한지 혹은 노이즈가 심한지를 직관적으로 확인할 수 있다.
* **멀티플 플롯 비교:** 한 창에서 여러 토픽 혹은 여러 필드를 동시에 보여줄 수 있어, 상호 연관성을 분석하기 편하다(예: 선속도 대비 각속도).

#### rqt\_console와 rqt\_logger\_level을 활용한 로그 디버깅

rqt\_console과 rqt\_logger\_level은 로깅 메시지를 모니터링하고, 런타임 중 로그 레벨을 동적으로 변경할 수 있게 해주는 플러그인이다.

```bash
rqt
```

실행 후 필요한 플러그인을 활성화한다.

* **rqt\_console:**
  * 현재 시스템에서 발생하는 로그(INFO, WARN, ERROR 등)를 실시간으로 표시한다.
  * 특정 문자열 필터를 적용하거나, 심각도별로 로그 색상을 다르게 표시할 수 있다.
  * 노드나 스레드 ID별로 로그를 구분해서 볼 수도 있으므로, 특정 노드에서만 발생하는 에러를 추적하기 좋다.
* **rqt\_logger\_level:**
  * 모든 ROS2 노드가 logger를 사용하여 메시지를 출력한다. 기본적으로 C++ `rcutils`나 Python `rclpy` 로깅을 거친다.
  * rqt\_logger\_level에서는 특정 노드의 로그 레벨(예: DEBUG, INFO, WARN, ERROR)을 실시간으로 바꿀 수 있다.
  * 오래 걸리는 실험이나 시뮬레이션 중에도 노드를 재시작할 필요 없이 로그 레벨을 변경해 세부 디버깅 정보를 추가로 확인할 수 있다.

#### rqt\_tf\_tree로 TF 구조 확인

TF가 복잡한 로봇 시스템에서는 좌표계가 여러 계층으로 얽혀있을 수 있다. 예를 들어 멀티 조인트 로봇은 조인트마다 고유한 링크-조인트 변환이 있고, 여러 센서가 부착되어 있다면 각각의 센서 프레임이 있다.

```bash
rqt
```

* rqt 실행 후 `Plugins -> Visualization -> TF Tree`를 선택한다.
* TF 관계가 트리 구조로 보이며, 어떤 프레임이 상위 프레임(Parent)에 종속되는지가 명확히 드러난다.
* 잘못 연결된 변환이 있는 경우, rRViz2에서 TF Display와 함께 교차 확인하여 문제 지점을 찾는다.

#### Markers와 Interactive Markers 활용

로봇의 상태나 특정 상태 정보를 좀 더 유연하게 시각화하려면, Marker(단일 오브젝트) 또는 MarkerArray(복수 오브젝트)를 이용할 수 있다. 예를 들어 3D 공간상의 점, 라인 스트립, 메시(3D 모델) 등을 표시하거나, 텍스트를 띄워서 상태 정보를 전달할 수도 있다.

* Marker 메시지:

  $visualization\_msgs/msg/Marker$ 타입을 사용하며, 메시 내부에 표시 형태, 크기, 색상 등을 세부적으로 지정할 수 있다.

  * 표시 대상 객체가 점(Point) 하나라면 `Marker::POINTS` 타입으로 설정.
  * 여러 점을 표시하려면 `Marker::POINTS`를 사용하고, `points` 벡터에 좌표를 나열한다.
  * 메시(예: 스캐닝으로 획득한 3D 모델)를 표시하려면 `Marker::MESH_RESOURCE` 타입을 사용하고, 리소스 경로를 설정한다.
* Interactive Marker:

  사용자와 상호작용할 수 있는 Marker로, 클릭-드래그 등을 통해 로봇에게 명령을 내리거나, 특정 객체를 조작하는 데 사용할 수 있다.

  * `interactive_markers` 패키지에서 제공하며, 서버-클라이언트 구조로 동작한다.
  * 주행 로봇의 목표 지점을 지정하거나, 로봇 팔의 그리퍼 위치를 시각적으로 움직이는 기능 등을 구현할 수 있다.

rRViz2에서 Marker 또는 Interactive Marker를 구독해 표시함으로써, 로봇 시스템의 상태·목표·경로 등을 직관적으로 공유·디버깅하기 용이하다.

#### Navigation2 디버깅

ROS2의 대표적인 내비게이션 스택인 Navigation2(Nav2)를 디버깅할 때도 rRViz2와 rqt를 적극 활용한다.

1. 모델 및 맵 시각화:
   * Nav2에서 SLAM 또는 지도 기반 내비게이션을 사용할 경우, rRViz2를 통해 맵(`OccupancyGrid`)이 정상적으로 표시되는지 확인한다.
   * 로봇 모델(URDF/Collada 등)과 맵의 정합이 어긋나지 않는지 점검한다.
2. Global Costmap, Local Costmap 확인:
   * Nav2는 글로벌 코스트맵(global\_costmap)과 로컬 코스트맵(local\_costmap)을 각각 주행 경로 생성에 활용한다.
   * rRViz2의 Displays 패널에서 `Map` 혹은 `Costmap` 유형을 추가해, 코스트맵이 의도대로 생성되고 있는지 시각적으로 확인한다.
   * 장애물이 있는 곳에 올바르게 코스트가 표시되는지, 혹은 Ghost Obstacle(이미 지나간 장애물이 그대로 남아있는 현상)이 발생하고 있지는 않은지 체크한다.
3. Path 시각화:
   * Nav2가 생성한 전역 경로(global path)와 지역 경로(local path)가 rRViz2 상에서 정렬이 잘 되는지 확인한다.
   * 경로가 로봇 모델과 충돌하거나, 엉뚱한 방향으로 그려지지 않는지 시각적으로 파악한다.
4. Action 상태 모니터링:
   * Nav2는 action interface(`NavigateToPose`, `FollowWaypoints` 등)를 사용한다. rqt\_action(또는 command line)으로 action 상태를 모니터링하고, rRViz2에서 실제 경로 이동 상태를 시각적으로 추적한다.
5. 로그 디버깅:
   * rqt\_console와 rqt\_logger\_level을 통해 `bt_navigator`, `planner_server`, `controller_server` 등 주요 노드의 로그 수준을 조절, 문제가 발생할 때 어디에서 에러를 던지는지 세부적으로 살핀다.

#### rqt\_image\_view로 카메라 데이터 모니터링

로봇에 카메라 센서가 장착되어 있다면, rqt\_image\_view 플러그인을 통해 실시간 영상 스트림을 시각적으로 확인할 수 있다.

```bash
rqt_image_view
```

* **토픽 선택:** 카메라 노드에서 퍼블리시하는 이미지 토픽(일반적으로 `/camera/image_raw` 등)을 고르고, 이미지를 표시한다.
* **Color vs. Depth:** RGB 이미지 외에도 깊이(depth) 카메라나 열화상(thermal) 카메라의 경우, rqt\_image\_view로 같은 방식으로 모니터링할 수 있다.
* **FPS나 해상도 이슈:** ROS2 카메라 드라이버 노드나 QoS 설정에 따라 실제 FPS가 떨어질 수 있다. rqt\_image\_view에서 프레임이 끊기거나 지연이 심하면, 네트워크 혹은 QoS 문제를 의심해봐야 한다.

#### rqt\_service\_caller와 rqt\_action

노드 간에 서비스(ROS Service)나 액션(ROS Action) 인터페이스가 정상적으로 동작하는지 디버깅하기 위해서는 rqt\_service\_caller, rqt\_action 등을 사용할 수 있다.

* rqt\_service\_caller:
  * GUI로 원하는 서비스 이름과 서비스 메시지 파라미터를 직접 입력하고, 요청-응답 결과를 바로 확인한다.
  * 코드 작성 없이도 서비스 서버에 대해 빠르게 테스트 호출을 해볼 수 있기 때문에, 파라미터 셋팅이나 노드 간 커뮤니케이션 문제를 쉽게 찾는다.
* rqt\_action:
  * ROS2 Action은 목표(goal) 전송, 피드백(feedbak), 결과(result) 등을 주고받는다.
  * rqt\_action 플러그인을 사용하면, Goal을 GUI로 직접 보내고, 해당 Action 서버가 피드백을 어떻게 주는지 실시간으로 관찰할 수 있다.
  * Navigation2 등에서 특정 기능(예: NavigateToPose)을 테스트할 때 유용하다.

#### 사용자 정의 플러그인과 커스텀 시각화

rRViz2와 rqt 모두 플러그인 구조를 지원한다. 프로젝트별로 특화된 시각화를 위해 별도의 플러그인을 작성할 수도 있다.

* rRViz2 Custom Display:
  * C++로 작성하며, 특정 메시지 타입을 구독해 원하는 방식으로 그리거나, 인터랙션 로직을 추가할 수 있다.
  * 예: 사람이 입장하면 사용자 위치를 캐릭터 아이콘으로 표시, AI 인식 결과에 따라 레이블 추가 등.
* rqt Custom Plugin:
  * Python 기반으로 작성할 수 있으며, 노드에서 들어온 데이터를 가공해 그래프·UI·레포트 등을 표현할 수 있다.
  * 예: 자율주행 시뮬레이션 중 발생하는 이벤트 로그를 테이블 형태로 실시간 갱신하여 표시.

#### 복잡한 노드 구조에 대한 멀티 툴 디버깅

로봇 시스템이 커지고 여러 노드가 상호작용할수록, 하나의 툴만으로 문제를 파악하기 어렵다. 다음과 같이 멀티 툴을 병행하면 디버깅 시간이 크게 단축된다.

1. **rqt\_graph**: 노드/토픽 구조 파악 → **의도된 연결이 이뤄졌는지 확인**
2. **rqt\_logger\_level**: 디버깅 대상 노드의 로그 레벨을 DEBUG로 올림 → **자세한 로그 획득**
3. **rqt\_console**: 필터링된 로그 모니터링 → **에러 위치나 워닝 메시지 추적**
4. **rRViz2**: TF, 센서 데이터, 로봇 모델 상태 확인 → **시각적으로 문제 지점 확인**
5. **rqt\_plot**: 수치 데이터 그래프 확인 → **센서 이상치, 알고리즘 불안정성 탐색**

서로 다른 정보를 한눈에 비교·확인할 수 있기 때문에, “왜 특정 노드에서 메시지를 못 받는 것인지”와 같은 문제를 빠르게 해결할 수 있다.

#### 멀티 로봇 환경에서의 rRViz2와 rqt

하나의 로봇만 구동되는 환경에서도 시각화·디버깅 수단이 다양하지만, 멀티 로봇 시나리오에서는 노드와 토픽의 이름공간(namespace)이 여러 개로 분리되기 때문에 각 로봇의 데이터를 분리·통합하여 표시하는 작업이 필요하다.

* 이름공간 활용
  * 로봇마다 고유한 namespace를 두고, 예: `/robot1/odom`, `/robot2/odom` 등으로 토픽을 퍼블리시한다.
  * rRViz2에서 Display 추가 시, 각 로봇별로 다른 토픽 이름을 할당해주면 여러 로봇의 정보를 동시에 볼 수 있다(적절한 색상 설정 권장).
* TF 충돌 주의
  * 로봇 마다 `map`, `odom`, `base_link` 같은 프레임 이름이 동일할 수 있다. 이 경우 namespace가 반영되지 않으면 TF 트리가 혼선이 일어난다.
  * URDF나 TF 브로드캐스팅 노드에서 로봇별 prefix(예: `robot1_base_link`) 등을 사용하거나, 로봇별 TF를 합치는 방법을 설계해야 한다.
* rqt\_graph 멀티 로봇 표시
  * rqt\_graph에서 노드/토픽이 많아 복잡도가 커지므로, 필터 기능으로 특정 namespace(예: `robot1`)만 표시하거나, 토픽 이름을 검색해 구체적으로 살펴볼 수 있다.
* rqt\_logger\_level 개별 조정
  * `robot1/controller`, `robot2/controller`처럼 로봇별 동일 노드가 있을 때, 특정 로봇 노드만 로그 레벨을 높일 수도 있다. 문제 발생 시 해당 로봇 노드만 디버그 메시지를 활성화하면 로그 분량을 효과적으로 관리할 수 있다.

#### Bag 파일(ros2 bag)과 함께 활용

ROS2에서 제공하는 ros2 bag 기능은 토픽 데이터를 파일로 기록·재생할 수 있도록 해준다. 실제 로봇 운용 중에 발생하는 데이터를 모두 저장해두고, 사후에 rRViz2와 rqt를 활용해 디버깅하는 프로세스가 가능하다.

```bash
ros2 bag record -a
```

위 명령어로 시스템의 모든 토픽을 녹화(-a)하거나, 특정 토픽만 지목해 녹화할 수도 있다.

* **녹화(recode)와 재생(play) 시점 분리**: 라이브 디버깅이 어려운 상황(현장에서 로봇 운행 중)이면, 데이터를 bag 파일에 담아 둔다. 이후 개발 환경에서 같은 bag 파일을 재생하며 rRViz2, rqt\_graph, rqt\_plot 등으로 문제 상황을 재현한다.
* **QoS 설정 유의**: ros2 bag를 통해 재생되는 토픽의 QoS와 기존 노드의 QoS가 맞지 않으면 rRViz2나 rqt가 데이터를 구독하지 못할 수 있다. 필요 시 `--qos` 관련 옵션을 확인하거나, 노드 측 QoS 프로필을 플렉서블하게 설정한다.
* **오프라인 디버깅**: 실제 로봇 없이도 rRViz2에서 센서 데이터, TF 정보, 이미지 등을 그대로 확인할 수 있어, 원인 분석에 큰 도움이 된다.

#### rqt\_reconfigure(또는 동적 파라미터) 활용

ROS1 시절의 `dynamic_reconfigure`에 대응되는 기능이 ROS2에는 다소 다르게 구현되어 있지만, rqt에서도 파라미터 변경 기능을 어느 정도 지원한다.

* 동적 파라미터
  * ROS2의 노드는 `declare_parameter()`, `get_parameter()`, `set_parameter()` 등을 통해 동적 파라미터를 다룰 수 있다.
  * rqt에서 플러그인(예: `rqt_param`)을 사용해 노드가 제공하는 파라미터 리스트를 로드하고, 실시간으로 값을 바꿔볼 수 있다.
* 사용 예
  * 로봇 속도 제한(`max_vel_x`), 센서 필터 파라미터(`filter_window_size` 등)를 조정한 뒤, rRViz2에서 주행 로봇 경로나 센서 출력 변화를 재빠르게 검증할 수 있다.
  * Mecanum 휠 로봇의 PID 제어 이득 파라미터를 수정하며, rqt\_plot으로 속도 응답 곡선을 동시에 관찰하는 식으로 활용하면 편리하다.

#### OverlayText와 HUD(Head-Up Display)

RViz(혹은 rRViz2)에는 OverlayText 등으로 상단에 텍스트를 표시하는 방법이 있다. 이는 `jsk_rviz_plugins` 같은 패키지에서 제공하는 기능으로, 로봇 상태나 중요 로그를 rRViz2 화면상에 직접 띄워둘 수 있다.

* 예시
  * 배터리 잔량, 현재 모드(수동/자동/에러 등), 장애물 센서 알람 등 직관적 시각화를 위해 텍스트나 아이콘을 활용한다.
  * 다수의 모니터링 도구를 띄우지 않고도, 핵심 정보를 한눈에 확인할 수 있어 운용 효율이 높다.
* 설정
  * 토픽 타입은 주로 `jsk_rviz_plugins/OverlayText`이며, 메시지 필드에 표시할 문자열, 텍스트 크기, 색상 등을 지정한다.
  * rRViz2의 Display 목록에서 OverlayText를 추가한 후, 해당 토픽 이름을 매칭하면 된다.

#### mermaid를 이용한 그래프 다이어그램 예시

ROS2의 노드 구조나 토픽 흐름을 문서로 정리할 때, mermaid 문법을 통해 간단히 시각화할 수 있다. 예컨대 다음과 같이 mermaid 코드를 사용할 수 있다:

{% @mermaid/diagram content="flowchart LR
A\[Camera Node] --> B\[Image Topic]
B --> C\[rqt\_image\_view]
A --> D\[TF Broadcast]
D --> E\[rRViz2: TF Display]" %}

* 설명
  * A(Camera Node)가 B(Image Topic)를 퍼블리시.
  * rqt\_image\_view(C)에서 B를 서브스크라이브해 영상 확인.
  * 동시에 A가 D(TF Broadcast)도 퍼블리시하면, E(rRViz2)에서 TF Display를 통해 로봇 내 카메라 좌표계를 보여준다.

이처럼 문서화 시에 노드-토픽 관계를 쉽게 도식화해두면, 팀원 간 협업이나 디버깅 로드맵 작성이 수월해진다.

#### 성능 측정과 GUI 툴 부하 고려

rRViz2와 rqt는 그래픽 렌더링, 실시간 데이터 모니터링에 자원을 활용하기 때문에, 로보틱스 시스템이 한창 동작 중일 때 CPU나 GPU 사용량이 급증할 수 있다. 이에 대한 대처 방안은 다음과 같다.

* 렌더링 부하 최소화
  * rRViz2에서 PointCloud2, LaserScan, Image 등 고주파수의 데이터가 많으면, 표시 해상도나 빈도(rate)를 낮추는 설정을 고려한다.
  * 불필요한 디스플레이(예: 사용하지 않는 디스플레이나 다수의 TF 화살표)를 꺼두면 성능이 많이 개선된다.
* GUI 분산 사용
  * 한 대의 PC에서 rRViz2, rqt\_graph, rqt\_plot 모두 실행하면 리소스가 몰릴 수 있다. 필요에 따라 여러 PC나 Docker 컨테이너로 분산해 GUI를 띄우는 전략도 가능하다.
* QoS와 메시지 필터
  * 초당 수백, 수천 개의 메시지를 시각화하면 GUI 렌더링이 느려질 수 있다. 메시지를 다운샘플링하거나, QoS에서 `best_effort` 대신 `reliable`을 사용하는 등 시스템 상황에 맞는 조정이 필요하다.

#### 예제: 라이다 SLAM 디버깅

2D 라이다 기반 SLAM 노드(예: slam\_toolbox, cartographer 등)를 실행하면서 rRViz2, rqt를 병행 활용하는 절차 예시:

1. slam\_toolbox 실행

   ```bash
   ros2 launch slam_toolbox online_async_launch.py
   ```
2. rRViz2에서 지도(MAP), LaserScan 토픽 시각화
   * `Map` 디스플레이에 `/map` 토픽을 지정, 실제 작성되는 지도를 실시간 확인한다.
   * `LaserScan` 디스플레이 추가 후, `/scan` 토픽을 연결해 라이다 스캔이 지도와 맞게 그려지는지 확인한다.
3. rqt\_graph로 노드 연결 관계 점검
   * slam\_toolbox와 로봇의 scan 퍼블리셔 노드, TF 브로드캐스트 노드 관계가 유효한지 확인한다(연결 끊김 여부).
4. rqt\_console로 에러 모니터링
   * SLAM 노드 내부에서 스캔 데이터 부족, TF 변환 오류 등이 발생하면 경고나 에러가 뜰 수 있다.
   * 필요 시 `slam_toolbox`의 logger 레벨을 DEBUG로 설정해 세부 로그 수집.
5. 성능 저하 발생 시
   * rRViz2의 LaserScan 표시 빈도를 줄이고, point size나 intensity 표시 등을 꺼본다.
   * SLAM 알고리즘의 파라미터(매핑 빈도, 최대 스캔 거리 등)를 rqt\_param(혹은 파라미터 서버)로 조정하여 시스템 부하를 완화해본다.
