#################################### ##FILL ME IN #################################### ## links to any required tutorials ## note.0= [[ROS/Tutorials/BuildingPackages|building a ROS package]] ## descriptive title for the tutorial ## title = Understanding ROS Nodes ## multi-line description to be displayed in search ## description = This tutorial introduces ROS graph concepts and discusses the use of [[roscore]], [[rosnode]], and [[rosrun]] commandline tools. ## the next tutorial description ## next = ## links to next tutorial ## next.0.link= [[ROS/Tutorials/UnderstandingTopics|Understanding ROS topics]] ## what level user is this tutorial for ## level= BeginnerCategory #################################### <<IncludeCSTemplate(TutorialCSHeaderTemplate)>> <<TOC(4)>> == Prerequisites == For this tutorial we'll use a lighweight simulator, to install it run the following command: {{{ $ sudo apt-get install ros-<distro>-ros-tutorials }}} Replace '<distro>' with the name of your ROS distribution (e.g. indigo, jade, kinetic, noetic) == 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 == A node really isn't much more than an executable file within a ROS package. ROS nodes use a ROS client library to communicate with other nodes. Nodes can publish or subscribe to a Topic. Nodes can also provide or use a Service. == Client Libraries == ROS client libraries allow nodes written in different programming languages to communicate: * rospy = python client library * roscpp = c++ client library == roscore == {{{roscore}}} is the first thing you should run when using ROS. Please run: {{{ $ roscore }}} You will see something similar to: . {{{ ... 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] }}} If `roscore` does not initialize, you probably have a network configuration issue. See [[http://www.ros.org/wiki/ROS/NetworkSetup#Single_machine_configuration|Network Setup - Single Machine Configuration]] If `roscore` does not initialize and sends a message about lack of permissions, probably the `~/.ros` folder is owned by `root`, change recursively the ownership of that folder with: {{{ $ sudo chown -R <your_username> ~/.ros }}} == Using rosnode == Open up a '''new terminal''', and let's use '''rosnode''' to see what running `roscore` did... Bear in mind to keep the previous terminal open either by opening a new tab or simply minimizing it. {{{#!wiki blue/solid '''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` displays information about the ROS nodes that are currently running. The `rosnode list` command lists these active nodes: {{{ $ rosnode list }}} . You will see: . {{{ /rosout }}} This showed us that there is only one node running: [[rosout]]. This is always running as it collects and logs nodes' debugging output. The `rosnode info` command returns information about a specific node. {{{ $ rosnode info /rosout }}} This gave us some more information about `rosout`, such as the fact that it publishes `/rosout_agg`. . {{{ ------------------------------------------------------------------------ Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/get_loggers * /rosout/set_logger_level contacting node http://machine_name:54614/ ... Pid: 5092 }}} Now, let's see some more nodes. For this, we're going to use `rosrun` to bring up another node. == Using rosrun == `rosrun` allows you to use the package name to directly run a node within a package (without having to know the package path). Usage: {{{ $ rosrun [package_name] [node_name] }}} So now we can run the turtlesim_node in the turtlesim package. Then, in a '''new terminal''': {{{ $ rosrun turtlesim turtlesim_node }}} You will see the turtlesim window: {{attachment:turtlesim.png}} '''NOTE:''' The turtle may look different in your turtlesim window. Don't worry about it - there are [[Distributions#Current_Distribution_Releases|many types of turtle]] and yours is a surprise! In a '''new terminal''': {{{ $ rosnode list }}} You will see something similar to: . {{{ /rosout /turtlesim }}} One powerful feature of ROS is that you can reassign Names from the command-line. 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 Arguments|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: . {{{ /my_turtle /rosout }}} {{{ #!wiki blue/solid 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 [[http://www.ros.org/wiki/ROS/NetworkSetup#Single_machine_configuration|Network Setup - Single Machine Configuration]]. You can try cleaning the rosnode list with: $ rosnode cleanup }}} We see our new `/my_turtle` node. Let's use another `rosnode` command, `ping`, to test that it's up: {{{ $ 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 == What was covered: * 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. Now that you understand how ROS nodes work, let's look at [[ROS/Tutorials/UnderstandingTopics|how ROS topics work]]. Also, feel free to press `Ctrl-C` to stop turtlesim_node. == Video Demonstration == Watch the video below to have more explanation on Python Nodes Communication and step by step guide . <<Youtube(rIPmFy_Ax2A)>> ## AUTOGENERATED DO NOT DELETE ## TutorialCategory ## ROSTutorialCategory ## TutorialTurtlesim