네트워크를 넘어서는 ROS: 멀티 PC에서 master 공유하고 토픽 주고받기

대상: 로봇 본체와 개발 PC, 혹은 여러 장비 간에 ROS 토픽을 네트워크로 주고받고 싶은 개발자
환경: Ubuntu 20.04 + ROS Noetic (ROS Melodic 동일)
예시 구성:

  • PC1 (로봇): ROS Master
  • PC2 (개발용 노트북): 센서 데이터 구독 및 제어 명령 송신

1. 문제/주제 요약

ROS는 본래 단일 머신에서 동작하지만,
여러 장비를 네트워크로 묶으면 하나의 ROS 시스템처럼 동작하게 할 수 있습니다.

예를 들어:

  • 로봇 본체(PC1)는 센서 데이터를 퍼블리시
  • 개발용 PC(PC2)는 같은 /scan, /odom, /cmd_vel 등을 구독

이때 필요한 핵심 개념이 바로 ROS Master 공유입니다.


2. 원인/배경 설명

ROS는 중앙집중형 통신 구조로,
모든 노드가 roscore를 통해 통신 주소를 등록하고 토픽 정보를 공유합니다.

멀티 PC 환경에서는 다음 두 가지 조건이 만족되어야 합니다:

  1. 모든 노드가 동일한 ROS_MASTER_URI를 바라봐야 함
  2. 각 PC의 IP 주소를 서로 인식할 수 있어야 함 (ROS_HOSTNAME or ROS_IP)

즉, ROS Master는 한 PC에만 존재하고,
다른 PC들은 그 Master에 접속하는 방식으로 동작합니다.


3. 설정 순서 (단계별 튜토리얼)

(1) 두 PC 간 네트워크 연결 확인

서로 같은 LAN(유선/무선)에 연결되어 있어야 합니다.
예를 들어 다음과 같은 IP 구성을 가정하겠습니다.

장비역할IP 주소
PC1Master (로봇)192.168.0.10
PC2Client (노트북)192.168.0.20

ping으로 통신 확인:

ping 192.168.0.10
ping 192.168.0.20

(2) ROS Master (PC1) 설정

1️⃣ roscore 실행

roscore

2️⃣ 환경 변수 설정

~/.bashrc 맨 아래에 다음을 추가:

export ROS_MASTER_URI=http://192.168.0.10:11311
export ROS_HOSTNAME=192.168.0.10

적용:

source ~/.bashrc

(3) 클라이언트 PC (PC2) 설정

~/.bashrc 수정:

export ROS_MASTER_URI=http://192.168.0.10:11311
export ROS_HOSTNAME=192.168.0.20

적용:

source ~/.bashrc

💡 ROS_HOSTNAME vs ROS_IP

  • ROS_HOSTNAME: 호스트 이름(DNS 기반) 사용 시
  • ROS_IP: 고정 IP 기반 네트워크 환경에서 권장
    대부분 ROS_IP를 쓰는 편이 안정적입니다.

(4) 연결 테스트

1️⃣ PC1 (Master)

토픽 퍼블리시 예시:

rostopic pub /chatter std_msgs/String "data: 'Hello from PC1'" -r 1

2️⃣ PC2 (Client)

토픽 구독 테스트:

rostopic echo /chatter

정상이라면 다음과 같이 표시됩니다:

data: "Hello from PC1"

🎯 성공적으로 보인다면 두 PC가 같은 ROS Master를 공유하고 있는 것입니다.


(5) 반대로 PC2 → PC1로 송신

PC2에서 명령 퍼블리시:

rostopic pub /cmd_vel geometry_msgs/Twist "linear: {x: 0.2} angular: {z: 0.0}"

PC1에서 구독 중이라면:

rostopic echo /cmd_vel

정상적으로 데이터가 보입니다.


4. 네트워크 설정 시 자주 하는 실수 및 해결 팁

⚠️ 1. localhost (127.0.0.1) 문제

ROS_HOSTNAME을 제대로 지정하지 않으면 기본적으로 localhost가 잡혀서 외부 PC에서 접근 불가.
→ 반드시 IP 주소 기반 설정 필요.

⚠️ 2. 방화벽

Ubuntu에서 ufw 방화벽이 켜져 있으면 ROS 포트(11311, TCP range) 차단될 수 있습니다.
확인:

sudo ufw status

비활성화(테스트용):

sudo ufw disable

⚠️ 3. Wi-Fi vs 유선 혼선

Wi-Fi와 유선이 동시에 연결된 경우, ROS가 어느 인터페이스 IP를 쓰는지 혼동할 수 있습니다.
ifconfig 또는 ip addr로 사용 중 네트워크 확인 후 ROS_IP 명시.

⚠️ 4. IP 대신 호스트명 사용 시 /etc/hosts 설정 필요

예:

192.168.0.10 robot-pc
192.168.0.20 dev-pc

이후:

export ROS_MASTER_URI=http://robot-pc:11311
export ROS_HOSTNAME=dev-pc

5. 멀티 PC 연결 구조 시각화

간단한 네트워크 구조:

 ┌────────────────────┐
 │ PC1 (Master)       │
 │ ROS_MASTER_URI=http://192.168.0.10:11311
 │ ROS_HOSTNAME=192.168.0.10
 │ └── roscore, sensor_node (/scan)
 └────────────┬────────┘
              │
              │  Wi-Fi / LAN
              ▼
 ┌────────────────────┐
 │ PC2 (Client)       │
 │ ROS_MASTER_URI=http://192.168.0.10:11311
 │ ROS_HOSTNAME=192.168.0.20
 │ └── rviz, control_node (/cmd_vel)
 └────────────────────┘

두 시스템이 하나의 Master를 공유하여 /scan, /cmd_vel 등 토픽을 서로 주고받습니다.


6. 추가 팁

  • rqt_graph 실행 시
    → 두 PC의 노드들이 모두 하나의 그래프에 표시됩니다. rqt_graph
  • rosbag 기록은 Master 쪽에서만 해도 됨
    모든 토픽이 하나의 네임스페이스에서 보이므로, 한쪽에서만 rosbag record -a 실행하면 전체 데이터 기록 가능.
  • 성능 개선:
    토픽 대역폭이 큰 경우(camera/image_raw 등) → image_transport/compressed 사용 추천.

7. 정리

항목설명설정 위치
ROS_MASTER_URIMaster의 IP:port 지정모든 PC
ROS_HOSTNAME / ROS_IP해당 PC 자신의 IP각 PC
roscoreMaster PC에서 1회 실행PC1
ping, rostopic echo연결 테스트PC2

📌 요약

  • 한 PC에서 roscore 실행 → 다른 PC들은 ROS_MASTER_URI로 접속
  • 각 PC의 IP 주소를 ROS_HOSTNAME 또는 ROS_IP로 설정
  • 같은 네트워크 내에서라면 모든 노드가 하나의 ROS 환경처럼 통신 가능
  • rqt_graph로 연결 상태를 시각적으로 점검 가능

댓글 남기기