intermediate - ROS_DOMAIN_ID

ROS 2의 기본 미들웨어인 DDS에서는 Domain ID로 논리 네트워크를 나눈다. 같은 도메인 ID를 쓰는 노드끼리는 서로 발견하고 통신할 수 있고, 다른 도메인 ID를 쓰는 노드끼리는 통신하지 않는다. 기본값은 0이다. 같은 물리 네트워크에서 여러 팀/그룹이 ROS 2를 돌릴 때는 그룹마다 서로 다른 도메인 ID를 두면 간섭을 피할 수 있다.

공식 개념 문서: The ROS_DOMAIN_ID (Jazzy)

도메인 ID 선택

안전하게 쓰려면 도메인 ID는 0 이상 101 이하(포함)로 두는 것이 좋다. 아래는 그 이유(포트 계산, 플랫폼별 일시 포트 범위, 참가자 수 제약)를 정리한 것이다.

도메인 ID와 UDP 포트

도메인 ID는 DDS가 디스커버리·통신용 UDP 포트를 계산하는 데 쓰인다. UDP 포트는 16비트 부호 없는 정수이므로 상한은 65535이고, 공식 문서의 계산식에 따르면 도메인 ID는 0~232까지 쓸 수 있다.

플랫폼별 제약 (일시 포트와의 충돌 방지)

OS의 일시(ephemeral) 포트 범위와 겹치지 않도록 도메인 ID 범위를 제한하는 것이 좋다.

플랫폼일시 포트 범위충돌 없이 쓸 수 있는 도메인 ID
Linux32768–609990–101, 215–232
macOS49152–655350–166
Windows49152–655350–166

Linux에서 모든 플랫폼과의 호환을 고려하면 0–101을 쓰는 것이 안전하다. Linux에서 일시 포트 범위는 /proc/sys/net/ipv4/ip_local_port_range로, macOS/Windows에서는 각각 sysctl·netsh로 변경 가능하다. 사용자 정의 범위를 쓰면 위 숫자는 달라질 수 있다.

참가자(프로세스) 수 제약

컴퓨터에서 실행되는 ROS 2 프로세스(ros2 run 으로 실행된 실행단위)마다 DDS 참가자(participant) 하나가 만들어진다. 참가자 하나는 UDP 포트 2개를 사용한다. 따라서 한 컴퓨터에서 ROS 2 프로세스를 120개 넘게 띄우면, 사용하는 포트가 다른 도메인 ID용 포트일시(ephemeral) 포트와 겹칠 수 있다.

그 이유를 도메인 ID 1과 2로 보면 다음과 같다(원문 Participant constraints).

  • 도메인 ID 1은 멀티캐스트에 포트 7650, 7651을 쓴다.
  • 도메인 ID 2는 멀티캐스트에 포트 7900, 7901을 쓴다.
  • 도메인 ID 1에서 **1번째 프로세스(0번째 참가자)**는 유니캐스트에 7660, 7661을 쓴다.
  • 도메인 ID 1에서 **120번째 프로세스(119번째 참가자)**는 유니캐스트에 7898, 7899를 쓴다.
  • 도메인 ID 1에서 **121번째 프로세스(120번째 참가자)**는 유니캐스트에 7900, 7901을 쓰게 되는데, 이 포트는 이미 도메인 ID 2의 멀티캐스트용으로 쓰이므로 겹친다.

해당 컴퓨터가 한 번에 하나의 도메인 ID만 쓰고, 그 도메인 ID가 충분히 낮으면 120개를 넘는 ROS 2 프로세스를 띄워도 괜찮다.

도메인 ID를 플랫폼별 안전 범위의 상단(예: Linux에서 101, 232, macOS/Windows에서 166)에 두는 경우에는 한 가지를 더 고려해야 한다. 유니캐스트 포트가 큰 번호로 밀리기 때문에, 120개보다 훨씬 적은 프로세스 수에서부터 일시(ephemeral) 포트와 겹치기 시작한다.

예: Linux에서 도메인 ID 101일 때

  • 0번째 ROS 2 프로세스: 32650, 32651, 32660, 32661
  • 1번째 프로세스: 32650, 32651, 32662, 32663
  • 53번째 프로세스: 32650, 32651, 32766, 32767
  • 54번째 프로세스: 32650, 32651, 32768, 32769 → Linux 일시 포트 범위(32768–60999)와 겹친다.

따라서 Linux에서 도메인 ID 101을 쓸 때는 프로세스는 54개까지 두는 것이 좋다. Linux에서 도메인 ID 232는 포트 상한 65535 때문에 63개 정도가 한계이고, macOS/Windows에서 도메인 ID 166은 120개가 한계다.

설정 방법

환경 변수 **ROS_DOMAIN_ID**를 원하는 값(0–232, 권장 0–101)으로 설정한 뒤 노드를 실행하면 된다.

export ROS_DOMAIN_ID=1
ros2 run <pkg> <node>

또는 한 번만 쓰는 경우:

ROS_DOMAIN_ID=1 ros2 run <pkg> <node>