Main Content

ROS 네트워크에 연결하기

ROS 네트워크는 하나의 ROS master와 다수의 ROS 노드로 구성됩니다. ROS master는 모든 활성 ROS 엔터티를 추적하여 ROS 네트워크에서의 통신을 수행합니다. 각 노드가 네트워크 내의 나머지 노드들과 통신할 수 있으려면 ROS master에 등록되어야 합니다. MATLAB®에서 ROS master를 시작할 수도 있고, MATLAB 외부에서(예: 다른 컴퓨터에서) master를 시작할 수도 있습니다.

ROS로 작업할 때는 일반적으로 다음 단계를 따릅니다.

  1. ROS 네트워크에 연결합니다. ROS 네트워크에 연결하려면 MATLAB에서 ROS master를 만들거나 기존 ROS master에 연결합니다. 두 경우 모두 MATLAB은 자체 ROS 노드(MATLAB 전역 노드라고 함)를 만들고 master에 등록합니다. rosinit 함수가 이 프로세스를 관리합니다.

  2. 데이터를 교환합니다. 연결되고 나면 MATLAB은 publisher, subscriber, 서비스를 통해 다른 ROS 노드와 데이터를 교환합니다.

  3. ROS 네트워크와의 연결을 끊습니다. rosshutdown 함수를 호출하여 ROS 네트워크로부터 MATLAB의 연결을 끊습니다.

이 예제에서는 다음을 수행하는 방법을 보여줍니다.

  • MATLAB에서 ROS master 만들기

  • 외부 ROS master에 연결하기

선행 조건: ROS 시작하기

MATLAB에서 ROS master 만들기

  • MATLAB에서 ROS master를 만들기 위해 인수 없이 rosinit를 호출합니다. 이 함수는 MATLAB이 ROS 네트워크의 다른 노드와 통신할 때 사용하는 전역 노드도 생성합니다.

rosinit
Launching ROS Core...
Done in 0.73873 seconds.
Initializing ROS master on http://172.30.105.11:55538.
Initializing global node /matlab_global_node_47927 with NodeURI http://dcc002241glnxa64:44109/ and MasterURI http://localhost:55538.

MATLAB 외부의 ROS 노드가 이제 ROS 네트워크에 참여할 수 있습니다. 이러한 노드는 MATLAB 호스트 컴퓨터의 호스트 이름 또는 IP 주소를 사용하여 MATLAB의 ROS master에 연결될 수 있습니다.

rosshutdown을 호출하여 ROS master와 전역 노드를 종료할 수 있습니다.

rosshutdown
Shutting down global node /matlab_global_node_47927 with NodeURI http://dcc002241glnxa64:44109/ and MasterURI http://localhost:55538.
Shutting down ROS master on http://172.30.105.11:55538.

외부 ROS master에 연결하기

rosinit 명령을 사용하여 외부 ROS master(예: 로봇 또는 가상 머신에서 실행되는 ROS master)에 연결할 수도 있습니다. master의 주소를 지정하는 방법에는 IP 주소로 지정하는 방법 또는 master를 실행하는 컴퓨터의 호스트 이름으로 지정하는 방법 두 가지가 있습니다.

rosinit를 호출한 이후에는 다른 구문을 사용하여 rosinit를 호출하기 전에 매번 rosshutdown을 호출해야 합니다. 간결한 설명을 위해 이 예제에서는 rosshutdown 호출을 생략합니다.

'master_host'는 호스트 이름 예시이고, '192.168.1.1'은 외부 ROS master의 IP 주소 예시입니다. 외부 master가 네트워크의 어디에 있는지에 따라 이러한 주소를 조정하십시오. 지정된 주소에서 master를 찾을 수 없으면 이 명령은 실패합니다.

rosinit('192.168.1.1')
rosinit('master_host')

rosinit에 대한 두 호출 모두 master가 표준 ROS master 포트인 포트 11311에서 네트워크 연결을 수락한다고 가정합니다. master가 다른 포트에서 실행 중이면 해당 포트를 두 번째 인수로 지정할 수 있습니다. 호스트 이름 master_host와 포트 12000에서 실행 중인 ROS master에 연결하려면 다음 명령을 사용합니다.

rosinit('master_host',12000)

master의 전체 URI(Uniform Resource Identifier)를 아는 경우 다음 구문을 사용하여 전역 노드를 만들고 이 master에 연결할 수 있습니다.

rosinit('http://192.168.1.1:12000')

노드 호스트 사양

경우에 따라 컴퓨터가 여러 네트워크에 연결되어 있고 IP 주소도 여러 개일 수 있습니다. 다음 그림은 예시를 보여줍니다.

왼쪽 아래의 컴퓨터는 MATLAB을 실행하고 있으며, 2개의 서로 다른 네트워크에 연결되어 있습니다. 한 서브넷의 IP 주소는 73.195.120.50, 다른 서브넷의 IP 주소는 192.168.1.100입니다. 이 컴퓨터는 IP 주소 192.168.1.1로 TurtleBot® 컴퓨터의 ROS master에 연결하려고 합니다. master 등록 과정에서 MATLAB 전역 노드는 다른 ROS 노드가 도달할 수 있는 IP 주소 또는 호스트 이름을 지정해야 합니다. TurtleBot의 모든 노드는 이 주소를 사용하여 MATLAB의 전역 노드로 데이터를 보냅니다.

rosinit를 master의 IP 주소로 호출하면, master와 연결하는 데 사용되는 네트워크 인터페이스를 탐지하여 전역 노드의 IP 주소로 사용하려고 시도합니다. 이 자동 탐지가 실패하면 rosinit 호출에서 NodeHost 이름-값 쌍을 사용하여 IP 주소 또는 호스트 이름을 명시적으로 지정할 수 있습니다. NodeHost 이름-값 쌍은 이미 여기에서 소개한 다른 구문과 함께 사용할 수 있습니다.

이러한 명령은 컴퓨터의 IP 주소를 ROS 네트워크에 192.168.1.100으로 알립니다.

rosinit('192.168.1.1','NodeHost','192.168.1.100')
rosinit('http://192.168.1.1:11311','NodeHost','192.168.1.100')
rosinit('master_host','NodeHost','192.168.1.100')

노드가 ROS 네트워크에 등록되면 명령 rosnode info <nodename>을 사용하여 이 노드의 주소를 확인할 수 있습니다. rosnode list를 호출하면 등록된 노드의 이름을 모두 볼 수 있습니다.

ROS 환경 변수

고급 활용 사례에서는 표준 ROS 환경 변수를 통해 ROS master의 주소와 노드를 알리는 주소를 지정하고 싶을 수 있습니다. 대부분의 활용 사례에서는 이전 섹션에서 설명한 구문으로 충분합니다.

rosinit에 인수가 제공되지 않으면 이 함수는 표준 ROS 환경 변수 값도 확인합니다. ROS_MASTER_URI, ROS_HOSTNAME, ROS_IP가 그러한 변수에 해당합니다. 다음과 같이 getenv 명령을 사용하여 이러한 변수의 현재 값을 볼 수 있습니다.

getenv('ROS_MASTER_URI')
getenv('ROS_HOSTNAME')
getenv('ROS_IP')

setenv 명령을 사용하여 이러한 변수를 설정할 수 있습니다. 환경 변수를 설정한 후 인수 없이 rosinit를 호출합니다. ROS master의 주소는 ROS_MASTER_URI, 전역 노드가 자신을 알리는 주소는 ROS_IP 또는 ROS_HOSTNAME으로 주어집니다. rosinit에 추가 인수를 지정하면 환경 변수의 값이 재정의됩니다.

setenv('ROS_MASTER_URI','http://192.168.1.1:11311')
setenv('ROS_IP','192.168.1.100')
rosinit

ROS_HOSTNAMEROS_IP를 둘 다 설정할 필요는 없습니다. 둘 다 설정되어 있으면 ROS_HOSTNAME이 우선합니다.

연결 확인하기

ROS 연결이 제대로 작동하려면 모든 노드가 master와 통신할 수 있어야 하며, 노드끼리도 서로 통신할 수 있어야 합니다. subscriber, publisher, 서비스를 등록하려면 개별 노드가 master와 통신해야 합니다. 또한 데이터를 주고받을 수 있도록 서로 통신할 수 있어야 합니다. ROS 네트워크가 올바르게 설정되어 있지 않으면 데이터를 보낼 수는 있지만 받을 수는 없거나 그 반대가 될 수 있습니다.

아래 다이어그램의 ROS 네트워크에는 하나의 ROS master가 있고 이 master에 2개의 노드가 등록되어 있습니다. 각 노드는 ROS 네트워크 내의 다른 알려진 노드의 주소를 찾기 위해 master에 연결합니다. 각 노드가 상대 노드의 주소를 알게 되면 master의 관여 없이도 데이터 교환이 이루어질 수 있습니다.

다음 단계

관련 항목