Open-source project
UniversalRobots/Universal_Robots_ROS2_Driver avatar
UniversalRobots/Universal_Robots_ROS2_Driver

Universal_Robots_ROS2_Driver: one driver across five ROS 2 distributions

Universal Robots ROS2 driver supporting CB3 and e-Series

841 stars364 forksC++BSD-3-Clause

At a glance

What is it?
A C++ ROS 2 driver for Universal Robots arms, built on the vendor client library, with safety-aware motion features and a branch and release layout that tracks each ROS 2 distribution separately.
Who is it for?
Adopt Universal_Robots_ROS2_Driver when you have a Universal Robots arm on ROS 2 and need vendor behaviour such as speed scaling that respects the safety settings, or want the externalControl URCap path. Do not choose it for non-UR hardware, for ROS 1 stacks, or when you need motion planning, since that is what MoveIt2 and ur_moveit_config add on top.
Can I use it commercially?
Yes. BSD-3-Clause is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A driver for the whole UR arm line, not one controller generation

The scope claim in the project documentation is breadth of hardware rather than depth of features: the driver is compatible across the entire line of UR robots, from 3 kg payload to 30 kg payload, and covers robots with PolyScope X, PolyScope 5 or CB3 controllers. The repository description says the same thing in shorter form, supporting CB3 and e-Series.

That matters for anyone planning a lab or a cell with mixed equipment. A single driver codebase spanning the CB3 generation and the PolyScope 5 and PolyScope X generations means the same message interfaces and launch structure can serve an older arm and a newer one, and calibration data stays a first-class part of the setup rather than something bolted on for one model.

The intended user is a robotics engineer working in ROS 2 who needs to command a UR arm programmatically, either standalone or as part of a larger cell. The driver describes itself as one of the very first ROS 2 manipulator drivers, and lists decreased latency, improved security and more flexible middleware configuration as benefits that ROS 2 itself brings to that class of driver.

The real work happens in the client library underneath

The architecture is layered, and the documentation names the layer below. This driver is developed on top of Universal_Robots_Client_Library, which is a separate repository by the same vendor. The ROS 2 package is therefore the ROS-facing half of the stack: it takes UR concepts such as joint trajectories, speed scaling and dashboard state, and maps them onto ROS 2 interfaces and controller types.

Above that, the driver sits on the robot's own safety semantics. The documentation lists specific cobot functionalities it supports: pause at emergency stop, safeguard stop, automatic speed scaling to avoid violating the safety setting, and manual speed scaling from the teach pendant. These are not convenience wrappers. They mean a motion command issued from a ROS 2 node is bounded by the same protective envelope the operator set on the arm, and that the arm can halt in a defined way when the hardware reports an emergency or safeguard stop.

A third path exists for hybrid programming. The externalControl URCap makes it possible to include ROS 2 behaviours inside the robot program itself, so a program running on the controller can hand control out to the ROS 2 side. That gives integrators a way to split a task between the deterministic on-controller program and the ROS 2 logic without giving up either.

The packages you actually install

The repository is not one package but five, plus a metapackage. The top level of the repository lists ur/, ur_calibration/, ur_controllers/, ur_dashboard_msgs/, ur_moveit_config/ and ur_robot_driver/. The release status table reinforces the split, since it carries a separate CI badge per package for each distribution.

In practical terms:

bash
ur_robot_driver
ur_calibration
ur_controllers
ur_dashboard_msgs
ur_moveit_config

`ur_robot_driver` holds the launch files and the node that talks to the arm. `ur_calibration` deals with the calibration data UR arms require before motion is accurate. `ur_controllers` provides the ROS 2 controller layer that a motion client such as MoveIt2 drives. `ur_dashboard_msgs` publishes the state the robot dashboard exposes. `ur_moveit_config` is the configuration that ties the arm into MoveIt2, and it is the package that makes the difference between running the driver standalone and running it with a motion planner in front of it.

Because the pieces are separate, a cell that only wants to stream dashboard state does not have to run the whole stack, and a cell that wants MoveIt2 integration has a maintained config package rather than a hand written one.

One repository, five branches, one release day

The release status table is the part of the documentation with the most operational consequence. Each ROS 2 distribution has its own branch: humble, jazzy, kilted, lyrical and rolling, where main tracks rolling. Each cell of that table carries build badges pointing at binary build jobs for ur_calibration, ur_controllers, ur_dashboard_msgs, ur_moveit_config and ur_robot_driver on the matching Ubuntu and architecture combination, so the table tells you which packages are actually being built for which distribution.

The tag list explains how releases work. Three tags were published on the same day, 2026-09-14: 7.1.0, 6.1.0 and 4.9.0. Those are not three successive versions of one line but the versions of different maintained branches released together, which is the normal consequence of a branch per distribution model.

For a user, the practical rule is that you track the branch matching your distribution, not the highest tag number. A repository-level `git pull` on the wrong branch can move you off a version line that your binary distribution expects, and the documentation gives no instruction for switching between branches beyond the branch links in the table.

Launch files cover the standalone and MoveIt2 cases

The project states that the package contains launch files to get started using the driver as a standalone version or in combination with MoveIt2. That framing sets the shape of the first hour with the project: you bring up the arm with its own configuration, or you bring it up inside a MoveIt2 setup.

The documentation lives under the driver package rather than at the repository root, with the initial setup images referenced from ur_robot_driver/doc/installation/, and there is a resources README at ur_robot_driver/doc/resources/ that the top level points to for presentations and videos about the driver. Setup therefore involves supplying the robot's IP address and its calibration data before anything moves.

What the top level of the repository does not contain is a build recipe in the form of a shell script you can copy. The repository ships a .clang-format file, a .pre-commit-config.yaml, CONTRIBUTING.md and one .repos file per distribution, for example Universal_Robots_ROS2_Driver.rolling.repos, which is how the workspace is populated with the other vendor repositories. The documentation excerpt shown here does not spell out the individual build and launch commands, so treat the package documentation under ur_robot_driver/doc as the place where those live.

Standalone driver versus MoveIt2 on top

The most useful comparison inside this project is not against another vendor's driver but between the two ways the package is meant to be used, because the difference is one of control layers rather than of hardware support.

Standalone, the driver exposes the arm directly. You send commands through the ROS 2 controller layer and the driver's own safety behaviours apply. There is no planner in the loop, so every trajectory reaching the arm was produced by your code. This is the right shape for scripting, teleoperation bridging, fixture work and anything where the path is already known and you want no additional process deciding the motion.

With MoveIt2, the ur_moveit_config package supplies the configuration that lets a planner compute collision-aware paths and hand them to the driver through the same controller layer. The arm ends up in the same place either way, but the path now comes from a planner with a scene model and a kinematics configuration.

The practical distinction is who owns the motion. If your application needs per-joint trajectories or repeated path execution, standalone is enough and MoveIt2 adds a moving part you would have to configure. If your application needs collision checking, path planning, or a scene that reflects what is in the workspace, the MoveIt2 route is the one that gives you those, and this repository supplies the configuration bridge rather than making you write one.

BSD-3-Clause and the cost of running a multi-branch driver

The driver is released under BSD-3-Clause, with the licence text in the LICENSE file at the repository root. For a commercial deployment that is a permissive licence with no copyleft requirement on the surrounding cell, though redistributed copies need to keep the copyright notice and the conditions. The project documentation excerpt does not discuss patent or safety certification questions, and no such conclusion should be drawn from the licence alone.

On maintenance, the repository is not archived and the last push was on 2026-10-19, the day before this review, so the code is moving. Releases 7.1.0, 6.1.0 and 4.9.0 all landed on 2026-09-14, which suggests a coordinated release across the supported distribution branches rather than ad hoc tagging.

The upgrade cost is therefore a branch choice rather than a single version bump, and it grows with the number of distributions you support. A site running humble and rolling maintains two lines of the driver, each with its own tag, and a bug fix or a behaviour change has to be picked up per branch. The repository layout also carries ci_status.md, which is the natural place to see whether a given branch is green before you decide to move.

Editorial conclusion

Adopt Universal_Robots_ROS2_Driver when you have a Universal Robots arm on ROS 2 and need vendor behaviour such as speed scaling that respects the safety settings, or want the externalControl URCap path. Do not choose it for non-UR hardware, for ROS 1 stacks, or when you need motion planning, since that is what MoveIt2 and ur_moveit_config add on top. Verify first which branch matches your distribution, humble through rolling, and check the five packages in the repository layout against what your cell already provides.

Frequently asked questions

Which ROS 2 distributions does Universal_Robots_ROS2_Driver support?

The release status table lists humble, jazzy, kilted, lyrical and rolling, each with its own branch, with main tracking rolling. Every cell carries build badges for the five packages ur_calibration, ur_controllers, ur_dashboard_msgs, ur_moveit_config and ur_robot_driver.

Which Universal Robots arms work with this ROS 2 driver?

The project documentation states the driver is compatible across the entire UR line from 3 kg to 30 kg payload, including robots with PolyScope X, PolyScope 5 or CB3 controllers.

Does the driver respect the safety settings on the robot?

Yes. The documentation lists automatic speed scaling to avoid violating the safety setting, manual speed scaling from the teach pendant, pause at emergency stop and safeguard stop among the supported cobot functionalities.

Can ROS 2 code run inside a robot program with this driver?

The externalControl URCap makes it possible to include ROS 2 behaviours in the robot program, according to the project documentation.

What licence is the Universal Robots ROS 2 driver under?

BSD-3-Clause, with the licence text in the LICENSE file at the repository root. Redistributed copies must keep the copyright notice and the licence conditions.

Official sources

  1. Issues
  2. License: BSD-3-Clause
  3. README
  4. Releases
  5. UniversalRobots/Universal_Robots_ROS2_Driver on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/universalrobots-universal-robots-ros2-driver.svg)](https://hysenlabs.com/projects/universalrobots-universal-robots-ros2-driver)

Was this useful?