🎯 이 챕터의 목표
Ch.02에서 배운 6대 개념(노드/토픽/메시지/서비스/액션/파라미터)을 진짜 명령어로 만져볼 시간이에요. 이번 챕터를 끝내면, 거북이 한 마리를 키보드로 몰고, 코드 한 줄로 빙글빙글 돌리고, 색깔도 바꿀 수 있어요. 🐢
ros2 명령어로 해요.
🗂 ros2 명령어 패밀리 — 9형제
ros2 명령은 뒤에 어떤 서브명령을 붙이느냐에 따라 9가지로 갈라져요. 아래 표만 외워두면 80%는 끝.
ros2 runros2 run turtlesim turtlesim_noderos2 noderos2 node listros2 topicros2 topic echo /turtle1/poseros2 serviceros2 service call /spawn ...ros2 actionros2 action listros2 paramros2 param set /turtlesim background_r 0ros2 interfaceros2 interface show geometry_msgs/msg/Twistros2 pkgros2 pkg listros2 bagros2 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를 띄운 그 터미널을 클릭해서 포커스를 줘야 해요.
다른 창에서 방향키 눌러봤자 그 창이 받아요.
🔍 실습 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니까
이 두 개만 신경 쓰면 돼요.
한 번만 명령 보내기
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.
📞 실습 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 또는 .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 폴더 # 정보
거북이가 받는 속도 명령 토픽은 무엇이고, 어떤 메시지 타입을 쓰나요?
새 거북이를 추가하려면 어떤 도구를 써야 할까?
실제 로봇을 30분간 운전한 데이터를 나중에 재현해서 디버깅하고 싶다면?
노드를 새로 띄우지 않고, 실행 중에 거북이 배경색을 바꾸려면?
🎁 정리
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 코드로 노드를 짜는 차례예요. 거북이를 코드로 자동 운전해봐요. 🐍