Erle Robotics GitBook

Understanding ROS Nodes

This tutorial introduces ROS graph concepts and discusses the use of roscore, rosnode, and 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)

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
... 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 [3003]
ROS_MASTER_URI=http://erlerobot:11311/

setting /run_id to e8b674a4-bff3-11d3-af73-4ed34f3752c7
process[rosout-1]: started with pid [3016]
started core service [/rosout]

rosnode

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.

The 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

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]

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

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 how ROS topics work. Also, feel free to press Ctrl-C to stop turtlesim_node.