[ROS 튜토리얼] 1.1.5 ROS의 노드(node)에 대한 이해

    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.04ROS 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이라는 이름의 노드는 /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가 다른 터미널에서 이미 동작중이어야 한다.)

    정상적으로 실행됐다면 아래와 같이 새로운 창이 하나 생성된다.

    여기서 생성되는 거북이 아이콘은 실행될 때 마다 매번 바뀐다. 이 거북이 모델들은 지금까지의 모든 ROS 버전들의 대표 마스코트라고 생각하면 된다.

     

    새로운 터미널에서 다음과 같이 입력한다 :

    rosnode list

    실행한 turtlesim 노드가 보인다.

    ROS의 강력한 기능들 중 하나는 커맨드-라인에서 노드의 이름을 재할당(reassign) 가능하다는 것이다.

     

    turtlesim 노드를 실행했던 터미널을 닫아(혹은 [ctrl]+C를 눌러 프로세스를 종료한다) 실행중인 노드를 종료한다. 다시 노드를 실행할 것인데, 이번에는 Remapping Argument를 사용하여 노드의 이름을 바꿔서 실행해볼 것이다.

    rosrun turtlesim turtlesim_node __name:=my_turtle

    이제 노드의 이름이 바뀌었는지 확인하기 위해 위에서 다루었던 rosnode list 명령어를 통해 확인해볼 수 있다.

    /my_turtle 이라는 이름의 노드가 실행중인 것을 확인할 수 있다.

    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 토픽의 구동 박식에 대해 다룰 것이다.

    댓글

    Designed by JB FACTORY