[ROS 튜토리얼] 1.1.5 ROS의 노드(node)에 대한 이해
- 취미/ROS
- 2021. 3. 31.
Note: 이 튜토리얼은 이전의 building a ROS package튜토리얼을 학습했다고 가정한 후 작성된 튜토리얼이다.
이 튜토리얼에 관련된 문제 및 질문은answers.ros.org에서 확인할 것. 질문 작성시, 이 튜토리얼 페이지에 대한 링크, OS & ROS 버전 및 적절한 태그를 추가할 것.
Understanding ROS Nodes
- Description : 이 튜토리얼은 ROS graph에 대해 소개하고 커맨드라인 툴인 roscore, rosnode, rosrun의 사용법에 대해 다룰 것이다.
- Tutorial Level : BEGINNER
- Next Tutorial : Understanding ROS topics
1. Prerequisites
이 튜토리얼에서는 가벼운 시뮬레이터를 하나 설치하여 사용할 것이기 때문에 아래 명령어를 통해 시뮬레이터를 설치한다.
sudo apt-get install ros-<distro>-ros-tutorials
자리에 본인의 ROS 배포판 버전을 적어 넣는다. 나는 Ubuntu 18.04에 ROS Melodic을 사용하기 때문에 다음과 같이 명령어를 입력하였다.
sudo apt-get install ros-melodic-ros-tutorials
2. Quick Overview of Graph Concepts
- 노드(Node) : 여기서 노드를 'executable'이라고 설명하고 있다. 즉, 실행 가능한 최소 단위의 프로세스를 의미하며 ROS를 통해 다른 노드들과 통신한다.
- 메시지(Message) : 토픽(topic)을 게시(publish) 및 구독(subscribe)할 때 사용되는 ROS의 자료형(data type)이다. ROS에서는 노드끼리 서로 토픽에 메시지를 발행하며 통신을 주고 받는다.
- 토픽(topic) : 노드들은 토픽에 메시지를 게시 및 구독하여 메시지를 주고받을 수 있다.
- 마스터(master) : ROS 시스템 내에 존재하는 노드들에게 naming 및 registration 서비스를 제공한다.
- rosout : ROS의 콘솔 로그 리포팅(console log reporting) 메커니즘으로, 일종의 로깅 기능을 제공하는 노드라고 생각하면 된다.
- roscore : ROS 기반 시스템에서 전제 조건으로 여겨지는 일부 노드와 프로그램의 집합으로, '마스터 + rosout + 파라미터 서버'가 합쳐진 개념이라고 볼 수 있다. 노드간 통신을 위해 마스터가 브로커 역할을 해야하는데 이 master를 구동시키는 것이 roscore이고, rosout 노드도 실행시켜 통신상의 모든 메시지를 로깅한다.
3. Nodes
사실상 노드는 ROS 패키지 내의 실행 파일들보다 많지 않다. ROS의 노드는 ROS client 라이브러리를 사용하여 다른 노드들과 통신한다. 노드는 토픽을 게시 혹은 구독하며 서비스(service)를 제공하거나 사용하기도 한다.
4. Client Libraries
ROS client 라이브러리는 다음과 같이 서로 다른 프로그래밍 언어로 작성된 노드가 통신할 수 있게끔 해준다.
- rospy : python client library
- roscpp = C++ client library
5. roscore
roscore
는 ROS를 사용할때 가장 먼저 실행해줘야 하는 프로그램이다. 다음과 같이 실행시킨다.
roscore
아래는 roscore
의 실행 결과다.
conceptbug95@ubuntu-linux-ongoing:~$ roscore
... logging to /home/conceptbug95/.ros/log/46b7a6b8-91c4-11eb-9b75-001c42771fb2/roslaunch-ubuntu-linux-ongoing-2760.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://localhost:43839/
ros_comm version 1.14.10
SUMMARY
========
PARAMETERS
* /rosdistro: melodic
* /rosversion: 1.14.10
NODES
auto-starting new master
process[master]: started with pid [2774]
ROS_MASTER_URI=http://localhost:11311/
setting /run_id to 46b7a6b8-91c4-11eb-9b75-001c42771fb2
process[rosout-1]: started with pid [2785]
started core service [/rosout]
roscore
가 실행되지 않는다면, 아마 네트워크 구성에 문제가 있을 확률이 높다. 다음을 참고한다 : Network Setup - Single Machine Configuration
만약 roscore
가 실행되지 않고 권한(permission) 부재에 관련된 메시지를 내보내면, home
디렉토리의 .ros
폴더에 대한 접근 권한이 root 계정으로 잠겨있기 때문일 수 있다. 다음과 같이 디렉토리 권한을 바꿀 수 있다.
sudo chown -R <your_username> ~/.ros
6. Using rosnode
roscore
가 구동중인 터미널은 그대로 둔 채로(터미널을 닫으면 roscore
가 종료됨), 새로운 터미널을 열고 rosnode
명령을 사용하여 roscore
가 무엇을 구동시키는지 살펴볼 것이다.
Note : 터미널을 새로 열 때, 쉘 환경이 초기화되고 .bashrc 파일이 다시 소싱된다. rosnode와 같은 명령어를 실행하는데에 문제가 발생한다면, .bashrc 파일에 적용하고자 하는 환경 설정을 입력하거나 파일을 일일이 소싱해야 한다. |
rosnode
를 사용하여 현재 사용중인 ROS 노드를에 대한 정보를 볼 수 있다. 터미널에 다음과 같이 인자없이 rosnode
를 입력하면 rosnode
명령어의 사용법에 대해 알려준다.
이들 중 rosnode list
명령을 사용하면 현재 구동중인 모든 노드를 목록(list)으로 보여준다.
지금은 roscore
만 구동시킨 상태이기 때문에 roscore
에 의해 실행된 /rosout
노드만 출력되는 것을 볼 수 있다. 이 /rosout
노드는 위의 오버뷰에서 잠깐 언급했듯이 이 ROS Master가 관리하는 모든 노드의 디버깅 출력을 수집하여 기록하는 노드다.
rosnode info
명령어는 특정 노드의 정보를 알고자할 때 사용된다. 다음과 같이 사용할 수 있다.
rosnode info /rosout
이렇게 본인이 알고자 하는 노드의 이름을 호출하여 정보를 알아낼 수 있다. 위의 출력을 보면 /rosout
이라는 이름의 노드는 /rosout_agg
라는 토픽을 발행(publish)중이라는 것을 알 수 있다.
참고로 아래는 rosout_agg
토픽에 발행되는 메시지인 rosgraph_msgs/Log.msg
파일의 정보다.
http://docs.ros.org/en/api/rosgraph_msgs/html/msg/Log.html
##
## Severity level constants
##
byte DEBUG=1 #debug level
byte INFO=2 #general level
byte WARN=4 #warning level
byte ERROR=8 #error level
byte FATAL=16 #fatal/critical level
##
## Fields
##
Header header
byte level
string name # name of the node
string msg # message
string file # file the message came from
string function # function the message came from
uint32 line # line the message came from
string[] topics # topic names that the node publishes
byte DEBUG=1
byte INFO=2
byte WARN=4
byte ERROR=8
byte FATAL=16
std_msgs/Header header
byte level
string name
string msg
string file
string function
uint32 line
string[] topics
7. Using rosrun
ROS 설치 단계에서 ROS가 제대로 설치 되었는지 확인하는 과정으로 turtlesim
시뮬레이션을 수행했었다. 해당 단계는 turtlesim
패키지를 통한 rosrun
사용법에 대해 다룬다.
rosrun
명령어는 패키지의 경로를 알 필요 없이 실행하고자 하는 노드의 이름을 직접 사용하여 패키지 내부의 노드를 바로 실행할 수 있다.
사용법 :
rosrun [package_name] [node_name]
turtlesim
패키지의 turtlesim_node
를 실행해 볼 것이다. 새로운 터미널을 열어 다음과 같이 입력한다 :
rosrun turtlesim turtlesim_node
(당연히 roscore
가 다른 터미널에서 이미 동작중이어야 한다.)
정상적으로 실행됐다면 아래와 같이 새로운 창이 하나 생성된다.
새로운 터미널에서 다음과 같이 입력한다 :
rosnode list
ROS의 강력한 기능들 중 하나는 커맨드-라인에서 노드의 이름을 재할당(reassign) 가능하다는 것이다.
turtlesim
노드를 실행했던 터미널을 닫아(혹은 [ctrl]+C를 눌러 프로세스를 종료한다) 실행중인 노드를 종료한다. 다시 노드를 실행할 것인데, 이번에는 Remapping Argument를 사용하여 노드의 이름을 바꿔서 실행해볼 것이다.
rosrun turtlesim turtlesim_node __name:=my_turtle
이제 노드의 이름이 바뀌었는지 확인하기 위해 위에서 다루었던 rosnode list
명령어를 통해 확인해볼 수 있다.
Note : 만약 rosnode list를 실행했을 때 새로 바꾼 노드의 이름과 기존의 /turtlesim 노드가 모두 리스트되는 경우, 터미널을 닫지 않고 [ctrl]+C로 노드를 종료했거나 Network Setup - Single Machine Configuration에 설명된 대로 $ROS_HOSTNAME 환경 변수가 정의되지 않았다는 것을 의미한다. rosnode cleanup 명령어를 사용하여 rosnode list를 정리할 수 있다. |
마지막으로 rosnode
의 다른 명령어인 ping
을 사용해볼 것이다.
rosnode ping my_turtle
8. Review
다룬 내용:
roscore = ros + core |
master (provides name service for ROS) + rosout (stdout/stderr) + parameter server (parameter server will be introduced later) |
rosnode = ros + node |
ROS tool to get information about a node. |
rosrun = ros + run |
runs a node from a given package. |
ROS 노드의 구동 방식에 대해 알아보았으므로, 다음 튜토리얼에서는 ROS 토픽의 구동 박식에 대해 다룰 것이다.
'취미 > ROS' 카테고리의 다른 글
[ROS] Ubuntu 20.04 LTS에 ROS Noetic 설치하기 #1 (0) | 2022.10.27 |
---|---|
[ROS 튜토리얼] 1.1.6 ROS의 토픽(topic)에 대한 이해 (0) | 2021.05.30 |
[ROS 튜토리얼] 1.1.4 ROS 패키지 빌드하기 (0) | 2021.03.24 |
[ROS 튜토리얼] 1.1.3 패키지 생성하기 (0) | 2021.03.22 |
[ROS 튜토리얼] 1.1.2 ROS 파일 시스템 활용 방법 (0) | 2021.03.16 |