🎯 이 챕터의 목표
ROS2를 만지려면 꼭 알아야 하는 단어가 6개 있어요. 영어라서 처음엔 어색하지만, 비유로 풀어보면 어렵지 않아요.
1️⃣ Node — 부품 하나하나
노드(Node)는 ROS2의 가장 작은 단위예요. "한 가지 일만 하는 작은 프로그램"이라고 생각하면 돼요.
· 바퀴 노드 (모터 돌리기)
· 카메라 노드 (이미지 받기)
· 거리센서 노드 (장애물 감지)
· 지도 노드 (집 모양 기억)
· 경로계획 노드 (어디로 갈지 결정)
각 노드는 따로 실행되고, 한 노드가 죽어도 다른 노드는 계속 돌아가요. 이게 ROS2의 핵심 철학이에요 — 작게 만들고 조합하기.
실제로 보자
# 터미널 1
ros2 run demo_nodes_cpp talker
# 터미널 2 — 현재 돌아가는 노드 목록 보기
ros2 node list
/talker
# 노드 정보 자세히 보기
ros2 node info /talker
2️⃣ Topic — 일방향 방송 채널
토픽(Topic)은 노드끼리 데이터를 주고받는 방송 채널이에요. 한 노드가 발행(publish)하면, 누구든 구독(subscribe)해서 받을 수 있어요.
· 발행자(Publisher) = 라디오 방송국
· 토픽(Topic) = 라디오 주파수 (예: "/temperature")
· 구독자(Subscriber) = 라디오 수신기 (몇 명이든 OK)
방송국은 듣는 사람이 누군지, 몇 명인지 신경 안 써요. 그냥 계속 송출만 해요.
토픽의 핵심은 비동기(asynchronous)와 다대다(many-to-many)예요.
- 한 토픽에 발행자가 여러 명이어도 됨
- 한 토픽에 구독자가 여러 명이어도 됨
- 발행 즉시 응답을 기다리지 않음
예시: 거북이 위치
┌────────────────┐ /turtle1/pose ┌────────────────┐
│ turtlesim │ ──── publish ──►│ /position_log │
│ (publisher) │ │ (subscriber) │
└────────────────┘ └────────────────┘
│
│ subscribe
▼
┌────────────────┐
│ /map_drawer │
│ (subscriber) │
└────────────────┘
turtlesim은 자기 위치를 /turtle1/pose 토픽에 계속 발행해요. 그걸 구독하는 노드가
여러 개여도 돼요 — 위치 로깅, 지도 그리기, 알람 등.
3️⃣ Message — 데이터의 양식
메시지(Message)는 토픽에 실어 보내는 데이터의 양식이에요. "어떤 필드를 가진 데이터냐"를 정의해놓은 거예요.
· 메시지 = 송장 양식 (받는사람, 주소, 무게, 내용물 칸이 있음)
· 토픽 = 택배 보내는 경로
· 노드 = 보내는 사람 / 받는 사람
기본 메시지 예시 (std_msgs/String)
# std_msgs/msg/String.msg
string data
이건 가장 단순한 메시지 — 그냥 문자열 하나만 들어요. talker가 보내는 "Hello World"가 이거에요.
조금 복잡한 메시지 (geometry_msgs/Twist)
# geometry_msgs/msg/Twist.msg — 속도 명령에 쓰임
Vector3 linear # 직선 속도 (x, y, z)
Vector3 angular # 회전 속도 (x, y, z)
이건 로봇에게 "앞으로 0.5m/s로 가면서 회전은 0.1rad/s로 해" 라고 시킬 때 쓰는 메시지예요.
.msg 파일로 정의돼요. 직접 만들 수도 있어요(Ch.05에서).
자주 쓰는 표준 메시지 패키지
std_msgsgeometry_msgssensor_msgsnav_msgs4️⃣ Service — 1대1 요청/응답
서비스(Service)는 토픽과 달리 "질문 → 대답" 구조예요. 누군가에게 부탁하고 결과를 받는 거죠.
· 토픽 = 라디오 (일방향, 계속 흘러나옴)
· 서비스 = 전화 (양방향, 한 번 묻고 한 번 답)
토픽이 "지금 위치를 계속 알려줘"라면, 서비스는 "거북이 한 마리 더 만들어줘 → 만들었어요" 같은 거예요.
언제 토픽이고 언제 서비스인가?
실습
# turtlesim 띄우고
ros2 run turtlesim turtlesim_node
# 서비스 목록 보기 (다른 터미널)
ros2 service list
# 거북이 추가하기 — 서비스 호출
ros2 service call /spawn turtlesim/srv/Spawn \
"{x: 2, y: 2, theta: 0.0, name: 'turtle2'}"
5️⃣ Action — 시간 걸리는 일 + 중간 보고
액션(Action)은 서비스의 업그레이드 버전이에요. 오래 걸리는 작업을 시킬 때 쓰는데, 도중에 중간 진행상황(feedback)도 받을 수 있고, 중간에 취소도 할 수 있어요.
· 서비스 = "오늘 안에 배달해주세요 → 배달 완료"
· 액션 = "오늘 안에 배달해주세요 → [출발했어요][50% 왔어요][문 앞 도착][배달 완료]"
액션의 3가지 메시지
언제 액션을 써?
- "특정 좌표까지 이동해" (자율주행)
- "이 물체를 집어와" (로봇팔 매니퓰레이션)
- "지도를 처음부터 만들어" (SLAM 시작)
전부 시간이 오래 걸리고, 중간에 어떻게 진행되는지 알고 싶고, 잘못되면 멈출 수 있어야 하는 작업이에요.
6️⃣ Parameter — 노드의 설정값
파라미터(Parameter)는 노드의 설정값이에요. 게임의 "옵션" 같은 거예요. 노드를 켤 때 어떤 모드로 시작할지, 어떤 속도로 움직일지 등을 미리 정해주는 값.
· 노드 = 라디오 본체
· 토픽 = 흘러나오는 방송
· 파라미터 = 볼륨, 채널, 이퀄라이저 같은 다이얼
파라미터 예시
# turtlesim의 파라미터 보기
ros2 run turtlesim turtlesim_node &
ros2 param list /turtlesim
# 배경색 바꾸기
ros2 param set /turtlesim background_r 0
ros2 param set /turtlesim background_g 0
ros2 param set /turtlesim background_b 50
ros2 service call /clear std_srvs/srv/Empty
노드를 재실행하지 않아도 실행 중에 값을 바꿀 수 있어요. 이게 파라미터의 진짜 매력이에요.
🧠 한눈에 비교
카메라가 1초에 30번 영상을 보내는 상황. 어떤 방식이 적합할까?
"3미터 앞으로 이동해" 명령을 보내고, 도중에 "1m 왔어요" "2m 왔어요" 같은 보고를 받고 싶다면?
Node와 Topic의 관계를 가장 잘 설명한 것은?
🎁 정리
- Node = 한 가지 일만 하는 작은 프로그램
- Topic = 노드들이 데이터를 주고받는 일방향 방송 채널 (다대다, 비동기)
- Message = 토픽에 실어 보내는 데이터 양식 (.msg)
- Service = 1대1 요청/응답 (한 번에 끝나는 작업)
- Action = 1대1 장기 작업 + 중간 피드백 + 취소 가능
- Parameter = 노드의 설정값 (실행 중에도 바꿀 수 있음)
다음 챕터부터는 손으로 직접 ros2 명령어를 쳐가면서 거북이를 조종해볼 거예요. 🐢