ROS2Lab Chapter 03
Ch.03

CLI 도구 익히기

ros2 명령어 + turtlesim 실습

⏱ 30분 #CLI#실습

🎯 이 챕터의 목표

Ch.02에서 배운 6대 개념(노드/토픽/메시지/서비스/액션/파라미터)을 진짜 명령어로 만져볼 시간이에요. 이번 챕터를 끝내면, 거북이 한 마리를 키보드로 몰고, 코드 한 줄로 빙글빙글 돌리고, 색깔도 바꿀 수 있어요. 🐢

약어
turtlesim = turtle + simulator · 거북이 시뮬레이터. ROS의 공식 학습용 미니 시뮬레이션 환경. 거북이 한 마리가 흰 캔버스 위를 돌아다녀요. ROS1 시절부터 내려온 전통의 입문 도구.
약어
CLI = Command Line Interface · 명령줄 인터페이스. 터미널에서 글자로 명령을 치는 방식. ROS2는 거의 모든 작업을 ros2 명령어로 해요.

🗂 ros2 명령어 패밀리 — 9형제

ros2 명령은 뒤에 어떤 서브명령을 붙이느냐에 따라 9가지로 갈라져요. 아래 표만 외워두면 80%는 끝.

명령어
뭐 하는 거?
대표 사용 예
ros2 run
노드 실행
ros2 run turtlesim turtlesim_node
ros2 node
노드 목록/정보 보기
ros2 node list
ros2 topic
토픽 보기/발행/구독 확인
ros2 topic echo /turtle1/pose
ros2 service
서비스 호출/목록
ros2 service call /spawn ...
ros2 action
액션 목록/전송
ros2 action list
ros2 param
파라미터 보기/변경
ros2 param set /turtlesim background_r 0
ros2 interface
메시지/서비스 타입 보기
ros2 interface show geometry_msgs/msg/Twist
ros2 pkg
패키지 목록/정보
ros2 pkg list
ros2 bag
데이터 기록/재생
ros2 bag record /turtle1/pose
💡 어떤 명령어든 뒤에 --help를 붙이면 사용법이 나와요. 예: ros2 topic --help. 또 Tab 두 번 누르면 자동완성 추천도 해줘요.

🐢 실습 0: turtlesim 띄우기

이제부터는 터미널 여러 개를 동시에 띄울 거예요. 화면 분할이나 tmux를 쓰면 편해요. 각 터미널마다 ROS2 환경이 source 되어있어야 한다는 점 잊지 마요(~/.bashrc에 넣어뒀으면 자동).

# 터미널 1
ros2 run turtlesim turtlesim_node

파란 캔버스 위에 거북이 한 마리가 떡 하니 나타나면 성공이에요. 이 거북이의 이름은 기본 turtle1이에요.

[INFO] [turtlesim]: Starting turtlesim with node name /turtlesim
[INFO] [turtlesim]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]

⌨ 실습 1: 키보드로 거북이 조종

새 터미널에서 키보드 텔레옵 노드를 띄워요.

# 터미널 2
ros2 run turtlesim turtle_teleop_key

이 터미널을 활성 창으로 둔 채로 방향키를 누르면 거북이가 움직여요. 한 번씩 눌러보면:

  • / — 앞으로 / 뒤로
  • / — 좌회전 / 우회전
  • G ~ L 시리즈 — 절대 방향 회전 (어렵게 만든 게 아니라 진짜 키 매핑)
💡 거북이가 안 움직이면 turtle_teleop_key를 띄운 그 터미널을 클릭해서 포커스를 줘야 해요. 다른 창에서 방향키 눌러봤자 그 창이 받아요.
약어
teleop = teleoperation · 원격 조종. 사람이 원격으로 로봇을 조종하는 걸 통칭. 자율주행의 반대말이에요.

🔍 실습 2: 노드 들여다보기

지금 몇 개의 노드가 돌고 있는지 확인.

# 터미널 3
ros2 node list
/turtlesim
/teleop_turtle

두 개의 노드가 돌아가고 있어요. /turtlesim은 거북이 시뮬레이터, /teleop_turtle은 키보드 입력을 받는 노드. 이 둘이 어떻게 대화하는지 한번 자세히 봐요.

ros2 node info /turtlesim
/turtlesim
  Subscribers:
    /turtle1/cmd_vel: geometry_msgs/msg/Twist   ← 여기로 명령을 받음
  Publishers:
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose            ← 위치를 여기로 발행
  Service Servers:
    /spawn: turtlesim/srv/Spawn                  ← 거북이 추가 서비스
    /kill: turtlesim/srv/Kill
    /reset: std_srvs/srv/Empty
    /clear: std_srvs/srv/Empty
    /turtle1/set_pen: turtlesim/srv/SetPen
    ...

어떤 토픽을 구독하는지(받는지), 어떤 토픽을 발행하는지(보내는지), 어떤 서비스를 제공하는지 한눈에 보여요. 이게 ROS2 디버깅의 시작이에요.

📡 실습 3: 거북이의 위치를 엿보기

/turtle1/pose 토픽에 거북이의 현재 좌표가 흘러나오고 있어요. 직접 들여다봐요.

# 터미널 3
ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

그 중 위치 토픽만 들여다봐요.

ros2 topic echo /turtle1/pose
x: 5.544444561004639
y: 5.544444561004639
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
---
x: 5.544444561004639
...

거북이가 가만히 있으면 위치가 안 바뀌어요. 이 상태에서 터미널 2(텔레옵)로 가서 방향키를 누르면, 터미널 3의 숫자가 실시간으로 바뀌는 걸 볼 수 있어요. 이게 바로 Pub-Sub의 진짜 모습이에요.

발행 빈도(주파수)도 잴 수 있어요

ros2 topic hz /turtle1/pose
average rate: 62.501
  min: 0.013s max: 0.018s std dev: 0.00117s window: 64

초당 약 62번 위치를 발행하고 있다는 뜻. (Hz = Hertz, 주파수 단위)

🎮 실습 4: 코드로 거북이 움직이기

키보드 없이, 직접 토픽에 명령을 발행해서 거북이를 움직여봐요. 거북이는 /turtle1/cmd_vel 토픽을 구독하니까 거기에 속도 명령을 쏘면 돼요.

메시지 양식 먼저 확인

ros2 interface show geometry_msgs/msg/Twist
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
        float64 x
        float64 y
        float64 z
Vector3 angular
        float64 x
        float64 y
        float64 z

linear.x = 직선 속도(앞 +, 뒤 -), angular.z = 회전 속도(좌 +, 우 -). 거북이는 2D니까 이 두 개만 신경 쓰면 돼요.

약어
cmd_vel = command velocity · 속도 명령. ROS 세계에서 거의 모든 이동 로봇이 이 이름의 토픽을 받아요. 표준 같은 거예요.

한 번만 명령 보내기

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}}"

거북이가 잠깐 앞으로 휙 가요. --once는 1번만 발행하라는 뜻.

계속 빙글빙글 돌리기

ros2 topic pub /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 10

앞으로 가면서 동시에 좌회전 → 원을 그리며 움직임. --rate 10은 초당 10번 발행한다는 뜻. 멈추려면 Ctrl+C.

💡 발행을 멈춰도 거북이가 약간 더 움직이다 서요. cmd_vel은 "지금 이 속도로 가"라는 뜻이지 "여기까지 가"가 아니라서, 새 명령이 안 오면 마지막 속도를 유지하다가 점차 멈춰요.

📞 실습 5: 서비스로 거북이 추가하기

토픽이 일방향 방송이라면, 서비스는 1:1 요청/응답이에요. 새 거북이를 한 마리 소환해봐요.

ros2 service list
/clear
/kill
/reset
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_parameters
...

/spawn이 거북이를 만드는 서비스에요. 어떤 형식인지 먼저 확인.

ros2 service type /spawn
turtlesim/srv/Spawn
ros2 interface show turtlesim/srv/Spawn
float32 x
float32 y
float32 theta
string name
---
string name

위쪽이 요청(request), 아래쪽이 응답(response). ---이 구분선이에요. 이제 호출.

ros2 service call /spawn turtlesim/srv/Spawn \
  "{x: 2.0, y: 2.0, theta: 0.0, name: 'turtle2'}"
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가 추가돼요. 이제 /turtle2/cmd_vel로 명령하면 두 번째 거북이도 움직일 수 있어요.

유용한 서비스 한 줄 정리

# 캔버스 깨끗이 (선만 지움)
ros2 service call /clear std_srvs/srv/Empty

# 전체 리셋 (거북이 위치까지 처음으로)
ros2 service call /reset std_srvs/srv/Empty

# 거북이 죽이기(...)
ros2 service call /kill turtlesim/srv/Kill "{name: 'turtle2'}"

⚙ 실습 6: 파라미터로 배경색 바꾸기

노드가 가진 설정값을 들여다봐요.

ros2 param list /turtlesim
background_b
background_g
background_r
holonomic
qos_overrides...
use_sim_time
# 현재 배경색 보기
ros2 param get /turtlesim background_b
Integer value is: 255

기본 배경이 파란색인 이유는 RGB 중 B가 255이기 때문. 이제 보라색으로 바꿔요.

ros2 param set /turtlesim background_r 150
ros2 param set /turtlesim background_g 50
ros2 param set /turtlesim background_b 200
ros2 service call /clear std_srvs/srv/Empty

배경색을 바꾸고 /clear로 새로 그리면 보라색 캔버스가 짠. 노드를 재실행하지 않고 실행 중에 바꾸는 게 핵심.

💾 실습 7: ros2 bag — 데이터 기록과 재생

실제 로봇을 디버깅할 때 가장 유용한 도구가 ros2 bag이에요. 토픽 데이터를 통째로 녹화해뒀다가 나중에 재생할 수 있어요.

약어
bag = 말 그대로 "가방". 데이터를 담아두는 가방이라는 비유. ROS1 시절부터 내려온 이름. 확장자도 .bag 또는 .db3예요.

녹화

# 터미널 4
mkdir -p ~/bags && cd ~/bags
ros2 bag record /turtle1/cmd_vel /turtle1/pose

이 상태에서 터미널 2(텔레옵)로 거북이를 마음대로 운전. 30초쯤 돌리고 Ctrl+C로 종료. rosbag2_* 폴더가 생겨요.

재생

이제 turtlesim과 텔레옵 모두 끄고, 새로 띄운 뒤 녹화한 걸 재생.

# 터미널 1
ros2 run turtlesim turtlesim_node

# 터미널 2
cd ~/bags
ros2 bag play rosbag2_*

아까 운전했던 거 그대로 거북이가 자동으로 재현해요. 마치 녹화 영상 재생처럼.

가방 안 정보 보기

ros2 bag info rosbag2_*

📜 자주 쓰는 명령어 치트시트

# 노드
ros2 node list                                # 노드 목록
ros2 node info /노드이름                      # 노드 상세

# 토픽
ros2 topic list                               # 토픽 목록
ros2 topic list -t                            # 타입까지
ros2 topic echo /토픽                         # 실시간 들여다보기
ros2 topic info /토픽                         # 발행자/구독자 정보
ros2 topic hz /토픽                           # 발행 빈도
ros2 topic bw /토픽                           # 대역폭
ros2 topic pub /토픽 타입 "{필드: 값, ...}"   # 한 번 발행
ros2 topic pub /토픽 타입 "{...}" --rate 10   # 초당 10번

# 서비스
ros2 service list                             # 서비스 목록
ros2 service type /서비스                     # 타입 확인
ros2 service call /서비스 타입 "{...}"        # 호출

# 파라미터
ros2 param list /노드                         # 파라미터 목록
ros2 param get /노드 파라미터                 # 값 보기
ros2 param set /노드 파라미터 값              # 값 설정
ros2 param dump /노드 > params.yaml          # YAML로 저장

# 인터페이스 (메시지/서비스/액션 형식)
ros2 interface show 패키지/msg/타입           # 양식 보기
ros2 interface list                           # 전체 목록

# 패키지
ros2 pkg list                                 # 설치된 패키지
ros2 pkg executables turtlesim                # 패키지의 실행파일

# 데이터 기록
ros2 bag record /토픽1 /토픽2                 # 녹화
ros2 bag record -a                            # 전체 토픽 녹화
ros2 bag play 폴더                            # 재생
ros2 bag info 폴더                            # 정보
💡 이 치트시트는 책상 옆에 붙여두고 한 달만 쓰면 다 외워져요. 외우려 하지 말고 자꾸 쓰는 게 빠른 길.
✏️ 퀴즈 1

거북이가 받는 속도 명령 토픽은 무엇이고, 어떤 메시지 타입을 쓰나요?

✏️ 퀴즈 2

새 거북이를 추가하려면 어떤 도구를 써야 할까?

✏️ 퀴즈 3

실제 로봇을 30분간 운전한 데이터를 나중에 재현해서 디버깅하고 싶다면?

✏️ 퀴즈 4

노드를 새로 띄우지 않고, 실행 중에 거북이 배경색을 바꾸려면?

🎁 정리

  • ros2 명령어는 9가지 패밀리(run/node/topic/service/action/param/interface/pkg/bag)
  • ros2 node info = 한 노드가 무엇을 발행/구독/제공하는지 한눈에
  • ros2 topic echo / pub = 토픽 들여다보기 / 직접 발행
  • ros2 service call = 1:1 요청 (거북이 추가, 리셋 등)
  • ros2 param set = 실행 중에 노드 설정 바꾸기
  • ros2 bag record/play = 데이터 녹화/재생 (디버깅 핵심)
  • cmd_vel = 거의 모든 이동 로봇이 받는 표준 속도 명령 토픽

명령어로 다 해봤으니, 이제 직접 Python 코드로 노드를 짜는 차례예요. 거북이를 코드로 자동 운전해봐요. 🐍