The ROS Robot Package Structure
This article explains a good layout for a ROS-based robot’s code. This includes packages, meta-packages, launch and config.
Packages
Packages are the main unit of ROS code. They can contain nodes, launch files, and configuration files. A package can depend on other packages. A package is a collection of directories that define a specific type of functionality. The package is the unit of organization and distribution in ROS. These are the main types of packages:
- Library packages contain code that can be used by other packages.
- Node packages contain executable code that runs in the ROS ecosystem.
- Meta-packages contain only a package.xml file. They are used to group other packages together.
Package Structure
A package must have a specific structure. This is the basic structure of a ROS package:
my_package/
CMakeLists.txt
package.xml
launch/
my_node.launch
src/
my_node.cpp
include/
my_package/
my_node.h
config/
my_node.yaml
Meta-packages
Meta-packages are used to group several packages together. They are useful for organizing code in a large project. For example, you might have a meta-package for a robot that contains packages for the robot’s sensors, actuators, and controllers. The directory structure of a meta-package should look something like this:
meta_package/
meta_package/
CMakeLists.txt
package.xml
package1/
package2/
package3/
Robot Package Structure
A robot package should contain all the code needed to run the robot. This includes the robot’s sensors, actuators, controllers, and any other code needed to control the robot. A good way to manage all this code is separate it into different packages. The robot application is just the collection of all these packages and tracked using a meta-package. Here is an example of a robot package structure:
my_robot/
my_robot/
CMakeLists.txt
package.xml
my_robot_drivers/
sensor1/
sensor2/
my_robot_control/
my_robot_controllers/
my_robot_description/
my_robot_navigation/
Common robot specific packages
Most robots need a few common packages that are unique to the robot. These are some common robot-specific packages:
- description: This package contains the URDF and XACRO files that describe the robot’s physical structure.
- control: This package contains the code that controls the robot using the ros-control framework.
- controllers: This package contains custom controllers and launch files for controllers using the ros-control framework.
- navigation: This is a common package for robots that need to navigate in a 2D or 3D space. It contains the code for the robot’s navigation stack.
- moveit_config: This package contains the configuration files for the MoveIt! motion planning framework. This is used in robot manipulation applications.
- drivers: This package contains the code for the robot’s sensors and actuators. This is often a meta-package that contains several other packages, or references other packages as dependencies.
- gazebo: This package contains the Gazebo simulation files for the robot. This is useful for testing the robot in a simulated environment.