메인 콘텐츠로 건너뛰기

ROS 2 TurtleSim으로 배우는 로봇 프로그래밍 기초

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

2025년 12월 28일
로봇
ROS 2 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 서비스로 "거북이 추가해줘" 요청 → "생성 완료" 응답

image

이 세 가지 개념을 TurtleSim을 통해 직접 실습하며 익혀봅시다!

배울 내용

  • TurtleSim 패키지 설치 및 실행
  • 키보드로 거북이 조종하기
  • ROS 2 토픽(Topic) 이해하기
  • ROS 2 서비스(Service) 사용하기
  • 명령어로 거북이 제어하기
  • 여러 마리 거북이 생성하기

사전 준비


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

image

이렇게 나오면 설치 완료! ✅


2. 거북이 깨우기: 첫 실행과 조종

2-1. TurtleSim 노드 실행

중요: UTM 콘솔에서 실행 시

UTM VM 콘솔에서 로그인한 경우, ROS 2 환경 변수가 자동으로 로드되지 않을 수 있습니다. 먼저 다음 명령어를 실행하세요:

source ~/.bashrc

이제 ROS 2 명령어를 사용할 수 있습니다!

터미널 1에서 실행:

ros2 run turtlesim turtlesim_node

예상 결과:

  • GUI 창이 열리며 파란 배경에 거북이가 나타남
  • 터미널에 로그 출력

TurtleSim 첫 실행

❗ 문제 발생 시: "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 시작하면 그래픽 로그인 화면이 나타납니다!

image

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 (키보드)

동작 원리:

  1. turtle_teleop_key가 키보드 입력 감지
  2. 화살표 키 → 속도 데이터로 변환
  3. /turtle1/cmd_vel 토픽으로 전송
  4. 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

image

주요 토픽 설명:

  • /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: 회전 속도

거북이를 움직이면 값이 실시간으로 변합니다!

토픽 echo

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 도구

토픽에 데이터가 초당 몇 번 전송되는지 측정합니다. 키보드로 거북이를 움직이는 동안 실행하면 초당 전송 횟수를 확인할 수 있습니다.

토픽 info와 hz 실행결과


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 도구

image

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

image

거북이 회전:

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

image

5-3. 화면 지우기 (clear)

거북이가 이동하며 그린 모든 선을 화면에서 지웁니다. 새롭게 시작하고 싶을 때 유용합니다.

ros2 service call /clear std_srvs/srv/Empty
 │      │       │    │      │             └─ 메시지 타입 (빈 메시지)
 │      │       │    │      └─ 표준 서비스 메시지
 │      │       │    └─ 서비스 이름
 │      │       └─ 서비스 호출
 │      └─ 서비스 관련 명령어
 └─ ROS 2 CLI 도구

image

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

image

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)는 화면 중앙입니다.

image

상대 위치로 이동:

ros2 service call /turtle1/teleport_relative turtlesim/srv/TeleportRelative "{linear: 2.0, angular: 1.57}"
 │      │       │    │                     │                           └─ 이동 거리 및 회전 각도
 │      │       │    │                     └─ 메시지 타입 (상대 텔레포트)
 │      │       │    └─ 서비스 이름
 │      │       └─ 서비스 호출
 │      └─ 서비스 관련 명령어
 └─ ROS 2 CLI 도구

현재 위치에서 상대적으로 이동시킵니다. (앞으로 2.0, 회전 1.57 라디안)

image

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 도구

image

펜의 색상과 굵기를 설정합니다. 이후 거북이가 빨간색 굵은 선으로 그립니다.

파라미터 의미:

  • 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')

image

새로운 거북이 turtle2가 화면 왼쪽 아래에 생성되었습니다!

파라미터:

  • x, y: 생성 위치 좌표 (0~11 범위)
  • theta: 초기 방향 (라디안)
  • name: 거북이 이름

image

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 도구

지정한 이름의 거북이를 화면에서 제거합니다.

image

응답:

requester: making request: turtlesim.srv.Kill_Request(name='turtle2')

response:
turtlesim.srv.Kill_Response()

turtle2가 화면에서 사라졌습니다!

image


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 명령어
  • ✅ 실시간 데이터 확인 및 제어

참고 자료


공유하기