[Physical AI W2D1 · 1/6]
ros2 topic echo로 쏟아지는 숫자만 봐서는 로봇이 어디를 보는지 알 수 없다. RViz는 ROS 2의 토픽·TF·URDF를 구독해 로봇 상태와 센서 데이터를 3D로 그려준다. 그 시각화 흐름과 핵심인 Fixed Frame·Display를 개념부터 잡는다.
이 글에서 잡는 개념
왜 숫자(토픽 echo)만으로는 부족하고 시각화가 필요한가
RViz가 ROS 2에서 하는 역할 — "데이터를 구독해 3D로 그리는 도구"
RViz 화면 구성: Displays · Global Options · 3D View · Status
Fixed Frame(모든 데이터를 모으는 기준 좌표계)과 Display가 보이기 위한 5가지 조건
(Week2 Day1의 시작입니다. W1D2에서 ROS 2 노드·토픽·TF를 다뤘다면, 이제 그 데이터를 눈으로 보는 단계입니다.)
들어가며 — 숫자만으로는 로봇을 이해할 수 없다
로봇 소프트웨어 안에서 로봇의 상태는 대부분 숫자입니다. 위치는 좌표값, 방향은 회전값, LiDAR는 거리 배열, 카메라는 이미지 메시지, 이동 경로는 위치 점들의 묶음(Path)으로 표현됩니다.
W1D2에서 배운 대로, 이 데이터는 ROS 2의 노드·토픽·메시지로 흐릅니다 — 예를 들어 LiDAR 노드는 /scan 토픽으로 거리 데이터를, Odometry 노드는 /odom 토픽으로 추정 위치를 발행하죠.
그런데 터미널에서 ros2 topic echo /scan으로 숫자만 봐서는 — 로봇이 어느 방향을 보는지, 센서 점들이 로봇 주변에 어떻게 분포하는지, 좌표계가 올바르게 연결됐는지, 경로가 정상인지 직관적으로 판단하기 어렵습니다.
💡 RViz란 — ROS 2에서 발행되는 토픽·메시지·TF·URDF를 이용해 로봇 상태와 센서 데이터를 3D 공간에 그려주는 대표 시각화 도구입니다.
좌표계, 센서 위치, LiDAR 점, 카메라 영상, 이동 경로, 로봇 모델을 한 화면에서 봅니다.
중요한 점: RViz는 로봇을 움직이지 않습니다. 이미 발행되고 있는 ROS 2 데이터를 구독(Subscribe) 해서 화면에 표시할 뿐입니다.
1. RViz가 그리는 것들
RViz의 주요 역할은 다음과 같습니다.
로봇 모델 시각화 좌표계(TF) 관계 시각화
LiDAR 센서 데이터 3D 점군(PointCloud)
카메라 영상 Odometry(위치 추정)
Path(이동 경로) Marker(사용자 정의)
TF 오류 / Fixed Frame 오류 확인
RViz가 어떤 데이터를 그리려면 세 가지 정보가 필요합니다 — 이게 RViz를 이해하는 핵심입니다.
무엇을 표시? → Topic과 Message (예: /scan, sensor_msgs/msg/LaserScan)
어디에 표시? → frame_id와 TF (그 데이터의 기준 좌표계)
어떻게 표시? → Display 설정
이 셋 중 하나라도 안 맞으면, 토픽이 정상 발행돼도 화면엔 안 나옵니다. (이게 RViz 디버깅의 출발점 — 2편에서 자세히)
2. ROS 2 데이터 흐름과 RViz
RViz는 여러 토픽을 구독하는 Subscriber입니다. 데이터 노드가 발행하면 → 토픽으로 흐르고 → RViz의 해당 Display가 그립니다.
LiDAR Node → /scan → RViz LaserScan Display
Odometry Node → /odom → RViz Odometry Display
TF Broadcaster → /tf → RViz TF Display
토픽·메시지 타입·Display의 대응 관계를 표로 정리하면:
| 발행 데이터 | 토픽 | 메시지 타입 | RViz Display |
|---|---|---|---|
| LiDAR 거리 | /scan |
sensor_msgs/msg/LaserScan |
LaserScan |
| 3D 점군 | /points |
sensor_msgs/msg/PointCloud2 |
PointCloud2 |
| 카메라 영상 | /image |
sensor_msgs/msg/Image |
Image |
| 위치 추정 | /odom |
nav_msgs/msg/Odometry |
Odometry |
| 이동 경로 | /path |
nav_msgs/msg/Path |
Path |
| 좌표계 변환 | /tf |
tf2_msgs/msg/TFMessage |
TF |
| 로봇 모델 | /robot_description |
URDF 문자열 | RobotModel |

RViz는 토픽을 단순 출력하는 게 아니라 메시지 타입과 좌표계를 해석해 3D에 표시합니다.
3. RViz 화면 구성
| 영역 | 역할 |
|---|---|
| Displays 패널 | 무엇을 표시할지 설정(TF·RobotModel·LaserScan·… Display 추가) |
| Global Options | RViz 전체 기준 설정 — 핵심은 Fixed Frame |
| 3D View | 로봇·좌표계·센서·경로가 실제로 그려지는 중심 화면 |
| Views | 보는 시점(TopDownOrtho=위에서, Orbit=회전하며) |
| Tool Bar | 이동·선택·목표지정(2D Pose Estimate, 2D Nav Goal 등) |
| Status | 각 Display의 상태·오류(TF 없음, Fixed Frame 오류 등) |
💡 RViz를 켜면 가장 먼저 확인할 두 가지:
① Fixed Frame이 올바른가
② Display가 올바른 Topic을 보는가. 이 둘이 안 맞으면 데이터가 발행돼도 안 보입니다.
4. Global Options와 Fixed Frame — RViz의 심장
ROS 2에서는 데이터마다 기준 좌표계가 다릅니다. LiDAR는 laser 기준, Odometry는 odom 기준, 로봇 본체는 base_link 기준으로 발행되죠.
LaserScan → header.frame_id: laser
Odometry → header.frame_id: odom, child_frame_id: base_link
RViz는 이 데이터들을 한 화면에 함께 그려야 하니, 모두 공통 기준 좌표계로 변환해야 합니다. 그 기준이 Fixed Frame입니다.
대표 Fixed Frame:
| Fixed Frame | 의미 | 언제 |
|---|---|---|
map |
전역 지도 기준 | SLAM·Navigation에서 전체 지도 기준 위치 |
odom |
주행 추정 기준 | 출발 후 상대 이동 확인 (기본 시각화에서 자주 사용) |
base_link |
로봇 본체 기준 | 로봇 중심 기준 센서 위치·구조 확인 |
Fixed Frame을 잘못 설정하면 No transform 오류가 나고 LaserScan·Odometry·Path·RobotModel이 안 보이거나 위치가 어긋납니다.
⚠️ 흔한 함정 ① — Fixed Frame 먼저 — RViz 실습에서 데이터가 안 보이면 십중팔구 Fixed Frame부터 의심하세요. 이동 로봇 기본 시각화에선 보통
odom을 씁니다.
5. Display가 보이기 위한 5가지 조건
Display는 특정 데이터를 화면에 그리는 단위입니다. Display를 추가한다는 건 단순 화면 요소 추가가 아니라,
그 메시지 타입을 해석할 시각화 모듈을 연결하는 것입니다 — 그래서 메시지 타입과 Display가 맞아야 합니다(/scan이 LaserScan 타입이면 LaserScan Display).
Display가 정상 동작하기 위한 조건을 외워두면 RViz 오류의 90%를 잡습니다.
① 토픽이 존재해야 한다
② 메시지가 계속 발행되고 있어야 한다
③ Display 타입과 메시지 타입이 맞아야 한다
④ 메시지의 frame_id가 존재해야 한다
⑤ frame_id ↔ Fixed Frame 사이에 TF가 연결돼 있어야 한다
RViz 오류의 상당수는 이 다섯 중 하나가 어긋났을 때 발생합니다. 특히 ⑤ TF 연결이 자주 빠집니다(→ 2편의 TF 편에서 깊게).
1편 정리
- RViz = ROS 2 데이터를 구독해 3D로 그리는 도구. 로봇을 움직이는 게 아님.
- 표시의 3요소: 무엇(Topic·Message) / 어디(frame_id·TF) / 어떻게(Display).
- 흐름: 데이터 발행 → TF 발행 → RViz → Fixed Frame 설정 → Display 추가 → 시각화.
- Fixed Frame = 모든 데이터를 모으는 공통 기준 좌표계(보통
odom). - Display가 보이는 5조건: 토픽 존재 · 발행 지속 · 타입 일치 · frame_id 존재 · TF 연결.
다음 편 예고
2편에서는 RViz의 진짜 핵심인 TF(좌표계 변환) 와 주요 좌표계(map·odom·base_link·laser·camera_link), URDF/RobotModel, 그리고 센서 Display들(LaserScan·Odometry·Path·PointCloud2·Image·IMU·Marker)을 하나씩 보고, "데이터가 안 보일 때" 디버깅 원리까지 정리합니다.
📚 Week2 Day1 전체 목차 (총 6편)
- 1/6 RViz로 로봇을 눈으로 보다 — 시각화 흐름·Fixed Frame·Display — 이번 글
- 2/6 RViz 개념 ② — TF·좌표계·URDF·센서 Display·디버깅
- 3/6 RViz2 실습 — GCP VM 헤드리스 GUI + Publisher + 시각화
- 4/6 좌표계와 동차 변환 행렬 ① — 좌표계·2D 변환·동차좌표
- 5/6 좌표계와 동차 변환 행렬 ② — 3D·TF·Quaternion·기구학
- 6/6 좌표 변환 실습 — Python 변환 + TF Publisher + RViz
'피지컬AI' 카테고리의 다른 글
| [Physical AI W2D1] 4/6 — 좌표계와 동차 변환 행렬 ①: 좌표계·2D 변환·동차좌표 (0) | 2026.06.20 |
|---|---|
| [Physical AI W2D1] 2/6 — RViz 개념 ②: TF·좌표계·URDF·센서 Display·디버깅 (0) | 2026.06.20 |
| [Physical AI W1D2] 6/6 — ROS 2 패키지 빌드 마스터: Python·C++·colcon (0) | 2026.06.14 |
| [Physical AI W1D2] 5/6 — ROS 2 서비스·액션 구현: 요청/응답과 목표/피드백 (0) | 2026.06.14 |
| [Physical AI W1D2] 4/6 — ROS 2 토픽 직접 만들기: Publisher·Subscriber (0) | 2026.06.14 |