본문 바로가기

ROS (Robot Operating System)

[ROS: Robot Operating System] 2-1. ROS Node (노드)의 이해

ROS Node (노드)의 이해

 

지난 포스팅에서는 ROS 설치 방법 및 작동 테스트 확인에 대한 포스팅을 하였다. 

이번 포스팅에서는 ROS의 가장 기본적이고 중요한 개념들에 대해 튜토리얼을 진행하면서 공부를 해보려고 한다. 

ROS에서 사용되는 가장 기본적인 용어들은 따로 포스팅 해두었으니, 참고 하길 바란다. 

[ROS] 용어 정리: https://neosla.tistory.com/36?category=825336

 

ROS 공식 홈페이지에서는 ROS Tutorials을 제공한다. 

Beginner level과 Intermediate Level이 있으며, 이 Tutorial을 기반으로 Beginner level부터 시작하여 순차적으로 포스팅을 진행할 예정이다. 

[ROS] Tutorial: http://wiki.ros.org/ROS/Tutorials#Beginner_Level

 

1. Node (노드)의 개념 

- 노드는 계산을 수행하는 프로세스이다. 노드들은 그래프로 결합되어 있고, 스트리밍 Topic, RPC 서비스 (Remote Procedure Call), 파라미터 서버를 사용하여 다른 노드들과 통신을 한다. (Topic, RPC, 파라미터 등에 대한 용어는 추후에 자세히 포스팅 하겠다. )

- 이러한 노드들은 세분화 되어 작동되어야 하고, 로봇 제어 시스템에서는 대부분 많은 노드들로 구성이 되어 있다. 

- 예를 들어, 한 노드는 레이저 거리를 측정하고 제어하는 것으로 구성되며, 다른 하나는 로봇의 휠 모터를 제어하고, 다른 노드는 경로 계획을 수행함으로써 독립적인 프로세스로 구성되어 있다. 

- 노드가 생성될 때, 마스터 (Master)에 노드의 이름, Publisher 이름, Subscriber 이름, Topic 이름, 메세지 형태, 포트 등을 등록된다. 

- 노드는 

2. Node (노드)의 목적

- ROS에서 노드를 사용하면, 시스템이 충돌이 났을 경우에 개별 노드로 격리되므로 하나의 노드에서 결함이 발생하였을 때 다른 노드에 영향을 주지 않는다는 점이 가장 큰 이점이다. 

- 또한, 코드 복잡성이 줄어들게 된다. 

 

3. 클라이언트 라이브러리 (Client Libraries)

- ROS의 노드는 roscpp 또는 rospy 와 같은 ROS 클라이언트 라이브러리를 사용하여 작성된다. 

-> roscpp = C++ 클라이언트 라이브러리

-> rospy = python 클라이언트 라이브러리

 

4. 노드 생성 테스트

1) 아래와 같이, 먼저 roscore를 실행한다. roscore는 ROS의 기본 실행 명령이고, 패키지에서 하나의 노드를 실행하는데 사용된다. 

* roscore 및 설치 테스트에서 노드를 생성하는 방법에 대한 간략한 예시는 앞선 포스팅을 참고바란다 (https://neosla.tistory.com/37?category=825336).

 

roscore

2) 노드가 생성된 리스트를 확인하기 위해 rosnode list 를 입력하면, 아래와 같이 /rosout 만 출력되며, 노드가 생성된 그래프를 확인하기 위해 rosrun rqt_graph rqt_graph 를 입력한다. 

- 현재는 아무런 노드를 생성하지 않았기 때문에 빈 화면이 표시된다. 

 

3) 특정 노드의 정도를 확인하기 위해 rosnode node /rosout 을 입력하면, 아래와 같이

- rosnode ping, rosnode list, rosnode info, rosnode machine, rosnode kill, rosnode cleanup 의 명령에 대한 설명이 제시된다. rosnode info로 /rosout 노드에 대한 정보를 불러온다. 

 

rosnode node /rosout

rosnode info /rosout

4) 터틀심 생성

- 지난 포스팅에서 터틀심을 화면에 노출시키고, 키보드로 조정하는 테스트를 진행했었다. 이번 포스팅에서도 같은 예제로 노드의 개념을 이해해보려고 한다. 

- turtlesim_node는 ROS의 개념을 설명하기 위한 간단한 시뮬레이터이다. 

- turtlesim 패키지 안에 tutlesim_node와 turtle_teleop_key 등과 같은 파일이 포함되어 있다. 

- 노드를 생성하고자 할때, rosrun 패키지명 파일명 순으로 입력하면 된다. 

- 새로운 터미널을 열고,  거북이를 만든다 (이전 포스팅 참고).

rosrun tutlesim tutlesim_node

rosrun tutlesim tutlesim_teleop_key

- 다시 새로운 터미널을 열고, 노드 간의 그래프 확인 

rosrun rqt_graph rqt_graph

 

- 위의 그림처럼, 화면에 나타난 거북이 (노드 1), 키보드 방향키에 따라 움직이는 거북이 (노드 2)로 구성되어 있다. 

- 여기서 화면에 나타난 거북이 (노드 1)은 /tutlesim 이 되는 것이고, 키보드 방향키에 따라 움직이는 거북이 (노드 2)는 /teleop_turtle에 해당되는 것이다. (노드 1, 노드 2에 대한 명칭은 필자가 임의로 지정한 노드 인덱스이다. )

- /teleop_turtle (노드 2)은 "/turtle1/cmd_vel" 이라는 topic (topic에 대한 자세한 설명은 다음 포스팅에 이어진다.)을 /turtlesim (노드 1)에 전달하므로, /teleop_turtle (노드 2)은 publisher (pub) 가 된다. 

- 반대로, /turtlesim (노드1)은 topic을 받고 있으므로, subscriber (sub) 가 된다. 

 

5) 노드 정보 불러오기

-  rosnode info 노드명 을 이용하여 노드의 정보를 불러와보자. 

- 아래는 /turtlesim (노드 1) 에 대한 정보를 불러온 화면이다. 

- Subscription (sub)으로 /tutle1/cmd_vel에 대한  topic을 받고 있는 것을 확인할 수 있다. 

 

- 아래는 /teleop_turtle (노드 2) 에 대한 정보를 불러온 화면이다. 

- Publication (pub)으로 /turtle1/cmd_verl 을 전달하고 있는 것을 확인할 수 있다. 

- Subscription (sub)으로는 현재 아무런 topic (None)도 받지 않고 있다.