[Physical AI W1D2 · 3/6]
로봇 소프트웨어는 하나의 거대 프로그램이 아니다. 카메라·인식·계획·제어가 각각 독립 노드로 돌며 데이터를 주고받는다. ROS 2의 네 가지 통신 방식 — 노드·토픽·서비스·액션을 "왜, 언제 쓰는가"로 잡는다.
이 글에서 잡는 개념
- 로봇 SW를 왜 여러 노드로 쪼개나
- 토픽(계속 흐르는 데이터) vs 서비스(요청/응답) vs 액션(오래 걸리는 목표 작업)
- 네 방식의 차이와 선택 기준
- 실제 이동 로봇·로봇 팔에서 어떻게 조합되나
(이 글은 Week1 Day2 ROS 2 블록의 시작입니다. 1·2편의 리눅스 기초 위에서 진행합니다. 4편부터 이 개념들을 직접 코드로 구현합니다.)
들어가며 — 로봇은 하나의 프로그램이 아니다
ROS 2 기반 로봇 시스템은 하나의 거대한 프로그램으로 만들어지지 않습니다. 카메라 데이터를 읽는 프로그램, LiDAR를 처리하는 프로그램, 위치를 계산하는 프로그램, 경로를 계획하는 프로그램, 모터를 제어하는 프로그램이 각각 독립적으로 실행됩니다.
왜 이렇게 쪼갤까요? 모든 기능을 한 프로그램에 넣으면 관리가 어렵고, 하나가 죽으면 전체가 멈춥니다. 기능을 나누면 필요한 부분만 고치거나 재사용할 수 있고, 한 노드가 문제여도 나머지는 살아 있습니다(장애 격리).
ROS 2는 이렇게 나뉜 프로그램들이 서로 데이터를 주고받도록 노드·토픽·서비스·액션이라는 통신 구조를 제공합니다.
카메라 노드 ──(이미지 토픽)──▶ 객체 인식 노드 ──▶ 경로 계획 노드 ──(속도 명령)──▶ 제어 노드

1. 통신 4종 한눈에
| 통신 방식 | 구조 | 사용 상황 |
|---|---|---|
| 노드 | 기능 단위 실행 프로그램 | 센서 처리·제어·인식·계획 등 개별 기능 |
| 토픽 | Publisher → Subscriber | 센서 데이터·로봇 상태·속도 명령처럼 계속 흐르는 데이터 |
| 서비스 | Client → Server → Response | 설정 변경·계산 요청·상태 조회처럼 즉시 응답이 필요한 작업 |
| 액션 | Client → Server → Feedback/Result | 목표 지점 이동·로봇 팔 동작처럼 오래 걸리는 작업 |
2. 노드 — 기능 하나의 실행 단위
노드(Node) 는 ROS 2에서 하나의 기능을 수행하는 기본 실행 단위입니다. 다음처럼 각 기능이 노드가 됩니다.
| 노드 예시 | 역할 |
|---|---|
camera_node |
카메라 이미지 수집 |
lidar_node |
LiDAR 거리 데이터 수집 |
object_detector_node |
객체 탐지 |
navigation_node |
이동 경로 계획 |
motor_controller_node |
모터 제어 |
노드는 독립적으로 실행되지만 토픽·서비스·액션을 통해 서로 연결됩니다. 그래서 ROS 2 시스템을 볼 때 가장 먼저 묻는 질문은 "지금 어떤 노드들이 실행 중인가?" 입니다(→ 4편에서 ros2 node list로 확인).
3. 토픽 — 계속 흐르는 데이터 (Publisher/Subscriber)
토픽(Topic) 은 ROS 2에서 가장 많이 쓰는 통신 방식으로, 데이터를 지속적으로 흘려보내는 채널입니다.
Publisher Node ──▶ Topic ──▶ Subscriber Node
핵심은 Publisher와 Subscriber가 서로 직접 연결되어 있지 않다는 점입니다. 둘은 같은 토픽 이름 + 같은 메시지 타입을 기준으로 느슨하게 연결됩니다. 예를 들어 카메라 노드는 /camera/image 토픽으로 이미지를 발행하고, 인식 노드는 같은 토픽을 구독해 처리합니다. 발행자가 누구인지 구독자는 몰라도 됩니다.
| 데이터 | 토픽을 쓰는 이유 |
|---|---|
| 카메라 이미지 | 프레임이 계속 들어옴 |
| LiDAR 스캔 | 실시간 거리 데이터 반복 |
| 로봇 위치 | 현재 위치가 계속 갱신 |
| 속도 명령 | 이동 명령을 지속 전달 |
💡 Day1에서 만든
/clock(시뮬레이션 시간)도 토픽이었습니다 — 계속 갱신되는 값이라 토픽이 적합했죠.
4. 서비스 — 요청하면 바로 응답 (Client/Server)
서비스(Service) 는 요청과 응답 구조입니다. 토픽이 계속 흘려보내는 방식이라면, 서비스는 필요한 순간 요청하고 응답을 받는 방식입니다.
Service Client ──(Request)──▶ Service Server ──(Response)──▶ Service Client
| 사용 예시 | 설명 |
|---|---|
| 로봇 상태 조회 | 배터리·모드 조회 |
| 좌표 변환 요청 | 특정 좌표 계산 |
| 설정 변경 | 센서 파라미터 변경 |
| 로봇 초기화 | 위치 초기화 요청 |
| 간단한 계산 | 두 수 더하기 등 |
서비스는 응답이 즉시 필요한 작업에 씁니다. 다만 작업이 오래 걸리면 서비스보다 액션이 적절합니다.
5. 액션 — 오래 걸리는 목표 작업 (Goal/Feedback/Result)
액션(Action) 은 시간이 오래 걸리는 작업을 위한 통신입니다. 서비스는 응답이 올 때까지 기다리는 구조라, 몇 초~몇 분 걸리는 작업엔 부적합합니다(중간 진행 상황도 모르고 취소도 어렵습니다).
Action Client ──(Goal)──▶ Action Server
◀─(Feedback)── (작업 중 진행 상황 반복)
◀─(Result)── (완료 후 최종 결과)
| 기능 | 설명 |
|---|---|
| Goal | 수행할 목표 전달 |
| Feedback | 작업 중간 진행 상황 전달 |
| Result | 작업 완료 결과 반환 |
| Cancel | 진행 중인 작업 취소 |
| 사용 예시 | 이유 |
|---|---|
| 목표 지점까지 이동 | 오래 걸리고 중간 위치 피드백 필요 |
| 로봇 팔 경로 실행 | 진행률·완료 여부 필요 |
| 물체 집기 | 접근→파지→이동→배치 단계 |
| 탐색 작업 | 장시간 수행·취소 필요 |
6. 네 방식, 어떻게 고르나
| 구분 | 통신 방식 | 특징 | 대표 사용 예 |
|---|---|---|---|
| 노드 | 실행 단위 | 하나의 기능 담당 | 카메라·제어·경로 계획 노드 |
| 토픽 | 비동기 발행/구독 | 지속적 데이터 흐름 | 센서 데이터·속도 명령·로봇 상태 |
| 서비스 | 요청/응답 | 짧은 작업·즉시 응답 | 상태 조회·설정 변경·계산 |
| 액션 | 목표/피드백/결과 | 오래 걸림·취소 가능 | 목표 이동·로봇 팔 동작·탐색 |
선택은 질문 하나로 정리됩니다.
계속 흘러가는 데이터인가? → 토픽
요청하면 바로 응답받는 작업인가? → 서비스
시간이 오래 걸리고 진행 상황이 필요한가? → 액션
기능을 실행하는 독립 프로그램인가? → 노드
7. 실제 로봇에서 어떻게 조합되나
이동 로봇 예시
| 기능 | ROS 2 구조 |
|---|---|
| LiDAR 데이터 수집 | LiDAR 노드가 /scan 토픽 발행 |
| 카메라 이미지 | Camera 노드가 /image_raw 토픽 발행 |
| 현재 위치 추정 | Localization 노드가 /odom·/tf 발행 |
| 목표 지점 이동 | Navigation 액션 서버가 goal 수신 |
| 속도 명령 | Controller 노드가 /cmd_vel 토픽 구독 |
| 맵 저장 요청 | Map Server 서비스 호출 |
로봇 팔 예시
| 기능 | ROS 2 구조 |
|---|---|
| 관절 상태 | Joint State Publisher가 /joint_states 발행(토픽) |
| 목표 자세 | MoveIt 액션 서버에 goal 전송 |
| 그리퍼 열기/닫기 | 서비스 또는 액션 |
| 물체 인식 | Vision 노드가 객체 위치 토픽 발행 |
→ 하나의 로봇은 토픽·서비스·액션을 동시에 씁니다. 어떤 데이터냐에 따라 길을 골라 쓰는 거죠.
3편 정리
- 로봇 SW는 여러 노드로 쪼개 통신으로 연결 — 관리·장애격리·재사용에 유리.
- 토픽 = 계속 흐르는 데이터(Pub/Sub, 느슨한 연결) / 서비스 = 즉시 요청·응답 / 액션 = 오래 걸리는 목표 작업(Goal·Feedback·Result·Cancel).
- 고르는 기준: "흐르는 데이터→토픽 / 즉답→서비스 / 장시간→액션".
- 실제 로봇은 셋을 동시에 조합한다.
다음 편 예고
4편부터 직접 구현합니다. 환경을 준비하고(ros2 pkg create), 토픽 Publisher/Subscriber를 Python(rclpy)으로 작성해 colcon build로 빌드하고 ros2 run으로 실행합니다. 개념이 코드로 살아나는 단계입니다.
📚 Week1 Day2 전체 목차 (총 6편)
- 1/6 리눅스 기초 — 쉘·파일시스템·핵심 명령어
- 2/6 리눅스 실전 8 시나리오
- 3/6 ROS 2 통신 4종 개념 — 노드·토픽·서비스·액션 — 이번 글
- 4/6 ROS 2 토픽 Pub/Sub 직접 만들기
- 5/6 ROS 2 서비스·액션 구현
- 6/6 ROS 2 패키지 빌드 — Python·C++·colcon
'피지컬AI' 카테고리의 다른 글
| [Physical AI W1D2] 5/6 — ROS 2 서비스·액션 구현: 요청/응답과 목표/피드백 (0) | 2026.06.14 |
|---|---|
| [Physical AI W1D2] 4/6 — ROS 2 토픽 직접 만들기: Publisher·Subscriber (0) | 2026.06.14 |
| [Physical AI W1D2] 2/6 — 리눅스 실전 8 시나리오: 명령어를 손에 익히기 (0) | 2026.06.14 |
| [Physical AI W1D2] 1/6 — 리눅스 기초 체력: 쉘·파일시스템·핵심 명령어 (0) | 2026.06.14 |
| [Physical AI W1D1] 5/5 — ROS 2 /clock을 밖으로: WebSocket 서버 + Cloudflare Tunnel (1) | 2026.06.14 |