Launch the Turtlesim Robot Simulation in ROS

In this section, we will work with the turtlesim application. This application comes pre-installed with ROS and consists of a 2D simulation of a turtle. You can move the turtle around and do a lot of other cool stuff as described here at the turtlesim ROS Wiki page.

Turtlesim isn’t the most exciting application, but it is a popular tool for learning the basics of ROS before working with real robots. You can think of the turtle as an actual robot. All of the things you can do with this turtle, you can do with a real, physical robot.

15-turtlesim

You Will Need

In order to complete this tutorial, you will need:

Directions

Let’s run this program now with rospy, the Python library for ROS. 

Let’s launch turtlesim now. Open up a new terminal window, and type:

roscore

Open a new terminal tab, and launch the turtlesim application.

rosrun turtlesim turtlesim_node
launch-turtlesim

Let’s see the list of topics. Remember that a topic in ROS is a named bus (or channel) over which a node publishes messages for other nodes to receive.  Open a new terminal tab, and type:

rostopic list
17-rostopic-list

Now, up until now, the model that I have shown you of how ROS nodes communicate with each other is the ROS Topics model, in which a Publisher Node sends messages via a Topic to one or more registered Subscriber nodes. We worked with this model in the Hello World project in the previous section. This model looks like this:

ros-master-nodes

Notice that the flow of information between nodes is one-way, from Publisher to Subscriber. What do we do in a situation where we have a node that wants to request information from another node and receive an immediate reply? How is this two-way communication implemented in ROS? Request/reply in ROS is performed via ROS Services.

A ROS Service consists of a pair of messages: one for the request and one for the reply. A service-providing ROS node (i.e. Service Server) offers a service (e.g. read sensor data). A client node (i.e. Service Client) calls the service by sending a request message to the service provider. The client node then awaits the reply. Here is what the ROS Service model looks like:

ros-service-model

The ROS tutorials present a good explanation of when you would want to use the ROS Topic model and when you would want to use the ROS Service model.

Now that we understand what a ROS Service is, let’s see a list of all active services in our turtlesim application. Open a new terminal window and type:

rosservice list
18-rosservice-list

Let’s see a list of ROS parameters. Think of parameters as the global settings for our current ROS environment (e.g. things like the background color of the turtlesim screen, version of ROS we are using, etc.).

rosparam list
19-rosparam-list

OK, now that we have covered some more ROS terminology, let’s have some fun and make this turtle move around the blue window. In order to do that, I need to create another ROS node. I have to open up a new terminal tab and type this command:

rosrun turtlesim turtle_teleop_key
20-move-turtle

If you use the arrow keys on your keyboard from within the terminal where you typed the command above, you should see the turtle moving around the screen. Each time you press an arrow key, the teleop_turtle node publishes a message to the /turtle1/cmd_vel topic. turtlesim node is subscribed to that topic. It receives the message and moves the turtle. 

21-move-turtle-2

Open a new terminal window and see a list of active nodes using this command:

rosnode list
23-active-nodes
setup-with-turtle

Here is the block diagram of our application:

teleop-turtle

Now draw a square with turtlesim. Press Ctrl+C to stop the simulation. Close all terminal windows, and start a new terminal window. Type:

roscore
rosrun turtlesim turtlesim_node 
rosrun turtlesim draw_square

The robot will go around and around along a square-shaped path.

24-draw-square
25-draw-square-2

To reset the simulator, type:

rosservice call /reset

Then type:

rosrun turtlesim draw_square

And now you have seen how to launch and run Turtlesim in ROS!

Create a Hello World Project in ROS

In this section, we will develop our first ROS application. We are not going to do anything fancy here…just a basic “Hello World” project to get our feet wet with ROS. But before we get started on that, let’s cover some basic ROS terminology on a high level.

You Will Need

In order to complete this tutorial, you will need:

Directions

Our goal in this project is to get two pieces of ROS software (called nodes) to talk to each other. You can think of nodes as small single-purpose programs within a larger robotic system. One way nodes communicate with each other is by using messages. These messages are passed via channels called topics.

Nodes that send data are known as publisher nodes, and nodes that receive data are known as subscriber nodes. The node that keeps track (i.e. a register) of which nodes are publisher nodes and which nodes are subscriber nodes is called the ROS Master. Without the ROS Master, nodes would not be able to communicate with each other.

Nodes that are interested in a particular piece of data subscribe to the relevant topic; nodes that generate data publish to the relevant topic. There can be multiple publishers and subscribers to a topic. You can think of topics like a middle man between publishers (nodes that generate data) and subscribers (nodes that receive data). The communication is anonymous, so nodes do not know what nodes they are sending data to/receiving data from.

Here is a basic high-level diagram of the ROS Topic communication architecture I described above.

ros_master_1

A good analogy is to think of YouTube (or even other social media sites like Twitter or Instagram). YouTubers (publisher nodes) publish videos (messages) to a channel (topic), and you (subscriber node) can subscribe to that channel (topic) so that you receive all the videos (messages) on that channel (topic). YouTube (ROS Master) keeps track of who is a publisher and who is a subscriber. One thing to keep in mind is that (in contrast to YouTube) in ROS there can be multiple publishers to the same topic, and publishers and subscribers don’t know each other.

In the robotic world, we need different parts of a robot to send data to each other so that the robot can sense the world, process what it sees, and then act on the world. For example, suppose we are working on a humanoid robot. We might have one small program (publisher node) responsible for reading sensor data from a camera mounted on the head of the robot. That program might send that data (i.e. message) via a topic called “vision scan” to another program (subscriber node) which is responsible for controlling the joint in the robot’s arm. Note that messages in ROS can be a variety of data types, including strings, floats, integers, etc.

So with that terminology under our belts, we are ready to get started on our Hello World project. Let’s develop an application that consists of two nodes: talker and listener. The talker node will publish a “Hello World” message to the /chatter topic. The listener will subscribe to the /chatter topic so that it can receive the “Hello World” message. Here is a diagram of what I described above.

ros_master_2

To launch ROS, open a new Linux terminal window and type the following command:

roscore
10-roscore-1

roscore is the main process that is responsible for managing everything in ROS. Anytime you are trying to run a program in ROS, roscore needs to be running. roscore ensures that nodes (i.e. programs you write in Python and C++) are able to communicate with each other.

Open up a new terminal window, and start the talker node.

rosrun roscpp_tutorials talker

You should see hello world messages repeatedly printing to the screen.

11-roscpp-tutorials-talker

Use this command on a new terminal tab (File -> New Tab) to see a list of current active topics.

rostopic list
12-rostopic

The topic of the hello world messages is /chatter.

Now let’s start the listener node. The listener node will subscribe to the /chatter topic so that it can receive the hello world messages published by talker.

Open up a new terminal tab and type:

rosrun roscpp_tutorials listener
13-listener-output

The listener “hears” hello world.

Now, let’s run the two nodes side-by-side just to see what that looks like. Open a new terminal tab and type:

roslaunch roscpp_tutorials talker_listener.launch
14-hello-world-input-output

The roslaunch command is useful when you want to launch multiple ROS nodes all at once.

To stop ROS, press this command on your keyboard:

Ctrl+C 

Then type the following command in the terminal to close the terminal.

exit

That’s it! Congrats! You have made your first ROS application.

How to Install ROS on Ubuntu Linux in 5 Minutes or Less

In this post, we will get started with ROS, the Robot Operating System. ROS is the most popular robot programming platform. The reason it is so popular is that it is free, open-source, and has a ton of pre-written code that you can use for your robotics project. Sure you could write everything from scratch, but why reinvent the wheel? ROS saves you time from having to write code for common robot capabilities like navigation, motion planning, path planning, perception, control, and manipulation. It also has a huge worldwide community.

You Will Need

In order to complete this tutorial, you will need:

Directions

The official steps for installing ROS are at this link at ROS.org, but I will walk you through the process below so that you can see what each step should look like.

As of the time of this writing, the latest version with long term support (LTS) of ROS is ROS Melodic Morenia. Select that option.

1-latest-version-of-ros

I am using Ubuntu, so I will click on the Ubuntu option, which will land me on this page.

2-select-your-platform

Click the 9 white dots at the bottom left of your screen.

3-nine-white-dots

Search for Software & Updates. Then click on it.

4-software-updates

Make sure main, universe, restricted, and multiverse are all checked. Then click Close.

5-all-checked

Now open up a new terminal window, and type (or copy and paste) the following command:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
6-sources-list

The command above sets your computer up to accept software from packages.ros.org. 

Now we need to set up the secure keys so that our system accepts what we are going to download. 

For the next step, update the package list on your system.

sudo apt update
8-update-package-list

Now type:

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
7-add-keys

Now do a full desktop install of ROS. At the time of this writing, the latest version is ROS Melodic Morenia. The command below installs all the software, tools, algorithms, and robot simulators for ROS. After you type the command and press Enter, press Y and hit Enter when asked if you want to continue. It will take a while to download all this stuff, so feel free to take a break while ROS downloads to your system.

sudo apt install ros-melodic-desktop-full

Now initialize rosdep. This is a tool that is required before you can use ROS.

sudo rosdep init
rosdep update

Set up the environment variables.

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

Note that anytime you want to see what environment variables ROS is using, you can type the following command:

export | grep ROS

This command will show you the ROS distribution you are using, the version of Python ROS is using, and a bunch of other stuff.

The two key variables are as follows:

  • ROS_MASTER_URI: Shows the URL where the roscore is in execution. This is often your own local computer.
  • ROS_PACKAGE_PATH: Shows the path on your computer where the ROS packages are.

Install some other tools that you will work with in ROS. After you type the command below, press Y and Enter to complete the download process.

sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential

Here is the last step of the installation process. Check which version of ROS you have installed. If you see your ROS version as the output, congratulations you have successfully installed ROS!

rosversion -d
9-check-ros-version

ROS has a lot of new vocabulary (e.g nodes, bags, topics). So before you start working with ROS, I recommend you bookmark (no need to read in detail) this page at the ROS Wiki which covers the new vocabulary associated with ROS. That way, when I mention a term you might not understand, you know where to look it up.