ROS 2 TurtleSim으로 배우는 로봇 프로그래밍 기초
ROS 2의 핵심 개념인 노드(Node), 토픽(Topic), 서비스(Service)를 TurtleSim을 통해 실습하며 배우는 완벽 가이드

들어가며
ROS 2 설치를 완료했다면, 이제 본격적으로 로봇 프로그래밍을 시작할 차례입니다!
TurtleSim은 ROS 2의 가장 기본적이면서도 강력한 학습 도구입니다. 귀여운 거북이를 움직이면서 ROS 2의 핵심 개념인 노드(Node), 토픽(Topic), 서비스(Service)를 자연스럽게 배울 수 있습니다.
ROS 2 핵심 개념 미리보기
ROS 2는 복잡한 로봇 시스템을 구축하기 위한 프레임워크입니다. 다음 세 가지 핵심 개념을 이해하면 ROS 2의 동작 원리를 파악할 수 있습니다:
노드(Node) - 실행 단위
- 로봇 시스템의 각 기능을 담당하는 프로그램
- 예: 카메라 노드, 모터 제어 노드, 센서 노드
- TurtleSim에서는
turtlesim_node(화면 표시),turtle_teleop_key(키보드 입력)가 노드입니다
토픽(Topic) - 데이터 스트림
- 노드들이 지속적으로 데이터를 주고받는 채널
- TV 방송처럼 발행자(Publisher)가 송출하면 구독자(Subscriber)가 수신
- 예:
/turtle1/cmd_vel토픽으로 "앞으로 가!", "왼쪽으로 돌아!" 같은 속도 명령 전달
서비스(Service) - 요청/응답
- 필요할 때만 호출하는 일회성 작업
- 식당에서 주문하는 것처럼 요청(Request)하면 응답(Response)을 받음
- 예:
/spawn서비스로 "거북이 추가해줘" 요청 → "생성 완료" 응답

이 세 가지 개념을 TurtleSim을 통해 직접 실습하며 익혀봅시다!
배울 내용
- TurtleSim 패키지 설치 및 실행
- 키보드로 거북이 조종하기
- ROS 2 토픽(Topic) 이해하기
- ROS 2 서비스(Service) 사용하기
- 명령어로 거북이 제어하기
- 여러 마리 거북이 생성하기
사전 준비
- ROS 2 Humble 설치 완료 (이전 글: 맥북에서 ROS 2 Humble 환경 구축하기 참조)
- Ubuntu Desktop 설치 권장 (GUI 도구 사용을 위해)
- SSH 접속 환경 구축 (복사-붙여넣기 편의성)
1. 첫걸음: TurtleSim 설치하기
1-1. 패키지 설치
TurtleSim은 ROS 2의 공식 튜토리얼 패키지입니다.
SSH로 Ubuntu VM에 접속한 후 실행:
sudo apt update
sudo apt install ros-humble-turtlesim -y
1-2. 설치 확인
설치가 제대로 되었는지 확인하기 위해 TurtleSim 패키지에 포함된 실행 가능한 프로그램 목록을 확인합니다. 참고로 ROS2(Robot Operating System 2)에서 **패키지(Package)**는 소프트웨어를 구성하는 가장 기본적인 단위입니다. 쉽게 비유하자면, 하나의 완성된 기능을 수행하기 위해 필요한 코드, 설정 파일, 데이터 등을 하나로 묶어놓은 '도시락 박스'나 '앱'과 같다고 이해하시면 됩니다.
ros2 pkg executables turtlesim
│ │ │ └─ 패키지 이름
│ │ └─ 실행 가능한 프로그램 목록 출력
│ └─ 패키지 관련 명령어
└─ ROS 2 CLI 도구
이 명령어는 해당 패키지에 포함된 모든 실행 파일(노드)을 나열합니다.
예상 출력:
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node

이렇게 나오면 설치 완료! ✅
2. 거북이 깨우기: 첫 실행과 조종
2-1. TurtleSim 노드 실행
중요: UTM 콘솔에서 실행 시
UTM VM 콘솔에서 로그인한 경우, ROS 2 환경 변수가 자동으로 로드되지 않을 수 있습니다. 먼저 다음 명령어를 실행하세요:
source ~/.bashrc
이제 ROS 2 명령어를 사용할 수 있습니다!
터미널 1에서 실행:
ros2 run turtlesim turtlesim_node
예상 결과:
- GUI 창이 열리며 파란 배경에 거북이가 나타남
- 터미널에 로그 출력

❗ 문제 발생 시: "could not connect display" 에러
Ubuntu Server 버전은 GUI 환경이 없어서 다음과 같은 에러가 발생합니다:
xcb: could not connect to display
qt.qpa.xcb: could not connect to display
해결 방법: Ubuntu Desktop 설치
GUI 환경을 추가로 설치하면 TurtleSim을 포함한 모든 ROS 2 GUI 도구를 사용할 수 있습니다. 설치하는데 시간이 좀 걸립니다. 커피 한 잔하고 하면서 글을 먼저 읽어도 좋습니다.
sudo apt install ubuntu-desktop -y
설치 정보:
- 소요 시간: 약 30-40분
- 디스크 공간: 약 4-5GB 추가 사용
- 재부팅: 설치 완료 후 재부팅 권장
설치 완료 후:
sudo reboot
재부팅 후 UTM에서 VM 시작하면 그래픽 로그인 화면이 나타납니다!

2-2. 키보드로 거북이 조종하기
새 터미널 열기:
- UTM 콘솔: Ctrl+Alt+F2 (다른 가상 터미널) 또는 GUI 환경에서 새 터미널 창 열기
터미널 2에서 실행:
ros2 run turtlesim turtle_teleop_key
💡 명령어 의미:
ros2 run [패키지명] [실행파일명]
↓ ↓
ros2 run turtlesim turtle_teleop_key
ros2 run: ROS 2 노드 실행 명령어turtlesim: 패키지 이름turtle_teleop_key: 실행 파일 (키보드 조종 프로그램)- Teleop = Teleoperation (원격 조종)
- Key = Keyboard (키보드)
동작 원리:
turtle_teleop_key가 키보드 입력 감지- 화살표 키 → 속도 데이터로 변환
/turtle1/cmd_vel토픽으로 전송turtlesim_node가 토픽 수신 → 거북이 이동
조작 방법:
- ↑ (위쪽 화살표): 앞으로 직진
- ← (왼쪽 화살표): 왼쪽으로 회전
- → (오른쪽 화살표): 오른쪽으로 회전
⚠️ 중요: 터미널 창에 포커스를 두고 화살표 키를 누르세요! 화살표 키를 누름에 따라서 흰색 선을 그리면 거북이가 움직이는 모습을 볼 수 있습니다.

3. 데이터 흐름의 비밀: 토픽(Topic) 마스터하기
3-1. 토픽이란?
토픽은 ROS 2에서 노드 간 데이터를 주고받는 통신 채널입니다.
- Publisher: 데이터를 보내는 노드
- Subscriber: 데이터를 받는 노드
- Topic: 데이터가 흐르는 채널 (예:
/turtle1/cmd_vel)
3-2. 현재 활성화된 토픽 확인
ROS 2 시스템에서 현재 실행 중인 모든 토픽을 확인하여 어떤 데이터 채널이 활성화되어 있는지 파악합니다.
터미널 3에서 실행:
ros2 topic list
│ │ └─ 모든 토픽 목록 출력
│ └─ 토픽 관련 명령어
└─ ROS 2 CLI 도구
현재 시스템에서 활성화된 모든 토픽의 이름을 확인합니다.
예상 출력:
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

주요 토픽 설명:
/turtle1/cmd_vel: 거북이 이동 명령/turtle1/pose: 거북이 위치 정보/turtle1/color_sensor: 거북이가 밟고 있는 색상
3-3. 토픽 데이터 실시간 확인
특정 토픽에서 전송되는 데이터를 실시간으로 모니터링합니다. 거북이의 위치와 속도 정보를 확인해봅시다.
거북이 위치 정보 보기:
ros2 topic echo /turtle1/pose
│ │ │ └─ 토픽 이름
│ │ └─ 토픽 데이터를 실시간으로 출력
│ └─ 토픽 관련 명령어
└─ ROS 2 CLI 도구
특정 토픽에서 전송되는 데이터를 실시간으로 확인합니다.
출력 예시:
x: 5.544444561004639
y: 5.544444561004639
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
---
설명:
x, y: 거북이 위치 (0~11 범위)theta: 회전 각도 (라디안)linear_velocity: 직진 속도angular_velocity: 회전 속도
거북이를 움직이면 값이 실시간으로 변합니다!

3-4. 토픽 정보 상세 보기
topic info, topic hz 등으로 토픽의 메시지 타입, Publisher/Subscriber 개수, 발행 주파수 등 상세 정보를 조회합니다.
토픽 타입 확인:
ros2 topic info /turtle1/cmd_vel
│ │ │ └─ 토픽 이름
│ │ └─ 토픽의 상세 정보 출력
│ └─ 토픽 관련 명령어
└─ ROS 2 CLI 도구
토픽의 메시지 타입, Publisher/Subscriber 개수 등 상세 정보를 확인합니다.
토픽 주파수 확인:
ros2 topic hz /turtle1/cmd_vel
│ │ │ └─ 토픽 이름
│ │ └─ 토픽 발행 주파수(Hz) 측정
│ └─ 토픽 관련 명령어
└─ ROS 2 CLI 도구
토픽에 데이터가 초당 몇 번 전송되는지 측정합니다. 키보드로 거북이를 움직이는 동안 실행하면 초당 전송 횟수를 확인할 수 있습니다.

4. 코드로 조종하기: 명령어로 거북이 자유자재로 움직이기
4-1. 직접 토픽 발행(Publish)
키보드 조종 없이 명령어로 직접 속도 명령을 발행하여 거북이를 제어합니다. 이를 통해 토픽의 동작 원리를 더 명확히 이해할 수 있습니다.
거북이 직진:
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}}"
│ │ │ │ │ │ └─ 실제 데이터 (JSON 형식)
│ │ │ │ │ └─ 메시지 타입 (속도 데이터)
│ │ │ │ └─ 토픽 이름 (거북이 속도 명령)
│ │ │ └─ 1회만 발행
│ │ └─ 토픽에 데이터 발행(publish)
│ └─ 토픽 관련 명령어
└─ ROS 2 CLI 도구

토픽에 속도 명령을 1회 발행하여 거북이를 직진시킵니다.

거북이 회전:
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: 1.8}}"
│ │ │ │ │ │ └─ angular.z: 1.8 (회전 속도)
│ │ │ │ │ └─ 메시지 타입
│ │ │ │ └─ 토픽 이름
│ │ │ └─ 1회만 발행
│ │ └─ 토픽에 데이터 발행
│ └─ 토픽 관련 명령어
└─ ROS 2 CLI 도구
거북이를 제자리에서 회전시킵니다.
연속 발행 (1Hz):
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}}"
│ │ │ │ │ │ │ └─ linear: 2.0 + angular: 1.8 (원 운동)
│ │ │ │ │ │ └─ 메시지 타입
│ │ │ │ │ └─ 토픽 이름
│ │ │ │ └─ 초당 1회 반복 발행 (1Hz)
│ │ │ └─ 발행 주파수 지정
│ │ └─ 토픽에 데이터 발행
│ └─ 토픽 관련 명령어
└─ ROS 2 CLI 도구
직진과 회전을 동시에 명령하여 거북이가 원을 그리며 움직입니다! Ctrl+C로 중지.

5. 마법 같은 명령: 서비스(Service)로 거북이 제어하기
5-1. 서비스란?
서비스는 요청-응답(Request-Response) 방식의 통신입니다.
- 토픽: 계속 흐르는 데이터 스트림 (예: 센서 데이터)
- 서비스: 일회성 요청/응답 (예: "거북이 초기화해줘")
5-2. 사용 가능한 서비스 확인
TurtleSim에서 제공하는 모든 서비스 목록을 확인합니다. 각 서비스는 특정 기능을 수행합니다.
ros2 service list
│ │ └─ 모든 서비스 목록 출력
│ └─ 서비스 관련 명령어
└─ ROS 2 CLI 도구
현재 시스템에서 사용 가능한 모든 서비스의 목록을 확인합니다.
예상 출력:
/clear
/kill
/reset
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative

5-3. 화면 지우기 (clear)
거북이가 이동하며 그린 모든 선을 화면에서 지웁니다. 새롭게 시작하고 싶을 때 유용합니다.
ros2 service call /clear std_srvs/srv/Empty
│ │ │ │ │ └─ 메시지 타입 (빈 메시지)
│ │ │ │ └─ 표준 서비스 메시지
│ │ │ └─ 서비스 이름
│ │ └─ 서비스 호출
│ └─ 서비스 관련 명령어
└─ ROS 2 CLI 도구

화면 지우기 서비스를 호출하여 거북이가 그린 경로를 모두 삭제합니다.

5-4. 거북이 텔레포트
거북이를 원하는 위치로 순간이동시킵니다. 절대 좌표 또는 상대 이동 두 가지 방식을 사용할 수 있습니다.
절대 위치로 이동:
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 5.5, y: 5.5, theta: 0.0}"
│ │ │ │ │ └─ 위치 및 방향 데이터 (JSON)
│ │ │ │ └─ 메시지 타입 (절대 텔레포트)
│ │ │ └─ 서비스 이름
│ │ └─ 서비스 호출
│ └─ 서비스 관련 명령어
└─ ROS 2 CLI 도구
거북이를 화면의 절대 좌표로 순간이동시킵니다. (5.5, 5.5)는 화면 중앙입니다.

상대 위치로 이동:
ros2 service call /turtle1/teleport_relative turtlesim/srv/TeleportRelative "{linear: 2.0, angular: 1.57}"
│ │ │ │ │ └─ 이동 거리 및 회전 각도
│ │ │ │ └─ 메시지 타입 (상대 텔레포트)
│ │ │ └─ 서비스 이름
│ │ └─ 서비스 호출
│ └─ 서비스 관련 명령어
└─ ROS 2 CLI 도구
현재 위치에서 상대적으로 이동시킵니다. (앞으로 2.0, 회전 1.57 라디안)

5-5. 펜 색상 변경
거북이가 그리는 선의 색상, 굵기, 그리기 ON/OFF를 설정합니다. 다양한 색으로 경로를 그려볼 수 있습니다.
빨간색 굵은 선으로 변경:
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen '{r: 255, g: 0, b: 0, width: 5, "off": 0}'
│ │ │ │ │ └─ RGB 색상, 선 굵기, 펜 ON/OFF
│ │ │ │ └─ 메시지 타입 (펜 설정)
│ │ │ └─ 서비스 이름
│ │ └─ 서비스 호출
│ └─ 서비스 관련 명령어
└─ ROS 2 CLI 도구

펜의 색상과 굵기를 설정합니다. 이후 거북이가 빨간색 굵은 선으로 그립니다.
파라미터 의미:
r, g, b: RGB 색상 (0-255)width: 선 굵기 (픽셀)off: 0 = 그리기 ON, 1 = 그리기 OFF
💡 문법 주의사항:
- 전체를 **작은따옴표(
')**로 감싸기 off필드만 **큰따옴표("off")**로 감싸기 (YAML 예약어이기 때문)

다른 색상 시도:
파란색:
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen '{r: 0, g: 0, b: 255, width: 3, "off": 0}'
초록색:
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen '{r: 0, g: 255, b: 0, width: 2, "off": 0}'
펜 끄기 (그리기 중단):
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen '{r: 0, g: 0, b: 0, width: 1, "off": 1}'
6. 거북이 파티: 여러 마리 동시에 제어하기
6-1. 새 거북이 생성 (spawn)
화면에 새로운 거북이를 추가합니다. 여러 마리의 거북이를 동시에 제어할 수 있습니다.
두 번째 거북이를 (2.0, 2.0) 위치에 생성합니다:
ros2 service call /spawn turtlesim/srv/Spawn '{x: 2.0, y: 2.0, theta: 0.0, name: "turtle2"}'
│ │ │ │ │ └─ 생성 위치, 방향, 이름
│ │ │ │ └─ 메시지 타입 (거북이 생성)
│ │ │ └─ 서비스 이름
│ │ └─ 서비스 호출
│ └─ 서비스 관련 명령어
└─ ROS 2 CLI 도구
새로운 거북이를 지정한 위치에 생성합니다.
응답:
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.0, name='turtle2')
response:
turtlesim.srv.Spawn_Response(name='turtle2')

새로운 거북이 turtle2가 화면 왼쪽 아래에 생성되었습니다!
파라미터:
x,y: 생성 위치 좌표 (0~11 범위)theta: 초기 방향 (라디안)name: 거북이 이름

6-2. turtle2 조종하기
생성한 두 번째 거북이를 제어합니다. 키보드 또는 명령어 두 가지 방법을 사용할 수 있습니다.
방법 1: 키보드로 조종
새 터미널을 열고 (또는 기존 teleop 터미널에서 Ctrl+C로 중단 후):
source ~/.bashrc # UTM 콘솔에서 필수
ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel
│ │ │ │ │ │ └─ turtle2의 토픽으로 변경
│ │ │ │ │ └─ 토픽 이름 재매핑
│ │ │ │ └─ ROS 인자 시작
│ │ │ └─ 키보드 조종 노드
│ │ └─ TurtleSim 패키지
│ └─ 노드 실행 명령어
└─ ROS 2 CLI 도구
토픽 이름을 재매핑(remap)하여 키보드로 turtle2를 조종합니다.
방법 2: 명령어로 조종
ros2 topic pub --rate 1 /turtle2/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.5}}"
│ │ │ │ │ │ └─ 직진 + 회전 (원 운동)
│ │ │ │ │ └─ turtle2의 속도 토픽
│ │ │ │ └─ 초당 1회 발행
│ │ │ └─ 발행 주파수 지정
│ │ └─ 토픽에 데이터 발행
│ └─ 토픽 관련 명령어
└─ ROS 2 CLI 도구
turtle2에게 지속적으로 속도 명령을 보내 원을 그리며 움직이게 합니다. 두 마리 거북이가 동시에 움직입니다!

6-3. 거북이 제거 (kill)
더 이상 필요하지 않은 거북이를 화면에서 제거합니다.
turtle2를 제거합니다:
ros2 service call /kill turtlesim/srv/Kill '{name: "turtle2"}'
│ │ │ │ │ └─ 제거할 거북이 이름
│ │ │ │ └─ 메시지 타입 (거북이 제거)
│ │ │ └─ 서비스 이름
│ │ └─ 서비스 호출
│ └─ 서비스 관련 명령어
└─ ROS 2 CLI 도구
지정한 이름의 거북이를 화면에서 제거합니다.

응답:
requester: making request: turtlesim.srv.Kill_Request(name='turtle2')
response:
turtlesim.srv.Kill_Response()
turtle2가 화면에서 사라졌습니다!

7. 한눈에 보는 ROS 2 핵심 개념 총정리
7-1. 노드(Node)
- 정의: ROS 2 시스템의 실행 단위
- 예시:
turtlesim_node,turtle_teleop_key - 확인 명령어:
ros2 node list
│ │ └─ 실행 중인 모든 노드 목록
│ └─ 노드 관련 명령어
└─ ROS 2 CLI 도구
7-2. 토픽(Topic)
- 정의: 노드 간 연속적인 데이터 스트림
- 방식: Publish-Subscribe
- 예시:
/turtle1/cmd_vel,/turtle1/pose - 확인 명령어:
ros2 topic list # 토픽 목록
ros2 topic echo <토픽이름> # 토픽 데이터 확인
ros2 topic pub <토픽이름> <타입> <데이터> # 토픽 발행
7-3. 서비스(Service)
- 정의: 요청-응답 방식의 통신
- 방식: Request-Response
- 예시:
/spawn,/clear,/teleport_absolute - 확인 명령어:
ros2 service list # 서비스 목록
ros2 service call <서비스이름> <타입> <데이터> # 서비스 호출
8. 개념 정리
축하합니다! 🎉 TurtleSim을 통해 ROS 2의 핵심 개념을 배웠습니다!
학습한 내용:
- ✅ 노드(Node): 실행 단위
- ✅ 토픽(Topic): 연속 데이터 스트림
- ✅ 서비스(Service): 요청-응답 통신
- ✅
ros2 topic,ros2 service명령어 - ✅ 실시간 데이터 확인 및 제어
참고 자료
- ROS 2 공식 튜토리얼: https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html
- 이전 글: 맥북에서 ROS 2 설치