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
Contents
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
아래와 같은 창을 볼 수 있을 것 입니다:
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