ROS 네트워크에 연결하기
ROS 네트워크는 하나의 ROS master와 다수의 ROS 노드로 구성됩니다. ROS master는 모든 활성 ROS 엔터티를 추적하여 ROS 네트워크에서의 통신을 수행합니다. 각 노드가 네트워크 내의 나머지 노드들과 통신할 수 있으려면 ROS master에 등록되어야 합니다. MATLAB®에서 ROS master를 시작할 수도 있고, MATLAB 외부에서(예: 다른 컴퓨터에서) master를 시작할 수도 있습니다.
ROS로 작업할 때는 일반적으로 다음 단계를 따릅니다.
ROS 네트워크에 연결합니다. ROS 네트워크에 연결하려면 MATLAB에서 ROS master를 만들거나 기존 ROS master에 연결합니다. 두 경우 모두 MATLAB은 자체 ROS 노드(MATLAB 전역 노드라고 함)를 만들고 master에 등록합니다.
rosinit
함수가 이 프로세스를 관리합니다.데이터를 교환합니다. 연결되고 나면 MATLAB은 publisher, subscriber, 서비스를 통해 다른 ROS 노드와 데이터를 교환합니다.
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.44994 seconds. Initializing ROS master on http://172.20.147.47:56568. Initializing global node /matlab_global_node_68524 with NodeURI http://dcc300956glnxa64:32829/ and MasterURI http://localhost:56568.
MATLAB 외부의 ROS 노드가 이제 ROS 네트워크에 참여할 수 있습니다. 이러한 노드는 MATLAB 호스트 컴퓨터의 호스트 이름 또는 IP 주소를 사용하여 MATLAB의 ROS master에 연결될 수 있습니다.
rosshutdown
을 호출하여 ROS master와 전역 노드를 종료할 수 있습니다.
rosshutdown
Shutting down global node /matlab_global_node_68524 with NodeURI http://dcc300956glnxa64:32829/ and MasterURI http://localhost:56568. Shutting down ROS master on http://172.20.147.47:56568.
외부 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_HOSTNAME
과 ROS_IP
를 둘 다 설정할 필요는 없습니다. 둘 다 설정되어 있으면 ROS_HOSTNAME
이 우선합니다.
연결 확인하기
ROS 연결이 제대로 작동하려면 모든 노드가 master와 통신할 수 있어야 하며, 노드끼리도 서로 통신할 수 있어야 합니다. subscriber, publisher, 서비스를 등록하려면 개별 노드가 master와 통신해야 합니다. 또한 데이터를 주고받을 수 있도록 서로 통신할 수 있어야 합니다. ROS 네트워크가 올바르게 설정되어 있지 않으면 데이터를 보낼 수는 있지만 받을 수는 없거나 그 반대가 될 수 있습니다.
아래 다이어그램의 ROS 네트워크에는 하나의 ROS master가 있고 이 master에 2개의 노드가 등록되어 있습니다. 각 노드는 ROS 네트워크 내의 다른 알려진 노드의 주소를 찾기 위해 master에 연결합니다. 각 노드가 상대 노드의 주소를 알게 되면 master의 관여 없이도 데이터 교환이 이루어질 수 있습니다.
다음 단계
ROS의 publisher와 subscriber에 대해 알아보려면 ROS Publisher 및 ROS Subscriber를 사용해 데이터 교환하기 항목을 참조하십시오.