본문으로 바로가기

토픽, 서비스, 액션 정리

category 강좌/ROS2 2026. 5. 19. 13:13
728x90
728x90

1. 오늘 배운 핵심

이번 강의에서는 ROS 2 Humble 환경에서 turtlesim을 이용해 ROS 2의 기본 통신 구조를 직접 확인했습니다. turtlesim은 단순한 예제처럼 보이지만, ROS 2의 노드, 토픽, 서비스, 메시지, rqt_graph, rosbag 개념을 한 번에 체험할 수 있는 가장 기본적인 학습 도구입니다. 실제 로봇이 없어도 ROS 2의 통신 흐름을 눈으로 확인할 수 있다는 점에서 입문용 실습으로 매우 적합합니다.

ROS 2 시스템은 여러 개의 노드(Node) 가 독립적으로 실행되고, 각 노드는 필요한 데이터를 토픽(Topic), 서비스(Service), 액션(Action) 등을 통해 주고받는 구조입니다. turtlesim_node는 거북이 시뮬레이터를 실행하는 노드이고, turtle_teleop_key는 키보드 입력을 받아 이동 명령을 보내는 노드입니다.


2. 노드 정리

ROS 2에서 노드는 하나의 기능을 담당하는 실행 단위입니다.

예를 들어 실제 드론 시스템이라면 다음처럼 노드를 나눌 수 있습니다.

                            노드                                                                                             역할
카메라 노드 영상 데이터 획득
GPS 노드 위치 데이터 발행
비행 제어 노드 자세 및 위치 제어
그리퍼 제어 노드 물체 집기/놓기
상태 모니터링 노드 배터리, 모드, 오류 상태 확인

 

turtlesim에서는 다음 명령으로 노드를 실행했습니다.

 
ros2 run turtlesim turtlesim_node
 

 

현재 실행 중인 노드는 다음 명령으로 확인했습니다.

 
ros2 node list
 

 

특정 노드가 어떤 토픽을 구독하고 발행하는지, 어떤 서비스를 제공하는지는 다음 명령으로 확인할 수 있습니다.

 
ros2 node info /turtlesim
 

/turtlesim 노드는 /turtle1/cmd_vel 명령을 받아 거북이를 움직이고, /turtle1/pose를 통해 현재 위치와 방향 정보를 발행합니다.


3. 토픽 정리

토픽은 ROS 2에서 가장 많이 사용하는 통신 방식입니다. 한 노드가 데이터를 발행하면 다른 노드가 그 토픽을 구독해서 데이터를 받습니다. 즉, Publisher → Topic → Subscriber 구조입니다. 센서 데이터, 로봇 상태, 속도 명령, 인식 결과처럼 계속 흘러가는 데이터는 대부분 토픽으로 처리합니다.

토픽 관련 기본 명령은 다음과 같습니다.

 
ros2 topic list
ros2 topic list -v
ros2 topic info /turtle1/cmd_vel
ros2 topic type /turtle1/pose
ros2 topic echo /turtle1/pose
 

 

거북이를 움직이는 핵심 토픽은 다음입니다.

 
/turtle1/cmd_vel
 

 

이 토픽의 메시지 타입은 다음입니다.

 
geometry_msgs/msg/Twist
 

 

Twist 메시지는 선형 속도 linear와 회전 속도 angular로 구성됩니다. turtlesim은 2D 평면에서 움직이므로 주로 linear.x와 angular.z를 사용합니다.

 

예를 들어 다음 명령은 거북이를 전진하면서 회전하게 만듭니다.

 
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
 

주기적으로 명령을 보내려면 다음처럼 --rate 옵션을 사용합니다.

 
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
 

실제 로봇 제어에서는 속도 명령을 한 번만 보내는 것이 아니라 일정 주기로 계속 보내는 구조가 중요합니다. 명령이 끊기면 로봇이 멈추거나 안전 모드로 들어가는 경우가 많기 때문입니다.


4. 서비스 정리

서비스는 토픽과 다르게 요청(Request)응답(Response) 이 한 쌍으로 동작하는 통신 방식입니다. 계속 데이터를 흘려보내는 토픽과 달리, 서비스는 특정 작업을 한 번 요청하고 그 결과를 받는 구조입니다.

기본 형식은 다음과 같습니다.

 
ros2 service call <service_name> <service_type> "<data>"
 

turtlesim에서 사용한 대표 서비스는 다음과 같습니다.

                                               서비스                                                                                        기능
/clear 이동 궤적 지우기
/reset 시뮬레이션 초기화
/spawn 새 거북이 생성
/kill 특정 거북이 제거
/turtle1/set_pen 선 색상과 두께 변경
/turtle1/teleport_absolute 절대 좌표로 순간 이동
/turtle1/teleport_relative 현재 위치 기준 상대 이동

 

예시는 다음과 같습니다.

 
ros2 service call /clear std_srvs/srv/Empty
 
 
ros2 service call /reset std_srvs/srv/Empty
 
 
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen \
"{r: 255, g: 255, b: 255, width: 10, off: 0}"
 
 
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute \
"{x: 7.0, y: 7.0, theta: 3.14}"
 

 

서비스는 “계속 보내는 데이터”가 아니라 “필요할 때 한 번 요청하는 기능”에 사용한다고 이해하면 됩니다.


5. rqt_graph 정리

rqt_graph는 현재 실행 중인 ROS 2 노드와 토픽의 연결 관계를 그래프로 보여주는 도구입니다.

 
rqt_graph
 

 

turtlesim_node와 turtle_teleop_key를 실행한 뒤 rqt_graph를 보면 키보드 입력 노드가 /turtle1/cmd_vel 토픽을 통해 turtlesim_node에 명령을 보내는 구조를 확인할 수 있습니다. 이 도구를 사용하면 단순히 명령어만 보는 것이 아니라, ROS 2 시스템이 실제로 어떻게 연결되어 있는지 눈으로 확인할 수 있습니다.


6. rosbag 정리

rosbag은 ROS 2에서 흐르는 토픽 데이터를 기록하고 다시 재생하는 도구입니다. 실제 로봇에서는 센서 데이터와 환경 조건이 매번 달라지기 때문에 같은 상황을 반복 테스트하기 어렵습니다. 이때 rosbag을 사용하면 특정 순간의 데이터를 저장해 두고, 나중에 같은 조건으로 다시 재생할 수 있습니다.

기록 명령은 다음과 같습니다.

 
ros2 bag record /turtle1/cmd_vel
 

이름을 지정해서 저장하려면 다음처럼 입력합니다.

 
ros2 bag record -o cmd_vel_test /turtle1/cmd_vel
 

 

재생은 다음 명령으로 수행합니다.

 
ros2 bag play cmd_vel_test
 

 

rosbag은 단순한 로그 저장이 아니라, 알고리즘 검증과 디버깅을 위한 재현 도구입니다. 실제 로봇 개발에서는 필수에 가깝습니다.


최종 핵심 문장

이번 강의의 핵심은 다음 한 문장으로 정리할 수 있습니다.

ROS 2는 여러 노드가 토픽으로 데이터를 계속 주고받고, 서비스로 필요한 기능을 요청하며, rqt_graph와 rosbag을 이용해 통신 구조를 확인하고 재현하는 시스템입니다.


정리 차원의 실습 내용

실습 목표

이번 실습의 목표는 turtlesim을 이용해 다음 내용을 직접 확인하는 것입니다.

  1. ROS 2 노드 실행
  2. 토픽 목록과 메시지 구조 확인
  3. 토픽 발행으로 거북이 이동
  4. 서비스 호출로 거북이 상태 변경
  5. rqt_graph로 통신 구조 확인
  6. rosbag으로 토픽 기록 및 재생

 

실습 1. turtlesim 실행 및 노드 확인

1단계: ROS 2 환경 설정

 

새 터미널을 열고 다음 명령을 실행합니다.

 
source /opt/ros/humble/setup.bash
 

2단계: turtlesim 실행

 
ros2 run turtlesim turtlesim_node
 

거북이 창이 뜨면 정상입니다.

 

3단계: 다른 터미널에서 노드 확인

 
source /opt/ros/humble/setup.bash
ros2 node list
 

 

예상 결과:

 
/turtlesim
 

4단계: 노드 상세 정보 확인

 
ros2 node info /turtlesim
 

 

확인할 항목:

 
Subscribers
Publishers
Service Servers
Action Servers
 

실습 2. 키보드로 거북이 움직이기

새 터미널을 열고 다음 명령을 실행합니다.

 
source /opt/ros/humble/setup.bash
ros2 run turtlesim turtle_teleop_key
 

화살표 키로 거북이를 움직입니다.

확인할 것:

키보드 입력 → turtle_teleop_key 노드 → /turtle1/cmd_vel 토픽 → turtlesim_node
 

실습 3. 토픽 확인하기

1단계: 토픽 목록 확인

 
ros2 topic list
 

 

확인할 주요 토픽:

 
/turtle1/cmd_vel
/turtle1/pose
/turtle1/color_sensor
/rosout
 

2단계: 토픽 상세 정보 확인

 
ros2 topic info /turtle1/cmd_vel
 
 
ros2 topic info /turtle1/pose
 

 

확인할 것:

Publisher count
Subscription count
Message type
 

3단계: 토픽 타입 확인

 
ros2 topic type /turtle1/cmd_vel
 

 

예상 결과:

 
geometry_msgs/msg/Twist
 
 
ros2 topic type /turtle1/pose
 

 

예상 결과:

 
turtlesim/msg/Pose
 

실습 4. 메시지 구조 확인하기

1단계: Twist 메시지 구조 확인

 
ros2 interface show geometry_msgs/msg/Twist
 

 

확인할 구조:

 
Vector3 linear
Vector3 angular
 

2단계: Vector3 메시지 구조 확인

 
ros2 interface show geometry_msgs/msg/Vector3
 

 

확인할 구조:

 
float64 x
float64 y
float64 z
 

3단계: Pose 메시지 구조 확인

 
ros2 interface show turtlesim/msg/Pose
 

 

확인할 필드:

 
x
y
theta
linear_velocity
angular_velocity
 

실습 5. 토픽 데이터 실시간 확인

새 터미널에서 다음 명령을 실행합니다.

 
ros2 topic echo /turtle1/pose
 

 

다른 터미널에서 키보드로 거북이를 움직입니다.

확인할 것:

x, y 값이 변하는가?
theta 값이 변하는가?
linear_velocity, angular_velocity 값이 변하는가?
 

실습 6. 명령어로 거북이 움직이기

1단계: 한 번만 이동 명령 발행

 
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
 

 

결과:

거북이가 앞으로 조금 이동합니다.
 

2단계: 회전 명령 발행

 
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 2.0}}"
 

결과:

거북이가 제자리에서 회전합니다.
 

3단계: 원형 이동 명령 발행

 
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
 

결과:

거북이가 원형 또는 곡선 형태로 움직입니다.
 

종료:

 
Ctrl + C
 

실습 7. 서비스 호출하기

1단계: 서비스 목록 확인

 
ros2 service list
 

확인할 서비스:

 
/clear
/reset
/spawn
/kill
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
 

2단계: 궤적 지우기

 
ros2 service call /clear std_srvs/srv/Empty
 

결과:

거북이가 지나간 선이 지워집니다.
 

3단계: 펜 색상과 두께 변경

 
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen \
"{r: 255, g: 255, b: 255, width: 10, off: 0}"
 

결과:

거북이가 그리는 선의 색상과 두께가 변경됩니다.
 

4단계: 특정 위치로 순간 이동

 
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute \
"{x: 7.0, y: 7.0, theta: 3.14}"
 

결과:

거북이가 지정한 좌표로 이동합니다.
 

5단계: 새 거북이 생성

 
ros2 service call /spawn turtlesim/srv/Spawn \
"{x: 3.0, y: 3.0, theta: 0.0, name: 'turtle2'}"
 

결과:

turtle2가 새로 생성됩니다.
 

6단계: turtle2 제거

 
ros2 service call /kill turtlesim/srv/Kill "name: 'turtle2'"
 

결과:

turtle2가 화면에서 사라집니다.
 

실습 8. rqt_graph로 구조 확인하기

turtlesim_node와 turtle_teleop_key가 실행 중인 상태에서 새 터미널을 열고 실행합니다.

 
rqt_graph
 

확인할 것:

/turtle_teleop_key
/turtlesim
/turtle1/cmd_vel
 

정리 질문:

어떤 노드가 Publisher인가?
어떤 노드가 Subscriber인가?
어떤 토픽을 통해 연결되는가?
 

정답 방향:

turtle_teleop_key 노드가 /turtle1/cmd_vel 토픽을 발행하고,
turtlesim 노드가 /turtle1/cmd_vel 토픽을 구독합니다.
 

실습 9. 토픽 성능 확인하기

1단계: 토픽 주기 확인

 
ros2 topic hz /turtle1/cmd_vel
 

다른 터미널에서 주기 발행 명령을 실행합니다.

 
ros2 topic pub --rate 5 /turtle1/cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.0}}"
 

확인할 것:

대략 5Hz 근처로 출력되는가?
 

2단계: 토픽 대역폭 확인

 
ros2 topic bw /turtle1/cmd_vel
 

확인할 것:

초당 몇 Byte가 전달되는가?
메시지 크기는 얼마인가?
 

실습 10. rosbag 기록 및 재생

1단계: 토픽 기록

 
ros2 bag record -o cmd_vel_test /turtle1/cmd_vel /turtle1/pose
 

다른 터미널에서 거북이를 움직입니다.

 
ros2 run turtlesim turtle_teleop_key
 

충분히 움직인 뒤 기록 터미널에서 종료합니다.

 
Ctrl + C
 

2단계: 기록 파일 확인

 
ls
 

확인할 폴더:

 
cmd_vel_test
 

3단계: turtlesim 초기화

 
ros2 service call /reset std_srvs/srv/Empty
 

4단계: rosbag 재생

 
ros2 bag play cmd_vel_test
 

확인할 것:

기록했던 /turtle1/cmd_vel 명령이 다시 발행되는가?
거북이가 이전과 비슷한 움직임을 재현하는가?
 

 


한 줄 결론

turtlesim 실습은 장난감 예제가 아니라, 실제 로봇 개발에 들어가기 전 반드시 익혀야 할 ROS 2 통신 구조의 축소판입니다. 노드, 토픽, 서비스, 메시지, 그래프 확인, 데이터 기록까지 여기서 이해하면 이후 센서, 모터, 드론, 모바일 로봇으로 확장하는 흐름이 훨씬 명확해집니다.

728x90
728x90

'강좌 > ROS2' 카테고리의 다른 글

서비스 서버 만들기  (0) 2026.05.21
서비스 정의 만들기  (0) 2026.05.21
ROS2 사용자 정의 메세지 만들기 #2  (0) 2026.05.09
ROS2 사용자 정의 메세지 만들기 #1  (0) 2026.05.09
ROS2 패키지 만들고 토픽 다루기  (0) 2026.05.08