글 / ROS 2 기초

ROS_DOMAIN_ID와 통신 범위

도메인 ID로 시스템을 분리하고, 노드를 어디까지 탐색할지는 ROS_AUTOMATIC_DISCOVERY_RANGE로 제한한다.

작성일 · 읽는 시간 2분 · ROS 2 Jazzy 기준

문제 정의

ROS 2 노드는 기본 설정에서 같은 서브넷의 다른 노드를 자동으로 탐색하여 연결한다. 한 네트워크에 서로 무관한 시스템이 둘 있고 토픽 이름이 같으면, 한 시스템이 발행한 값을 다른 시스템이 수신하게 된다.

도메인 ID

도메인 ID는 하나의 물리 네트워크를 여러 논리 네트워크로 분리하는 값이다. 같은 도메인의 노드끼리만 서로 탐색하고 통신한다. 기본값은 0이므로, 별도로 지정하지 않은 시스템은 모두 같은 도메인에 속한다.

bash~/.bashrc
export ROS_DOMAIN_ID=42

도메인 ID로 분리된 물리 네트워크 내부의 통신 범위

공식 문서는 0에서 101 사이의 값을 선택하도록 안내한다. 도메인 ID로 UDP 포트 번호를 계산하므로 사용할 수 있는 값은 0에서 232까지이고, 운영체제가 임시 포트로 사용하는 범위를 피하면 다음과 같다.

운영체제 임시 포트와 겹치지 않는 도메인 ID
Linux 0~101, 215~232
macOS, Windows 0~166

Linux의 값은 임시 포트 범위가 기본값인 32768~60999일 때의 값이다. 범위의 끝에 가까운 값에서는 실행할 수 있는 프로세스 수도 감소한다. Linux에서 101을 사용하면 54개까지이다.

운영체제별로 사용할 수 있는 도메인 ID 값의 범위

탐색 범위

도메인 ID가 시스템을 분리한다면, 탐색(discovery) 범위는 노드를 어디까지 탐색할지를 결정한다. 이전에는 ROS_LOCALHOST_ONLY로 같은 컴퓨터 내부로만 제한할 수 있었다. ROS 2 Iron 배포판부터 이 변수는 폐기 예정(deprecated)이며, 아래 두 변수가 이를 대체한다.

ROS_AUTOMATIC_DISCOVERY_RANGE에는 다음 값 가운데 하나를 지정한다.

  • SUBNET: 기본값이다. DDS 기반 미들웨어에서는 멀티캐스트로 도달할 수 있는 노드를 모두 탐색한다.
  • LOCALHOST: 같은 컴퓨터의 노드만 탐색한다.
  • OFF: 같은 컴퓨터의 노드도 탐색하지 않는다.
  • SYSTEM_DEFAULT: 미들웨어의 탐색 설정을 변경하지 않는다.

ROS_STATIC_PEERS에는 별도로 탐색을 시도할 주소를 세미콜론으로 구분하여 지정한다.

bash
# 같은 컴퓨터 안으로 좁히고, 정해 둔 상대만 더 찾는다
export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST
export ROS_STATIC_PEERS='192.168.0.1;remote.example'

ROS_AUTOMATIC_DISCOVERY_RANGE 값별 탐색 범위

참고

rmw_zenoh는 이 두 환경 변수를 지원하지 않는다.