멀티머신 ROS 통신이 안될 때: ping은 되는데 토픽이 안 보이는 상황 정리

대상: 두 대 이상의 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의 조건

PCROS_MASTER_URIROS_IP or ROS_HOSTNAME
Master (PC1)http://192.168.0.10:11311192.168.0.10
Client (PC2)http://192.168.0.10:11311192.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_HOSTNAMElocalhost로 되어 있으면 무조건 실패
  • rosnode info로 노드 URI를 직접 확인하면 원인을 빠르게 찾을 수 있음
  • /etc/hosts, 방화벽, 네트워크 인터페이스까지 함께 점검

댓글 남기기