Before we start writing code in ROS, we’re going to take a moment to introduce some of the key concepts that underlie the framework. ROS systems are comprised of a large number of independent programs that are constantly communicating with each other. In this chapter, we’ll discuss this architecture and look at the command-line tools that interact with it. We’ll also discuss the details of the naming schemes and namespaces used by ROS, and how these can be employed to promote reuse of your code.
One of the original “challenge problems” that motivated the design of ROS was fondly referred to as the “fetch an item” problem. Imagine a relatively large and complex robot with several cameras and laser scanners, a manipulator arm, and a wheeled base. In the “fetch an item” problem, the robot’s task is to navigate a typical home or office environment, find the requested item, and deliver it to the requested location. This task, like many robotics tasks, led to several observations about many robotics software applications, which became some of the design goals of ROS:
The application task can be decomposed into many independent subsystems, such as navigation, computer vision, grasping, and so on.
These subsystems can be used for other tasks, such as doing security patrols, cleaning, delivering mail, and so on.
With proper hardware and geometry abstraction layers, the vast majority of the application software can run on any robot.