대상: 로봇 본체와 개발 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 환경에서는 다음 두 가지 조건이 만족되어야 합니다:
- 모든 노드가 동일한
ROS_MASTER_URI를 바라봐야 함 - 각 PC의 IP 주소를 서로 인식할 수 있어야 함 (
ROS_HOSTNAMEorROS_IP)
즉, ROS Master는 한 PC에만 존재하고,
다른 PC들은 그 Master에 접속하는 방식으로 동작합니다.
3. 설정 순서 (단계별 튜토리얼)
(1) 두 PC 간 네트워크 연결 확인
서로 같은 LAN(유선/무선)에 연결되어 있어야 합니다.
예를 들어 다음과 같은 IP 구성을 가정하겠습니다.
| 장비 | 역할 | IP 주소 |
|---|---|---|
| PC1 | Master (로봇) | 192.168.0.10 |
| PC2 | Client (노트북) | 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_HOSTNAMEvsROS_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_URI | Master의 IP:port 지정 | 모든 PC |
ROS_HOSTNAME / ROS_IP | 해당 PC 자신의 IP | 각 PC |
roscore | Master PC에서 1회 실행 | PC1 |
ping, rostopic echo | 연결 테스트 | PC2 |
📌 요약
- 한 PC에서
roscore실행 → 다른 PC들은ROS_MASTER_URI로 접속 - 각 PC의 IP 주소를
ROS_HOSTNAME또는ROS_IP로 설정 - 같은 네트워크 내에서라면 모든 노드가 하나의 ROS 환경처럼 통신 가능
rqt_graph로 연결 상태를 시각적으로 점검 가능