Note: This tutorial assumes that you have completed the previous tutorials: building a ROS package.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

ROS Node 이해하기

Description: 이 자습서는 ROS graph의 개념을 소개하고 roscore, rosnode, rosrun을 다루고 있습니다.

Tutorial Level: BEGINNER

Next Tutorial: Understanding ROS topics

Prerequisites

이 튜토리얼을 위해 가벼운 시뮬레이터를 사용할 예정이니 아래의 명령어를 통해 설치하기 바랍니다.

$ sudo apt-get install ros-<distro>-ros-tutorials

<distro>를 자신의 배포판 이름으로 대체하십시오. (e.g. hydro, groovy, electric, fuerte etc.)

Quick Overview of Graph Concepts

  • Nodes: A node is an executable that uses ROS to communicate with other nodes.

  • Messages: ROS data type used when subscribing or publishing to a topic.

  • Topics: Nodes can publish messages to a topic as well as subscribe to a topic to receive messages.

  • Master: Name service for ROS (i.e. helps nodes find each other)

  • rosout: ROS equivalent of stdout/stderr

  • roscore: Master + rosout + parameter server (parameter server will be introduced later)

Nodes

노드는 Rospackage안의 실행파일 보다 그렇게 많지 않습니다. Ros client 라이브러리를 통해 다른 Node로 통신을 합니다.

또한, Node는 구독(Subscribe) 및 발행을 할 수 있으며

Client Libraries

ROS client 라이브러리는 다른 언어로 짜인 Node간의 통신을 가능하게 합니다.

  • rospy = python client library
  • roscpp = c++ client library

roscore

roscore 실행은 ROS를 사용할 때 가장 먼저 해야하는 일입니다.

Please run:

$ roscore

아래와 비슷한 출력을 볼수 있습니다:

  • ... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.
    
    started roslaunch server http://machine_name:33919/
    ros_comm version 1.4.7
    
    SUMMARY
    ========
    
    PARAMETERS
     * /rosversion
     * /rosdistro
    
    NODES
    
    auto-starting new master
    process[master]: started with pid [13054]
    ROS_MASTER_URI=http://machine_name:11311/
    
    setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf
    process[rosout-1]: started with pid [13067]
    started core service [/rosout]

만약 roscore가 초기화 되지 않는다면, 네트워크 환경 설정 문제일 수 있습니다. 자세한 사항은 Network Setup - Single Machine Configuration

혹은 roscore가 실행되지 않고 Permission 메세지를 보낸다면, ~/.ros 폴더를 재귀적으로 관리자 권한으로 바꿔주십시오.

$ sudo chown -R <your_username> ~/.ros

Using rosnode

Open up a new terminal, and let's use rosnode to see what running roscore did...

roscore가 하는 일에 대해 알아보기 위해 터미널을 열고 rosnode 명령어를 사용해 봅시다.

Note: When opening a new terminal your environment is reset and your ~/.bashrc file is sourced. If you have trouble running commands like rosnode then you might need to add some environment setup files to your ~/.bashrc or manually re-source them.

rosnode는 현재 실행 중인 Node에 대한 정보를 보여줍니다.

rosnode list 명령어는 실행 중인 Node를 보여줍니다.

$ rosnode list
  • You will see:
  • /rosout

위는 rosout node 하나가 실행 중인 모습을 보여줍니다. rosout은 언제나 실행되고 있으며, node의 debugging 출력을 모으고 기록합니다.

rosnode info 명령어는 특별한 Node의 정보를 반환합니다.

$ rosnode info /rosout

아래는 rosout이 /rosout_agg을 발행하고 있는 정보를 보여줍니다.

  • ------------------------------------------------------------------------
    Node [/rosout]
    Publications:
     * /rosout_agg [rosgraph_msgs/Log]
    
    Subscriptions:
     * /rosout [unknown type]
    
    Services:
     * /rosout/set_logger_level
     * /rosout/get_loggers
    
    contacting node http://machine_name:54614/ ...
    Pid: 5092

그럼, 다른 Node에 대해 알아보기 위해 rosrun 에 대해 알아보겠습니다.

Using rosrun

rosrun은 package안의 node를 직접 실행 할 수 있게 해줍니다. (Package Path를 몰라도 됩니다.)

Usage:

$ rosrun [package_name] [node_name]

그러면 turtlesim package안의 turtlesim_node 노드를 사용해 봅시다.

새로운 터미널 창에서 아래와 같이 입력합니다:

$ rosrun turtlesim turtlesim_node

아래와 같은 창을 볼 수 있을 것 입니다:

  • turtlesim.png

NOTE: 거북이의 모습이 ROS 버전에 따라 다를 수 있습니다.many types of turtle.

In a new terminal:

$ rosnode list

You will see something similar to:

  • /rosout
    /turtlesim

ROS의 장점은 command-line을 통해 Node의 이름을 명명할 수 있다는 점입니다..

Close the turtlesim window to stop the node (or go back to the rosrun turtlesim terminal and use ctrl-C). Now let's re-run it, but this time use a Remapping Argument to change the node's name:

$ rosrun turtlesim turtlesim_node __name:=my_turtle

Now, if we go back and use rosnode list:

$ rosnode list
  • You will see something similar to:
  • /rosout
    /my_turtle

Note: If you still see /turtlesim in the list, it might mean that you stopped the node in the terminal using ctrl-C instead of closing the window, or that you don't have the $ROS_HOSTNAME environment variable defined as described in Network Setup - Single Machine Configuration. You can try cleaning the rosnode list with: $ rosnode cleanup

/my_turtle node를 확인 할 수 있습니다. 다음으로 rosnode 명령어의 ping을 사용해 봅시다.

$ rosnode ping my_turtle
  • rosnode: node is [/my_turtle]
    pinging /my_turtle with a timeout of 3.0s
    xmlrpc reply from http://aqy:42235/     time=1.152992ms
    xmlrpc reply from http://aqy:42235/     time=1.120090ms
    xmlrpc reply from http://aqy:42235/     time=1.700878ms
    xmlrpc reply from http://aqy:42235/     time=1.127958ms

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 node가 어떻게 동작되는지에 대해 알아 보았습니다.

다음 자습서로 이동합니다. how ROS topics work

Wiki: ko/ROS/Tutorials/UnderstandingNodes (last edited 2019-10-08 06:05:43 by Kang Wonjin)