Python for Robotics: ROS

Robotics has become a popular and rapidly growing field in recent years, with applications ranging from industry to entertainment. To develop robotic systems, it’s essential to have a robust and flexible framework to manage communication and control. One such widely-used framework is the Robot Operating System (ROS). In this article, we’ll dive deep into ROS and explore how Python plays a vital role in its functionality.

Introduction to Robotics and ROS

Robotics is a multidisciplinary field that combines computer science, mechanical engineering, and electrical engineering to design, construct, and operate robots. With the increasing complexity of robotic systems, there is a growing need for a standardized framework to develop and manage robotic software.

The Robot Operating System (ROS) is a flexible framework that provides a collection of tools, libraries, and conventions for creating robot software. It is not an operating system in the traditional sense but rather a meta-operating system that runs on top of an existing operating system, such as Linux or Windows. ROS allows developers to focus on the high-level behaviors of robots instead of low-level hardware and software details.

Python is a popular choice for working with ROS due to its readability, extensive library support, and ease of use. This article will cover the basics of using Python with ROS and provide examples to help you get started with your own robotic projects.

Setting Up the Environment

Before diving into ROS and Python, ensure that you have a compatible operating system and Python installed on your machine. ROS currently supports Ubuntu Linux and requires Python 2.7 for ROS 1.x or Python 3.x for ROS 2.x. If you don’t have Python, download it from the official Python website.

Once you have the correct Python version installed, follow the ROS installation instructions for your operating system, which can be found on the official ROS website.

After installing ROS, ensure that you have the necessary Python packages for ROS by running the following command:

pip install -U rosinstall rosinstall_generator wstool rosdep

Creating a ROS Workspace

A ROS workspace is a directory where you can store your ROS projects and their associated files. To create a new ROS workspace, open a terminal and run the following commands:

mkdir -p ~/ros_workspace/src
cd ~/ros_workspace
source devel/setup.bash

These commands create a new directory called ros_workspace in your home directory, with a src subdirectory for storing your ROS packages. The catkin_make command initializes the workspace and the source command sets up the environment for the workspace.

ROS Nodes and Topics

In ROS, a node is a process that performs computation, such as reading sensor data or controlling a motor. Nodes communicate with each other by sending and receiving messages over topics. A topic is a named channel through which nodes can exchange messages. Each topic has a specific message type, such as an integer, a string, or a custom data structure.

To view a list of currently running nodes and the topics they are publishing or subscribing to, use the rosnode and rostopic command-line tools:

rosnode list
rostopic list

Writing a Simple Python ROS Node

To create a new Python ROS node, first, create a new package in your ROS workspace’s src directory:

cd ~/ros_workspace/src
catkin_create_pkg my_python_node rospy

This command creates a new package named my_python_node with a dependency on the rospy library, which is the Python library for ROS.

Next, navigate to the package directory and create a new Python script, e.g., In this file, you can write a simple ROS node with the following code:

#!/usr/bin/env python

import rospy

def main():
    rate = rospy.Rate(1)  # 1 Hz

    while not rospy.is_shutdown():
        rospy.loginfo("Hello, ROS!")

if __name__ == "__main__":
    except rospy.ROSInterruptException:

This script defines a simple node that logs a “Hello, ROS!” message once per second. To make the script executable, run the following command in your terminal:

chmod +x

Now you can run the node with the following command:

rosrun my_python_node

You should see the “Hello, ROS!” message printed to your terminal once per second.

Working with ROS Messages

ROS messages are the data structures exchanged between nodes over topics. There are many predefined message types in ROS, such as strings, integers, and more complex structures like images and point clouds. You can also create your own custom messages, which will be covered in the next section.

To work with ROS messages in Python, you need to import the appropriate message type from the relevant package. For example, to use the String message type from the std_msgs package, you would import it like this:

from std_msgs.msg import String

To create a new publisher that sends messages on a topic, use the rospy.Publisher class:

publisher = rospy.Publisher("my_topic", String, queue_size=10)

This creates a new publisher that will send String messages on the “my_topic” topic. The queue_size parameter specifies the maximum number of messages that can be buffered before new messages are dropped.

To send a message, create a new instance of the message type and set its data, then call the publish method of the publisher:

msg = String() = "Hello, world!"

To receive messages on a topic, create a subscriber using the rospy.Subscriber class:

def callback(msg):
    rospy.loginfo("Received: %s",

subscriber = rospy.Subscriber("my_topic", String, callback)

This creates a new subscriber that listens for String messages on the “my_topic” topic and calls the callback function when a message is received.

Creating Custom Messages

To create a custom message type, first create a new directory named msg in your package:

mkdir my_python_node/msg

Then, create a new file with the .msg extension in the msg directory, e.g., MyCustomMessage.msg. In this file, define your custom message using the ROS message format, which consists of a list of field names and their corresponding types, one per line. For example, a custom message with a string and an integer field could be defined like this:

string my_string_field
int32 my_int_field

Next, modify your package’s CMakeLists.txt and package.xml files to include the custom message as described in the official ROS documentation.

Finally, run catkin_make in your workspace to generate the Python message module. You can now import your custom message type in your Python scripts:

from my_python_node.msg import MyCustomMessage

ROS Services

In addition to topics, ROS provides services for request-response communication between nodes. A service consists of a pair of messages, one for the request and one for the response. To create a service, you need to define its message types and implement a service handler function.

For more information on creating and using ROS services in Python, refer to the official ROS tutorial.


In this article, we explored the basics of using Python with the Robot Operating System (ROS) to create robotic applications. We covered setting up the environment, creating a ROS workspace, working with nodes and topics, using messages, and creating custom messages. With this foundation, you can start building your own robotic projects and exploring more advanced features of ROS and Python.