ROS_DOMAIN_ID와 탐색 범위

내 키보드가 옆자리 거북이를 움직인다면?

증상

같은 네트워크면 서로 찾습니다

ROS 2 노드는 마스터 없이 서로를 찾습니다(1강 5편). 기본 설정에서는 같은 네트워크에 있는 다른 컴퓨터의 노드까지 찾습니다. 강의실에서 모두 turtlesim을 띄우면 토픽 이름이 같아 남의 거북이를 움직일 수 있습니다.

도메인

번호로 방을 나눕니다

ROS_DOMAIN_ID는 ROS 2 통신을 나누는 번호입니다. 번호가 같은 노드끼리만 서로 찾고 대화합니다. 기본값은 0이라, 아무것도 안 하면 모두 같은 방에 있는 셈입니다.

리눅스에서는 0~101 가운데 고르면 안전합니다(공식 문서).

따라 하기

내 번호를 정해 모든 터미널에

export ROS_DOMAIN_ID=7처럼 정하면 그 터미널에서 띄운 노드는 7번 방에서만 대화합니다. 거북이와 키보드 터미널이 같은 번호여야 하므로 echo "export ROS_DOMAIN_ID=7" >> ~/.bashrc로 적어 두면 안전합니다(3편).

7은 예시 번호입니다. 강의실에서는 자리마다 다른 번호를 나눠 씁니다.

탐색 범위

아예 내 컴퓨터 안에서만

export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST로 두면 같은 컴퓨터의 노드만 찾습니다. 혼자 연습할 때 가장 깔끔합니다. 예전의 ROS_LOCALHOST_ONLY는 폐기 예정이니 쓰지 않습니다.

도메인 번호와 함께 씁니다. 범위를 좁혀도 번호가 같은 노드끼리만 대화합니다.

반대 경우

다른 PC가 안 보일 때

서로 안 보이면 먼저 ROS_DOMAIN_ID가 같은지, 범위가 LOCALHOST는 아닌지 봅니다. 그래도 안 되면 학교·회사 와이파이가 서로 찾는 신호(멀티캐스트)를 막는 경우가 많습니다. 이때 export ROS_STATIC_PEERS='192.168.0.12'처럼 상대 IP를 적어 직접 찾게 합니다.

IP는 예시입니다. 여러 개는 'IP1;IP2'처럼 작은따옴표로 감쌉니다(따옴표가 없으면 bash가 ;에서 명령을 끊습니다). WSL2라면 networkingMode=mirrored인지도 확인합니다.

TurtleBot3

매뉴얼은 30번을 씁니다

ROBOTIS의 TurtleBot3 매뉴얼은 원격 PC와 로봇의 ~/.bashrc에 export ROS_DOMAIN_ID=30을 적게 합니다. 기본값 0을 쓰는 다른 ROS 2 장비와 섞이지 않고, 같은 번호인 로봇과 PC끼리만 서로 찾게 됩니다.

30에 특별한 뜻은 없습니다. 로봇이 여러 대면 대마다 다른 번호를 씁니다. 14~15강에서 이 줄을 적었다면 모든 터미널이 30번입니다.

다음 강

이제 그래프 속 노드를 하나씩 들여다봅니다

3강 1편노드는 무엇일까? 2강 목록