대상: 두 대 이상의 PC에서 ROS Master를 공유하려고 설정했지만, 토픽이 서로 안 보이거나
rostopic list가 비어 있는 상황
환경: Ubuntu 20.04 + ROS Noetic (Melodic 동일)
예시 구성:
- PC1 (로봇):
192.168.0.10, Master (roscore실행)- PC2 (노트북):
192.168.0.20, 클라이언트
1. 문제/증상 요약
멀티머신 ROS 설정을 마친 뒤 다음과 같은 현상이 발생할 수 있습니다:
- ✅
ping은 서로 잘 된다 - ✅
roscore는 정상적으로 실행 중 - ⚠️
rostopic list해도 토픽이 안 뜸 - ⚠️
rqt_graph실행해도 아무 노드도 표시되지 않음 - ⚠️
rostopic echo시 “unknown topic” 오류 발생
즉, 네트워크는 통하지만 ROS 노드끼리 통신이 되지 않는 상황입니다.
2. 원인 요약
이 문제는 대부분 ROS 네트워크 환경 변수 설정 불일치나 IP 라우팅 문제로 인해 발생합니다.
핵심 원인은 다음 중 하나입니다 👇
| 원인 | 설명 |
|---|---|
① ROS_HOSTNAME 또는 ROS_IP 잘못 설정 | 다른 PC에서 접근할 수 없는 주소가 노드 URI로 등록됨 |
② localhost로 등록됨 | 외부에서 접근 불가 |
| ③ 방화벽(ufw) 차단 | 11311 외의 TCP 포트(랜덤) 차단 |
④ /etc/hosts 이름 충돌 | 잘못된 이름 → 잘못된 IP로 resolve |
| ⑤ NAT, VPN, Docker 환경 | IP가 변환되어 URI 인식 불가 |
3. 단계별 점검 루틴
(1) 기본 통신 점검
1️⃣ IP 확인
ip addr show
- 각 PC의 실제 IP를 확인 (예:
192.168.0.x) - Wi-Fi, 유선이 둘 다 있을 경우 ROS가 어느 인터페이스를 쓰는지 주의
2️⃣ ping 테스트
ping 192.168.0.10
ping 192.168.0.20
둘 다 통하면 물리적 네트워크는 정상.
(2) ROS 환경 변수 점검
각 PC에서 확인:
echo $ROS_MASTER_URI
echo $ROS_IP
출력 예시:
ROS_MASTER_URI=http://192.168.0.10:11311
ROS_IP=192.168.0.20
두 PC의 조건
| PC | ROS_MASTER_URI | ROS_IP or ROS_HOSTNAME |
|---|---|---|
| Master (PC1) | http://192.168.0.10:11311 | 192.168.0.10 |
| Client (PC2) | http://192.168.0.10:11311 | 192.168.0.20 |
⚠️
localhost또는127.0.0.1이 들어가 있으면 외부에서 절대 접근 불가.
반드시 실제 IP로 변경해야 합니다.
(3) Master 동작 확인
Master(PC1)에서:
roscore
Client(PC2)에서:
rosnode list
정상이라면 /rosout 노드가 보입니다.
❌
/rosout이 안 보이면 → Master URI 접속이 안 됨
→ IP/포트(11311) 확인 필요
(4) 노드 URI 접근 테스트
ROS는 각 노드가 “자신의 주소(URI)”를 Master에게 등록하고,
다른 노드는 그 URI로 직접 TCP 연결을 합니다.
즉, roscore에는 연결되지만 노드끼리는 연결이 안 되는 경우가 많습니다.
확인 명령:
rosnode info /rosout
출력 중 URI: 항목이 나옵니다:
URI: http://robot-pc:43987/
👉 여기서 robot-pc가 다른 PC에서 접근 가능한 IP인지 확인해야 합니다.
ping robot-pc
또는
ping 192.168.0.10
robot-pc가 DNS로 해석이 안 되면/etc/hosts에서 이름을 수정해야 합니다.- IP가 127.0.0.1 이라면 외부 접근 불가 → 반드시 실제 IP로 변경해야 합니다.
(5) /etc/hosts 설정 확인
두 PC 모두 다음처럼 설정되어 있어야 합니다:
192.168.0.10 robot-pc
192.168.0.20 dev-pc
💡 호스트명(DNS)이 꼬이면
rosnode info에서http://localhost:xxxx/로 표시되어 통신이 끊깁니다.
(6) 방화벽(ufw) 확인
ROS는 Master(11311) 외에도 각 노드가 랜덤 TCP 포트를 열기 때문에
방화벽이 켜져 있으면 통신이 막힐 수 있습니다.
상태 확인:
sudo ufw status
테스트용 비활성화:
sudo ufw disable
(7) Wi-Fi / 유선 중복 환경
ROS가 내부적으로 어떤 네트워크 인터페이스를 선택했는지 확인하려면:
hostname -I
이 IP와 $ROS_IP가 일치해야 합니다.
Wi-Fi와 유선이 동시에 연결돼 있으면 종종 잘못된 인터페이스가 잡힙니다.
4. 자주 겪는 사례별 정리
| 상황 | 원인 | 해결 방법 |
|---|---|---|
ping은 되지만 rostopic list 비어 있음 | $ROS_HOSTNAME이 localhost로 등록 | 실제 IP로 변경 |
rosnode info에서 URI가 127.0.0.1 | 자기 자신으로만 접근 가능 | $ROS_IP를 실제 IP로 설정 |
rqt_graph 비어 있음 | Master는 연결되지만 노드 간 TCP 실패 | 각 노드의 URI 확인 |
/rosout만 보임 | Master는 공유되지만 다른 노드 실행 안 됨 | 퍼블리셔 노드 실행 상태 확인 |
| 한쪽만 토픽 수신 가능 | NAT, VPN으로 IP 변환됨 | VPN 끄거나 고정 IP 설정 |
| Docker 환경 | 컨테이너 내부 IP 다름 | bridge 모드 대신 host 네트워크 사용 |
5. 최종 점검 순서
1️⃣ ping으로 IP 통신 확인
2️⃣ $ROS_MASTER_URI, $ROS_IP 확인
3️⃣ rosnode list → /rosout 확인
4️⃣ rosnode info /rosout → URI 확인
5️⃣ ufw 및 /etc/hosts 점검
✅ 위 5단계를 통과하면 99%의 멀티머신 ROS 통신 문제는 해결됩니다.
6. 정리
| 핵심 포인트 | 설명 |
|---|---|
ROS_MASTER_URI | 모든 노드가 동일해야 함 (Master의 IP) |
ROS_IP or ROS_HOSTNAME | 각 PC 자신의 IP 또는 이름 |
/etc/hosts | 호스트명 해석 문제 예방 |
| 방화벽 | 11311 + 랜덤 포트 모두 열려 있어야 함 |
| 노드 URI 확인 | rosnode info 로 TCP 대상 확인 |
📌 요약
- ping이 되는데 ROS 토픽이 안 보인다면, IP 설정 불일치가 90% 원인
- 특히
ROS_HOSTNAME이localhost로 되어 있으면 무조건 실패 rosnode info로 노드 URI를 직접 확인하면 원인을 빠르게 찾을 수 있음/etc/hosts, 방화벽, 네트워크 인터페이스까지 함께 점검