The ROS Spotlight is a new technical blog series that explores the latest developments in the world of ROS by highlighting a new package each month. To kick things off, we will look at the new and improved driver package for Universal Robots’ UR3, UR5 and UR10 robot arms.
The need for a new Universal Robots driver
The ur_modern_driver package was developed by Thomas Timm Andersen, a robotics engineer from the Technical University of Denmark, as part of his PhD thesis on sensor-based real time control of robots. Thomas developed the package to address several shortcomings of the original driver which the robotics community had been struggling with for years. For example, with the previous driver, user interaction was very limited as you could not control the arm using the teach pendant while the driver was connected. In addition, high latency from when a command was sent until the arm moved resulted in unpredictable delays which made it difficult to perform dynamic tasks and sensor-based control.
The new driver package was designed to completely replace the original driver, while addressing these shortcomings, and improving performance and usability. “As I have used the UR robot arms extensively throughout my PhD, I thought it would be a good contribution to the community if I distilled some of the knowledge of the UR’s inner workings into an improved driver.” said Thomas.
How it works
The driver provides two interfaces; a joint velocity interface and a joint trajectory interface. The joint velocity interface takes the published velocities and directly forwards them to the robot controller for the fastest possible execution. This reduces latency and allows for much easier programming of dynamic tasks. The trajectory interface is an actionlib interface, which receives goals and verifies that the trajectory is valid. If the trajectory is good, the driver does cubic interpolation between the trajectory goals and transmits the intermittent joint position to a custom script running on the controller.
The custom script is based on the script used in the original ur_driver, although trimmed down significantly. It has a communication thread that constantly reads data from the socket and updates a global variable with the latest target, and a control thread which reads the global variables and updates the controller setpoint. All of this makes it possible to send new positions much faster than the frequency of the controller.
Completely written in C++ instead of Python, the new driver provides full support for ros_control and is much better at handling exceptions.
The driver is compatible with Universal Robots three robots: the UR3, UR5 and UR10 – with all the released firmware version (1.6 up to 3.2).