ROS 2 — 보이지 않는 다리 (노드와 토픽)
노드와 토픽, 그리고 그 사이에 자동으로 깔리는 '보이지 않는 다리'의 정체.
자율주행 로봇 한 대를 떠올려보자. 카메라·라이다·GPS·알고리즘·모터 다섯 부품이 각자 다른 프로그램으로 짜여 있고, 다 같이 일해야 한다. “카메라가 영상을 알고리즘한테 보낸다” — 이 한 줄이 자연스럽게 가능해야 한다는 뜻인데, 정작 “어떻게” 가 잘 안 보인다.
ROS가 그 사이에 “보이지 않는 다리” 를 자동으로 놓아준다. 그 다리의 정체를 한 발씩 풀어보자.
1. 부품 하나 = 노드 (node)
ROS에서 부품 하나 는 곧 노드 (node) 다.
시스템 입장에서 보면 노드는 그냥 프로세스(process — 운영체제가 실행 중인 프로그램 한 개) 다. 다른 점은, 노드는 “ROS의 약속을 따르는” 프로세스라는 것뿐.
자율주행 로봇 예시를 노드 단위로 다시 그리면:
- 카메라 노드 — 카메라에서 들어오는 영상을 ROS 형식의 메시지로 내보냄
- 라이다 노드 — 라이다에서 들어오는 거리 데이터를 메시지로 내보냄
- GPS 노드 — 현재 위치(위도·경도)를 메시지로 내보냄
- 알고리즘 노드 — 위 세 종류의 메시지를 받아서 “어떻게 움직일지” 를 계산
- 모터 노드 — 알고리즘이 내린 명령을 받아서 실제 모터를 돌림
한 노드는 보통 한 가지 책임을 진다 — “카메라 다루기” / “지도 만들기” / “경로 계산” 같이. 자율주행 로봇 코드를 한 덩어리로 짜는 게 아니라, 책임 단위로 쪼개서 각 노드로 만든다.
2. 데이터가 흐르는 통로 = 토픽 (topic)
노드끼리 메시지를 주고받으려면 통로가 있어야 한다. 그 통로의 이름이 토픽 (topic) 이다.
토픽 이름은 슬래시(/)로 시작하는 경로 형태다:
/camera/image— 카메라 영상이 흐르는 토픽/scan— 라이다 거리 데이터가 흐르는 토픽/gps/fix— GPS 위치가 흐르는 토픽/cmd_vel— 모터 명령(속도)이 흐르는 토픽
각 토픽은 하나의 종류의 데이터만 다룬다. /camera/image 에는 영상만, /scan 에는 거리값만 흐른다. (정확히는 메시지 타입이라는 게 정해져 있는데, 그건 나중에.)
자율주행 로봇의 메시지 흐름을 그림으로 보면:
화살표가 토픽이고, 화살표 옆 글자가 그 토픽의 이름이다. 카메라·라이다·GPS에서 알고리즘으로 데이터가 들어가고, 알고리즘에서 모터로 명령이 나간다. 노드는 책임 단위, 토픽은 데이터 흐름의 통로.
3. “보이지 않는 다리”의 정체 — 같은 토픽 이름이면 자동 연결
카메라 노드와 알고리즘 노드는 서로의 존재를 모른다. IP 주소도, 포트 번호도, 상대가 살아있는지도 모르고 시작한다. 그런데 어떻게 영상이 흘러가나?
답은 의외로 단순하다. 두 노드가 같은 토픽 이름(/camera/image)을 쓰기로 했기 때문이다.
- 카메라 노드: “나
/camera/image에 영상을 흘려보낼게” 라고 ROS에 등록 - 알고리즘 노드: “나
/camera/image에서 영상 받을게” 라고 ROS에 등록 - ROS가 같은 토픽 이름을 쓰는 두 노드를 자동으로 짝지어준다
이게 “보이지 않는 다리” 의 실체다. 다리를 사람이 직접 놓는 게 아니라, 같은 이름을 부르면 자동으로 다리가 깔린다.
비유하자면 라디오 방송 같다. 주파수 102.7 MHz에 맞추기만 하면 송신탑과 라디오가 만난다. 송신탑은 라디오가 몇 대 있는지 모르고, 라디오는 송신탑이 어디 있는지 모른다. 둘 다 주파수만 안다.
4. 발행자(publisher)와 구독자(subscriber)
이 모델에는 두 가지 역할이 나온다.
- 발행자 (publisher) — 토픽에 데이터를 내보내는 쪽. 카메라 노드가 발행자
- 구독자 (subscriber) — 토픽에서 데이터를 받는 쪽. 알고리즘 노드가 구독자
라디오 비유로 대응시키면:
| 라디오 비유 | ROS 용어 |
|---|---|
| 송신탑 (방송국) | 발행자 (publisher) |
| 라디오 수신기 | 구독자 (subscriber) |
| 주파수 (102.7 MHz) | 토픽 이름 (/camera/image) |
| 음악·뉴스 데이터 | 메시지 (message) |
이 모델을 펍서브 (pub/sub — publish/subscribe) 라고 부른다. ROS의 가장 기본 통신 모델이다.
5. 익명·다대다 — 노드들이 서로 몰라도 굴러간다
펍서브 모델에는 두 가지 특징이 더 있다.
- 익명 (anonymous) — 발행자는 자기 메시지를 누가 받는지 모른다. 구독자도 누가 보냈는지 모른다. 둘 사이에 “이름표”는 없고, 토픽이라는 매개만 있을 뿐
- 다대다 (many-to-many) — 한 토픽에 발행자가 여러 명, 구독자도 여러 명 가능. 같은
/scan토픽에 두 개의 라이다 노드가 발행자로 붙고, 세 개의 알고리즘 노드가 구독자로 붙을 수 있다
자율주행 로봇 예시로 이게 왜 좋은지 보면:
- 카메라 노드가 죽었다 살아도 → 알고리즘 노드는 코드 한 줄 안 바꾸고 다시 영상을 받기 시작한다
- 카메라를 더 좋은 모델로 교체해도 → 새 카메라 노드가 같은 토픽 이름(
/camera/image)으로 발행하기만 하면 알고리즘은 영향 받지 않음 - 시각화 도구(예: 영상을 화면에 띄우는 별도 프로그램)를 새로 추가해도 → 그 도구가
/camera/image를 구독하기만 하면 끝. 기존 노드는 전혀 안 바꿔도 됨
이걸 느슨한 결합 (loose coupling — 부품들이 서로에 강하게 묶이지 않은 상태) 이라고 부른다. 분산 로봇 시스템의 핵심 미덕이다.
6. 직접 보기 — ros2 topic 명령
ROS 2를 설치하고 자율주행 로봇 같은 시스템을 띄우면, 실제로 어떤 노드들이 떠 있고 어떤 토픽들이 흐르는지 명령어 한 줄로 볼 수 있다.
$ ros2 node list
/camera_node
/lidar_node
/gps_node
/algorithm_node
/motor_node
$ ros2 topic list
/camera/image
/scan
/gps/fix
/cmd_vel
$ ros2 topic info /camera/image
Type: sensor_msgs/msg/Image
Publisher count: 1
Subscription count: 1
$ ros2 topic echo /camera/image
# 실제로 흐르고 있는 메시지가 한 개씩 출력됨
이 명령들은 ROS 2 첫 실습에서 가장 많이 만나는 도구다. 처음엔 “마법 같은 디버깅 도구” 처럼 느껴지지만, 사실은 “노드 + 토픽 + 발행/구독” 이라는 단순한 모델 위에서 동작할 뿐이다.
한 줄로 박아둘 것
- 부품 하나 = 노드. 노드 하나는 한 가지 책임을 진다
- 노드끼리 데이터가 흐르는 통로 = 토픽. 토픽엔 이름이 있다 (예:
/camera/image) - “보이지 않는 다리”의 정체 — 같은 토픽 이름을 쓰는 노드들을 ROS가 자동으로 연결. 노드끼리 서로의 존재를 몰라도 됨
- 발행/구독 (pub/sub) — 발행자는 누가 듣는지 모르고, 구독자는 누가 보내는지 모른다. 라디오 방송 모형
- 익명·다대다 → 노드 하나가 죽거나 바뀌어도 시스템이 굴러간다 (느슨한 결합)