Tech Story/QuadCopter ROS

ROS(Robot OS)란?

슈퍼맨짱 2018. 4. 4. 13:29

ROS(Robot OS)란?


출처 : ROS History(http://www.slideshare.net/yoonseokpyo/20160406-ros-1-for)


ROS에 대해서는 오로카 홈페이지에 있는 내용을 토대로 정리했습니다.
http://cafe.naver.com/openrt/2468
 
ROS의 핵심은 노드간의 메세지 통신입니다. 이런 노드간의 메세지 통신에는 접속이 필요하며, 노드간의 접속을 관리하는게 마스터입니다. 

· 마스터 역할 : 노드의 이름, 토픽, 서비스의 이름, URI 주소와 포트, 매개변수 등의 네임 서버

노드는 생성과 동시에 마스터에 자신의 정보를 등록, 다른 노드가 마스터를 통해 접속하려는 노드의 정보를 마스터로부터 획득하게 됩니다.  

[ 마스터, 노드, 토픽, 서비스, 메세지 흐름도 ]


◆ 마스터 구동

"roscore"라는 실행 명령어로 로스 마스터는 구동되며, XMLRPC으로 서버를 구동하게 됩니다.

XMLRPC통신방식은 위키(https://ko.wikipedia.org/wiki/XML-RPC에서 확인하시면 됩니다


마스터노드# roscore 


마스터는 노드로부터 4가지의 정보를 받습니다. 노드의 이름, 토픽 or 서비스의 이름, 메시지 타입, URI 주소 or 포트입니다


[ 마스터구동 및 정보등록 ]



◆ 구독자노드 구동

"rosrun" 및 "roslaunch" 라는 실행 명령어로 구동됩니다. 


구독자노드# rosrun
구독자노드# roslaunch



구독자 노드는 구동과 함께 마스터에 자신의 구독자노드이름, 토픽이름, 메시지형태, URI 주소 및 포트를 등록합니다


[ 구독자 노드 구동 및 마스터노드에 정보등록 ]



◆ 발행자 노드 구동

"rosrun" 및 "roslaunch" 라는 실행 명령어로 구동됩니다


발행자노드# rosrun
발행자노드# roslaunch

발행자 노드는 구동과 함께 마스터에 자신의 발행자 노드이름, 토픽이름, 메시지형태, URI 주소 및 포트를 등록합니다.


[ 발행자 노드 구동 ]



◆ 발행자 정보 알림

마스터는 구독자 노드에게 새로운 발행자 정보를 알립니다


[ 발행자 정보 알림 ]



◆ 발행자 정보에 접속 요청

구독자 노드는 마스터로부터 받은 발행자 정보를 기반으로 발행자 노드에게 직접 접속 요청을 합니다. 이때에 전송하는 정보로는 자신의 구독자 노드 이름, 토픽이름, 메시지방식(TCPROS 또는 UDPROS)이 있는데, 간단히 TCPROS는 IP방식이며 UDPROS는 네임서버 방식으로 이해하면 됩니다


[ 발행자 정보에 TCPROS 접속 요청 ]



◆ 발행자 정보에 접속 응답

발행자 노드는 구독자노드에게 접속 응답에 해당되는 자신의 TCP 서버의 정보인 URI주소와 포트를 전송합니다.


[ 발행자 정보에 접속 응답 ]



◆ TCP 접속

구독자 노드는 TCPROS를 이용하여 발행자노드에 대한 클라이언트를 만들고, 발행자노드와 직접 연결합니다. (노드간의 통신 방식으로는 TCPROS라 하는 TCP/IP 방식을 이용합니다.)


[ TCP 접속 ]



◆ 메세지 전송

발행자 노드는 구독자 노드에게 정해진 메시지를 전송합니다. (노드간의 통신 방식으로는 TCPROS라 하는 TCP/IP 방식을 이용합니다.)


[ 메세지 전송 ]



◆ 서비스 요청 및 응답

서비스를 요청하는 서비스 클라이언트와 서비스 요청을 받고 정해진 프로세스를 수행 및 응답하는 서비스 서버로 구분됩니다. 서비스는 토픽과 달리 1회에 한해 접속, 서비스 요청, 서비스 응답이 수행되고 서로간의 접속을 끊습니다. 다시 필요한 경우 접속부터 다시 진행해야 해야 합니다.


[ 서비스 요청 및 응답 ]


◆ 샘플

본 내용은 모두의 연구소(http://www.modulabs.co.kr/board_GDCH80/3319) 에서 프로젝트로 진행했던 내용을 참고했습니다.  
ROS indigo설치 과정에서 사용했던 turtlesim 예제에서 이러한 관계를 살펴보면
· roscore명령어를 통해서 마스터를 작동시켜줍니다. 
· 이제 노드를 2개 실행시켜주는데 거북이가 움직이는 것을 화면으로 표시하는 turtlesim_node와 키보드로 조종하는 명령을 받아오는 turtle_teleop_key노드입니다. 
· 키보드를 통해서 turtlesim_node에서 turtle을 조종하려면 turtlesim_node가 turtle_teleop_key노드의 정보를 받아와서 화면으로 거북이가 이동하는 것을 표시해줘야합니다.  
· 처음 turtlesim_node를 rosrun으로 실행시켜주면 자신의 노드이름과 받고자 하는 토픽과 그 형식을 마스터에게 전달합니다. 
· 그리고 turtlesim_teleop_key를 rosrun으로 실행시켜주면 똑같이 자신의 이름과 발행하고자 하는 토픽과 그 형태를 마스터에게 전달합니다. 여기서 그 토픽은 /turtle1/cmd_vel입니다. cmd_vel란 키보드로 들어오는 명령을 뜻할 것입니다. 

· 마스터는 두 노드로부터 받아온 정보를 바탕으로 turtlesim_node에게 turtlesim_teleop_key의 정보를 전달하고 turtlesim_node는 turtlesim_teleop_key노드에게 XMLRPC통신으로 접속을 시도하고 상대방이 응답하면 그때부터 turtlesim_node는 키보드로부터 들어오는 command값을 받아서 자신의 노드안의 기능을 거쳐서 화면으로 표현합니다. 


[ ROS 구동 방식 샘플 ]



· turtlesim_node는 PX4가 되는 것이고 
· turtle_teleop_Key는 ROS가 되는 것입니다. 
· (iris drone의 SITL의 경우에 한정해서) 따라서 position control이나 trajectory control같은 경우는 해당 노드에서 사용자가 입력한 명령들을 토픽으로서 발행을 하고 PX4에서는 그러한 명령들을 받아서 실재로 모터를 돌리는 역할을 수행합니다. 
· 밑의 그림에서 네모상자는 토픽을 이야기하고 동그라미인 /mavros는 노드로서 mavlink라는 통신 프로토콜을 사용해서 그러한 토픽들을 ROS안의 node들로부터 받아와서(구독) PX4에 건내주는 역할을 합니다. 

· 또한 오른쪽에 있는 네모들에 해당하는 topic들을 PX4를 통해 가져와서 ROS에게 건내주는 역할(발행)도 합니다. 즉, PX4와의 통신에 사용되는 ROS안의 node인 것입니다.



<끝>.