ROS2Lab Chapter 02
Ch.02

핵심 개념 6가지

Node / Topic / Message / Service / Action / Parameter

⏱ 25분 #개념#필수

🎯 이 챕터의 목표

ROS2를 만지려면 꼭 알아야 하는 단어가 6개 있어요. 영어라서 처음엔 어색하지만, 비유로 풀어보면 어렵지 않아요.

🟢
Node
노드 — 부품 1개에 해당하는 작은 프로그램
📡
Topic
토픽 — 일방 방송 채널 (구독 방식)
📦
Message
메시지 — 주고받는 데이터의 양식
📞
Service
서비스 — 1대1 요청/응답 (질문-대답)
🏃
Action
액션 — 시간 걸리는 일 + 중간 보고
⚙️
Parameter
파라미터 — 노드의 설정값

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_msgs
기본형(숫자, 문자열, 불린)
String, Int32, Bool
geometry_msgs
위치/속도/자세
Twist, Pose, Point
sensor_msgs
센서 데이터
Image, LaserScan, Imu
nav_msgs
지도/경로
OccupancyGrid, Path

4️⃣ Service — 1대1 요청/응답

서비스(Service)는 토픽과 달리 "질문 → 대답" 구조예요. 누군가에게 부탁하고 결과를 받는 거죠.

📞 전화 통화로 비유하면:
· 토픽 = 라디오 (일방향, 계속 흘러나옴)
· 서비스 = 전화 (양방향, 한 번 묻고 한 번 답)

토픽이 "지금 위치를 계속 알려줘"라면, 서비스는 "거북이 한 마리 더 만들어줘 → 만들었어요" 같은 거예요.

언제 토픽이고 언제 서비스인가?

상황
토픽 vs 서비스
이유
로봇 속도 명령 보내기
토픽
계속 흘려보내야 함
카메라 이미지 받기
토픽
스트림 데이터
"맵을 저장해줘"
서비스
한 번 시키고 결과(성공/실패) 필요
"가스 밸브 열어줘"
서비스
요청 + 확인 응답 필요

실습

# 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가지 메시지

🎯
Goal
목표 (어디로 가, 어느 자세 잡아)
📊
Feedback
진행 상황 (50% 왔어요, 거리 3m 남았어요)
🏁
Result
최종 결과 (성공/실패, 걸린 시간 등)

언제 액션을 써?

  • "특정 좌표까지 이동해" (자율주행)
  • "이 물체를 집어와" (로봇팔 매니퓰레이션)
  • "지도를 처음부터 만들어" (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

노드를 재실행하지 않아도 실행 중에 값을 바꿀 수 있어요. 이게 파라미터의 진짜 매력이에요.

🧠 한눈에 비교

방식
비유
방향
언제 쓰나
Topic
라디오 방송
다대다, 일방향
스트림 데이터 (센서값, 위치)
Service
전화 통화
1:1, 짧은 요청/응답
한 번에 끝나는 작업
Action
택배 배송
1:1, 긴 작업 + 중간보고
오래 걸리고 중단 가능한 작업
Parameter
라디오 볼륨 다이얼
설정값 저장
노드 동작 방식 변경
✏️ 퀴즈 1

카메라가 1초에 30번 영상을 보내는 상황. 어떤 방식이 적합할까?

✏️ 퀴즈 2

"3미터 앞으로 이동해" 명령을 보내고, 도중에 "1m 왔어요" "2m 왔어요" 같은 보고를 받고 싶다면?

✏️ 퀴즈 3

Node와 Topic의 관계를 가장 잘 설명한 것은?

🎁 정리

  • Node = 한 가지 일만 하는 작은 프로그램
  • Topic = 노드들이 데이터를 주고받는 일방향 방송 채널 (다대다, 비동기)
  • Message = 토픽에 실어 보내는 데이터 양식 (.msg)
  • Service = 1대1 요청/응답 (한 번에 끝나는 작업)
  • Action = 1대1 장기 작업 + 중간 피드백 + 취소 가능
  • Parameter = 노드의 설정값 (실행 중에도 바꿀 수 있음)

다음 챕터부터는 손으로 직접 ros2 명령어를 쳐가면서 거북이를 조종해볼 거예요. 🐢