본문으로 건너뛰기

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 에는 거리값만 흐른다. (정확히는 메시지 타입이라는 게 정해져 있는데, 그건 나중에.)

자율주행 로봇의 메시지 흐름을 그림으로 보면:

자율주행 로봇 — 노드들이 토픽으로 연결된 모습 /camera/image /scan /gps/fix /cmd_vel 카메라 노드 라이다 노드 GPS 노드 알고리즘 노드 모터 노드

화살표가 토픽이고, 화살표 옆 글자가 그 토픽의 이름이다. 카메라·라이다·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 첫 실습에서 가장 많이 만나는 도구다. 처음엔 “마법 같은 디버깅 도구” 처럼 느껴지지만, 사실은 “노드 + 토픽 + 발행/구독” 이라는 단순한 모델 위에서 동작할 뿐이다.

한 줄로 박아둘 것

  1. 부품 하나 = 노드. 노드 하나는 한 가지 책임을 진다
  2. 노드끼리 데이터가 흐르는 통로 = 토픽. 토픽엔 이름이 있다 (예: /camera/image)
  3. “보이지 않는 다리”의 정체 — 같은 토픽 이름을 쓰는 노드들을 ROS가 자동으로 연결. 노드끼리 서로의 존재를 몰라도 됨
  4. 발행/구독 (pub/sub) — 발행자는 누가 듣는지 모르고, 구독자는 누가 보내는지 모른다. 라디오 방송 모형
  5. 익명·다대다 → 노드 하나가 죽거나 바뀌어도 시스템이 굴러간다 (느슨한 결합)