Understanding ROS Nodes
This tutorial introduces ROS graph concepts and discusses the use of
rosrun commandline tools.
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)
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.
ROS client libraries allow nodes written in different programming languages to communicate:
- rospy = python client library
- roscpp = c++ client library
roscore is the first thing you should run when using ROS.
roscore ... logging to /root/.ros/log/e8b674a4-bff3-11d3-af73-4ed34f3752c7/roslaunch-erlerobot-2990.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://erlerobot:59324/ ros_comm version 1.9.44 SUMMARY ======== PARAMETERS * /rosdistro * /rosversion NODES auto-starting new master process[master]: started with pid  ROS_MASTER_URI=http://erlerobot:11311/ setting /run_id to e8b674a4-bff3-11d3-af73-4ed34f3752c7 process[rosout-1]: started with pid  started core service [/rosout]
rosnode displays information about the ROS nodes that are currently running. The
rosnode list command lists these active nodes:
root@erlerobot:~# rosnode list /rosout
This showed us that there is only one node running: rosout. This is always running as it collects and logs nodes' debugging output.
rosnode info command returns information about a specific node.
root@erlerobot:~# rosnode info /rosout -------------------------------------------------------------------------------- Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/set_logger_level * /rosout/get_loggers contacting node http://erlerobot:49274/ ... Pid: 3016
Now, let's see some more nodes. For this, we're going to use rosrun to bring up another node.
rosrun allows you to use the package name to directly run a node within a package (without having to know the package path).
$ rosrun [package_name] [node_name]
In a new terminal:
root@erlerobot:~# rosrun autopilot_bridge mavlink.py --device /dev/ttyO4 --baudrate 115200 Starting mavlink <-> ROS interface over the following link: device: /dev/ttyO4 baudrate: 115200 Waiting for AP heartbeat
In another terminal:
root@erlerobot:~# rosnode list /autopilot /rosout
One powerful feature of ROS is that you can reassign Names from the command-line.
Go back to the rosrun autopilot_bridge terminal and use ctrl-C (there seems to be a problem with this node so you might need to open a new terminal). Now let's re-run it, but this time use a Remapping Argument to change the node's name:
root@erlerobot:~# rosrun autopilot_bridge mavlink.py --device /dev/ttyO4 --baudrate 115200 __name:=my_autopilot Starting mavlink <-> ROS interface over the following link: device: /dev/ttyO4 baudrate: 115200 Waiting for AP heartbeat
Now, if we go back and use rosnode list:
root@erlerobot:~# rosnode list /my_autopilot /rosout
Let's use another rosnode command, ping, to test that it's up:
root@erlerobot:~# rosnode ping my_autopilot rosnode: node is [/my_autopilot] pinging /my_autopilot with a timeout of 3.0s xmlrpc reply from http://erlerobot:39540/ time=15.213966ms xmlrpc reply from http://erlerobot:39540/ time=13.329983ms xmlrpc reply from http://erlerobot:39540/ time=12.695074ms xmlrpc reply from http://erlerobot:39540/ time=13.059974ms xmlrpc reply from http://erlerobot:39540/ time=12.760997ms xmlrpc reply from http://erlerobot:39540/ time=12.681007ms ^Cping average: 13.290167ms
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 how ROS topics work. Also, feel free to press Ctrl-C to stop turtlesim_node.