[ROS2 Mastery 2편] ROS2 핵심 통신 개념 및 강력한 유틸리티 ‘RQT’ 활용법
안녕하세요! 마케팅 팀의 에이든(Aiden)입니다.
로봇 공학과 자율주행을 연구하시는 대학생, 그리고 현장에서 구슬땀을 흘리시는 연구원 여러분. 1편에서 ROS2 작업공간(Workspace)을 구축하고 빌드하는 방법을 무사히 마치셨나요?
이제 여러분의 로봇 시스템이 숨을 쉴 수 있도록 ‘신경망’을 연결해 줄 차례입니다. 현대 로봇 소프트웨어는 거대한 하나의 프로그램이 아니라, 수많은 작은 프로그램들이 서로 데이터를 주고받으며 협업하는 구조로 이루어져 있습니다.
이번 2편에서는 ROS2의 뼈대가 되는 핵심 통신 개념(Node, Topic, Service, Action, Parameter)을 이해하고, 이 복잡한 통신 상태를 한눈에 파악하고 제어할 수 있는 최고의 시각화 유틸리티인 ‘RQT‘의 활용법을 알아보겠습니다.

ROS2 핵심 통신 개념 이해하기
로봇을 제어하기 위해 코드를 작성하기 전, 시스템을 구성하는 기본 단위와 통신 방식을 명확히 아는 것은 필수입니다.
1) 노드 (Node)
ROS2 시스템에서 노드는 가장 기본적인 실행 단위입니다. 하나의 노드는 레이저 스캐너(LiDAR)를 제어하거나, 모터의 속도를 제어하거나, 카메라 이미지를 처리하는 등 단일하고 구체적인 목적을 수행하는 독립적인 프로그램입니다. 노드들이 모여 하나의 거대한 로봇 시스템을 구성하게 됩니다.
2) 토픽 (Topic) – 비동기식 단방향 통신
토픽은 노드 간에 데이터를 스트리밍할 때 사용하는 버스(Bus)입니다. 데이터를 보내는 노드를 발행자(Publisher), 데이터를 받는 노드를 구독자(Subscriber)라고 부릅니다. 예를 들어 거북이 시뮬레이터(Turtlesim)에서 거북이를 움직이기 위해서는 /turtle1/cmd_vel이라는 토픽을 사용합니다. 이 토픽은 geometry_msgs/msg/Twist라는 데이터 타입을 가지며, 내부를 살펴보면 다음과 같이 직선 이동(linear)과 회전 이동(angular)을 3차원 벡터(x, y, z)로 제어할 수 있도록 구성되어 있습니다.
[예제: 토픽 데이터 타입 확인]
$ ros2 interface show geometry_msgs/msg/Twist
Vector3 linear
Vector3 angular
이러한 토픽 통신은 센서 데이터 스트리밍이나 지속적인 제어 명령 전송에 매우 적합합니다.
3) 서비스 (Service) – 동기식 양방향 통신
서비스는 클라이언트(Client)가 서버(Server)에게 특정 작업을 요청(Request)하고, 서버가 처리 후 응답(Response)을 돌려주는 1회성 통신 방식입니다.
ROS2에서 제공하는 데모 노드를 통해 서비스를 직접 체험해 보겠습니다. 터미널을 열고 두 숫자를 더해주는 add_two_ints_server 노드를 실행합니다.
$ ros2 run demo_nodes_cpp add_two_ints_server
이 서비스가 어떤 데이터 명세(타입)를 사용하는지 확인하려면 /opt/ros/humble/share (또는 jazzy 경로) 등에 저장된 .srv 파일을 살펴봐야 합니다. ros2 interface show 명령으로 확인해 봅시다.
$ ros2 interface show example_interfaces/srv/AddTwoInts
int64 a
int64 b
---
int64 sum
여기서 중간에 있는 --- 구분자가 매우 중요합니다. 위쪽은 클라이언트가 요청하는 데이터(두 숫자 a, b)이고, 아래쪽은 서버가 응답하는 데이터(결과 sum)를 의미합니다. 다른 터미널을 열어 클라이언트로서 서비스를 요청해 보면 즉시 응답을 받을 수 있습니다.
$ ros2 run demo_nodes_cpp add_two_ints_client 2 3
# 서버에서 2와 3을 더해 5라는 결과를 응답으로 반환합니다.
4) 액션(Action)과 파라미터(Parameter)
- 액션(Action): 서비스와 비슷하지만, 목표 위치로 주행하기 등 완료까지 시간이 오래 걸리는 작업에 사용됩니다. 작업 중간에 지속적인 피드백(Feedback)을 받을 수 있고, 취소도 가능합니다.
- 파라미터(Parameter): 각 노드의 설정값을 의미합니다. 노드 실행 중에도 값을 변경하여 로봇의 동작(예: 최대 주행 속도 등)을 동적으로 튜닝할 수 있습니다.
Turtlesim과 텔레오프(Teleop) 노드 실행
이론으로 배운 내용을 눈으로 직접 시각화해보기 위해, 귀여운 2D 로봇 시뮬레이터인 Turtlesim을 실행해 보겠습니다. 새 터미널을 열고 아래 명령어로 거북이 노드를 실행합니다.
$ ros2 run turtlesim turtlesim_node
그다음, 다른 터미널을 하나 더 열고 키보드 방향키로 거북이를 원격 조종할 수 있는 텔레오프 노드를 실행합니다.
$ ros2 run turtlesim turtle_teleop_key
이제 화살표 키를 누르면 거북이가 화면 안에서 자유롭게 움직이는 것을 볼 수 있습니다. 속에서는 키보드 노드가 cmd_vel 토픽을 발행(Publish)하고, 거북이 노드가 이를 구독(Subscribe)하여 움직이고 있는 상태입니다.
강력한 ROS2 시각화 유틸리티, ‘RQT’ 활용법
로봇 연구자에게 RQT는 청진기이자 스위스 아미 나이프와 같은 도구입니다. 보이지 않는 ROS2의 통신 상태를 시각화하고, 명령을 주입할 수 있는 GUI 플러그인 프레임워크입니다.
완전히 새로운 터미널을 열고 rqt를 실행해 봅니다.
$ rqt
처음 실행하면 아무것도 없는 빈 창이 뜹니다. RQT는 여러 가지 ROS2 유틸리티들을 플러그인 형태로 추가하여 사용하는 방식이기 때문입니다. 상단 메뉴의 [Plugins]를 클릭하여 연구에 필수적인 6가지 핵심 플러그인을 하나씩 살펴보겠습니다.
1) RQT Graph (노드/토픽 시각화)
- 경로: Plugins -> Introspection -> Node Graph 현재 ROS2 시스템에서 실행 중인 노드와, 노드들이 어떤 토픽을 매개로 데이터를 주고받는지 그래픽 트리 형태로 시각화해 줍니다. 앞서 실행한
/teleop_turtle노드와/turtlesim노드가/turtle1/cmd_vel토픽 화살표로 연결된 것을 한눈에 파악할 수 있어, 통신 연결 디버깅에 매우 유용합니다.
2) Topic Monitor (데이터 흐름 감시)
- 경로: Plugins -> Topics -> Topic Monitor 현재 주고받는 토픽의 실제 값을 실시간으로 모니터링할 수 있는 플러그인입니다. 거북이가 이동할 때
/turtle1/pose토픽의 체크박스를 클릭하면, 거북이의 현재 x, y 좌표와 회전 각도(theta) 데이터가 실시간으로 변하는 숫자를 직접 눈으로 확인할 수 있습니다. 연구 중 센서 값이 제대로 들어오고 있는지 확인할 때 필수적입니다.
3) Topic Publisher (토픽 강제 발행)
- 경로: Plugins -> Topics -> Message Publisher 터미널이나 Python 코드 없이, RQT GUI 상에서 직접 토픽을 발행하여 노드를 제어할 수 있습니다.
/turtle1/cmd_vel토픽을 선택하고, linear.x 값을 2.0으로, angular.z 값을 1.0으로 설정한 뒤 발행 주기를 1Hz로 켜두면, 키보드 조작 없이도 거북이가 자동으로 원을 그리며 빙글빙글 도는 것을 확인할 수 있습니다. 코드를 짜기 전 로봇 모터가 제대로 반응하는지 단위 테스트(Unit test)를 할 때 훌륭한 도구가 됩니다.
4) Service Caller (서비스 직접 호출)
- 경로: Plugins -> Services -> Service Caller 현재 ROS2 네트워크에 등록된 서비스 목록을 드롭다운 메뉴로 조회하고, 매개변수를 입력하여 직접 서비스를 호출(Call)할 수 있는 플러그인입니다. 거북이가 그리는 궤적의 색상을 바꾸는
/turtle1/set_pen서비스를 선택하고, r, g, b 값에 원하는 색상 코드를 입력 후 ‘Call’ 버튼을 누르면 즉시 거북이의 펜 색상이 바뀝니다. 복잡한 서비스 클라이언트 코드를 작성하지 않고도 서비스 로직을 검증할 수 있습니다.
5) Console (로그 관리)
- 경로: Plugins -> Logging -> Console ROS2 노드들이 출력하는 모든 로그(INFO, WARN, ERROR, FATAL 등)를 한곳에 모아서 보여주는 모니터링 콘솔입니다. 수많은 터미널 창을 일일이 확인할 필요 없이, 이 창 하나에서 로봇 시스템 전체의 에러 상태와 경고 메시지를 필터링하여 빠르고 정확하게 디버깅할 수 있습니다.
6) Bag (데이터 기록 및 재생)
- 경로: Plugins -> Logging -> Bag 비싸고 무거운 실제 로봇을 연구실 밖으로 가져가서 실험 데이터를 수집했다면,
Bag플러그인을 사용하여 모든 노드의 실행 상태와 토픽, 센서 데이터를 통째로 기록(Record)할 수 있습니다. 실험실로 돌아와 기록된 Bag 파일을 재생(Play)하면, 마치 로봇이 실제로 움직이는 것처럼 똑같은 데이터를 뿜어내므로 코드 수정 후 결과를 반복해서 검증할 수 있습니다.
YouTube Tutorial
마무리하며
이번 2편에서는 ROS2 시스템을 구성하는 혈관과도 같은 ‘통신 개념(Node, Topic, Service)’을 예제와 함께 살펴보고, 이 혈관 속을 들여다보고 조작할 수 있는 전천후 도구인 ‘RQT’의 6가지 강력한 기능을 실습해 보았습니다.
로봇 연구 과정에서 발생하는 수많은 버그와 통신 오류 앞에서도, 오늘 배운 RQT Graph와 Topic Monitor를 꺼내 든다면 문제의 원인을 금방 찾아내실 수 있을 것입니다.
이제 ROS2가 어떻게 소통하는지 완벽하게 이해하셨으니, 다음 3편: 첫 ROS2 패키지 생성 및 Python 노드 프로그래밍에서는 드디어 우리가 직접 Python 코드를 작성하여 거북이를 자유자재로 다루는 ‘마이 로봇 컨트롤러(my_robot_controller)’ 패키지를 만들어 보겠습니다.

작성자: 에이든(Aiden), 쿼드(QUAD) 드론연구소 마케팅팀
기고일: 2026.05.05
