[Documentation] [TitleIndex] [WordIndex


The ros_control packages are a rewrite of the pr2_mechanism packages to make controllers generic to all robots beyond just the PR2.

ros control Diagram source in ros_control/documentation

The ros_control packages takes as input the joint state data from your robot's actuator's encoders and an input set point. It uses a generic control loop feedback mechanism, typically a PID controller, to control the output, typically effort, sent to your actuators. ros_control gets more complicated for physical mechanisms that do not have one-to-one mappings of joint positions, efforts, etc but these scenarios are accounted for using transmissions.

A high-level overview of the project can be found in the ROScon 2014 talk entitled ros_control: An overview (slides, video).

A short summary of CombinedRobotHW can be found in this ROScon 2016 talk.

Additional documentation is available at the Github Wiki


If you find this work useful please give credits to the authors by citing:

author = {Chitta, Sachin and Marder-Eppstein, Eitan and Meeussen, Wim and Pradeep, Vijay and Rodr{\'i}guez Tsouroukdissian, Adolfo  and Bohren, Jonathan and Coleman, David and Magyar, Bence and Raiola, Gennaro and L{\"u}dtke, Mathias and Fern{\'a}ndez Perdomo, Enrique},
title = {ros\_control: A generic and simple control framework for ROS},
journal = {The Journal of Open Source Software},
year = {2017},
doi = {10.21105/joss.00456},
URL = {http://www.theoj.org/joss-papers/joss.00456/10.21105.joss.00456.pdf}


A list of available controller plugins, contained in ros_controllers, as of this writing. You can of course create your own and are not limited to the below list.

Hardware Interfaces

Hardware Interfaces are used by ROS control in conjunction with one of the above ROS controllers to send and receive commands to hardware. A list of available Hardware Interfaces (via the Hardware Resource Manager) as of this writing. If the Hardware Interface for your robot doesn't already exist, you can of course create your own and are not limited to this list:

Also refer to the C++ API of the hardware_interface and the package documentation wiki.


A transmission is an element in your control pipeline that transforms efforts/flow variables such that their product - power - remains constant. A transmission interface implementation maps effort/flow variables to output effort/flow variables while preserving power.

Mechanical transmissions are power-preserving transformations, ie.

P_in        = P_out

F_in x V_in = F_out x V_out

where P, F and V stand for power, force and velocity. More generally, power is the product of an effort (eg. force, voltage) and a flow (eg. velocity, current) variable. For a simple mechanical reducer with ratio n, one has:

effort map: F_joint = F_actuator * n

flow map:   V_joint = V_actuator / n

From the above it can be seen that power remains constant between input and output. Complementary Wikipedia link (first part will do).

Transmission URDF Format

See URDF Transmissions.

Transmission Interfaces

Transmission-specific code (not robot-specific) implementing bidirectional (actuator <-> joint) effort and flow maps under a uniform interface shared across transmission types. This is hardware-interface-agnostic. A list of available transmission types as of this writing:



See here

Joint Limits

The joint_limits_interface contains data structures for representing joint limits, methods for populating them from common formats such as URDF and rosparam, and methods for enforcing limits on different kinds of joint commands.

The joint_limits_interface is not used by controllers themselves (it does not implement a HardwareInterface) but instead operates after the controllers have updated, in the write() method (or equivalent) of the robot abstraction. Enforcing limits will overwrite the commands set by the controllers, it does not operate on a separate raw data buffer.


Joint limits interface


See here

Additional Examples


On Ubuntu, you can install ros_control from debian packages (recommended):

sudo apt-get install ros-$ROS_DISTRO-ros-control ros-$ROS_DISTRO-ros-controllers

Or on Ubuntu and other platforms from source. To ease installing from source a rosinstall file is provided:

wstool init
wstool merge https://raw.github.com/ros-controls/ros_control/$ROS_DISTRO-devel/ros_control.rosinstall
wstool update
cd ..
rosdep install --from-paths . --ignore-src --rosdistro $ROS_DISTRO -y

Ideas and future perspectives

Not exactly a roadmap, but this page contains discussion and proposed solutions to allow ros_control to better accommodate more complex control setups and address shortcomings in the current implementation.

A ROS Control SIG exists with a mailing list for discussing ros_control issues and features. You are encouraged to join and help with ros_control's development!



Supported by ROSIN - ROS-Industrial Quality-Assured Robot Software Components.
More information: rosin-project.eu

EU Flag

This project has received funding from the European Union’s Horizon 2020
research and innovation programme under grant agreement No. 732287.

2024-07-13 14:37