From f9ff255b49d58ef1addabba6842b0f9106cbc953 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Tue, 19 May 2026 14:12:57 +0000 Subject: [PATCH 1/5] Migrate tutorial packages to Lyrical --- .../config/combined_controllers.yaml | 79 +++---------------- .../launch/start_robots.launch.py | 19 ++++- .../my_dual_robot_cell_control/package.xml | 2 +- .../my_dual_robot_cell_controlled.urdf.xacro | 2 + my_robot_cell/doc/build_moveit_config.rst | 2 +- .../config/ros2_controllers.yaml | 14 ++-- .../my_robot_cell_control/package.xml | 3 +- .../urdf/my_robot_cell_controlled.urdf.xacro | 1 + .../config/moveit_controllers.yaml | 4 +- 9 files changed, 46 insertions(+), 80 deletions(-) diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml index 2468dfb..6034c08 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml +++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml @@ -24,23 +24,20 @@ controller_manager: alice_joint_trajectory_controller: type: joint_trajectory_controller/JointTrajectoryController - bob_trajectory_controller: + bob_joint_trajectory_controller: type: joint_trajectory_controller/JointTrajectoryController - alice_scaled_joint_trajectory_controller: - type: ur_controllers/ScaledJointTrajectoryController + alice_forward_velocity_controller: + type: forward_command_controller/ForwardCommandController - bob_scaled_joint_trajectory_controller: - type: ur_controllers/ScaledJointTrajectoryController - - forward_velocity_controller: - type: velocity_controllers/JointGroupVelocityController + bob_forward_velocity_controller: + type: forward_command_controller/ForwardCommandController alice_forward_position_controller: - type: position_controllers/JointGroupPositionController + type: forward_command_controller/ForwardCommandController bob_forward_position_controller: - type: position_controllers/JointGroupPositionController + type: forward_command_controller/ForwardCommandController alice_speed_scaling_state_broadcaster: @@ -114,6 +111,8 @@ alice_joint_trajectory_controller: alice_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } alice_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } alice_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } + speed_scaling: + state_interface: alice_speed_scaling/speed_scaling_factor bob_joint_trajectory_controller: ros__parameters: @@ -141,62 +140,8 @@ bob_joint_trajectory_controller: bob_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } bob_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } bob_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } - -alice_scaled_joint_trajectory_controller: - ros__parameters: - joints: - - alice_shoulder_pan_joint - - alice_shoulder_lift_joint - - alice_elbow_joint - - alice_wrist_1_joint - - alice_wrist_2_joint - - alice_wrist_3_joint - command_interfaces: - - position - state_interfaces: - - position - - velocity - state_publish_rate: 100.0 - action_monitor_rate: 20.0 - allow_partial_joints_goal: false - constraints: - stopped_velocity_tolerance: 0.2 - goal_time: 0.0 - alice_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } - alice_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } - alice_elbow_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } - alice_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } - speed_scaling_interface_name: alice_speed_scaling/speed_scaling_factor - -bob_scaled_joint_trajectory_controller: - ros__parameters: - joints: - - bob_shoulder_pan_joint - - bob_shoulder_lift_joint - - bob_elbow_joint - - bob_wrist_1_joint - - bob_wrist_2_joint - - bob_wrist_3_joint - command_interfaces: - - position - state_interfaces: - - position - - velocity - state_publish_rate: 100.0 - action_monitor_rate: 20.0 - allow_partial_joints_goal: false - constraints: - stopped_velocity_tolerance: 0.2 - goal_time: 0.0 - bob_shoulder_pan_joint: { trajectory: 0.2, goal: 0.1 } - bob_shoulder_lift_joint: { trajectory: 0.2, goal: 0.1 } - bob_elbow_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_1_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_2_joint: { trajectory: 0.2, goal: 0.1 } - bob_wrist_3_joint: { trajectory: 0.2, goal: 0.1 } - speed_scaling_interface_name: bob_speed_scaling/speed_scaling_factor + speed_scaling: + state_interface: bob_speed_scaling/speed_scaling_factor alice_forward_velocity_controller: ros__parameters: @@ -229,6 +174,7 @@ alice_forward_position_controller: - alice_wrist_1_joint - alice_wrist_2_joint - alice_wrist_3_joint + interface_name: position bob_forward_position_controller: ros__parameters: @@ -239,3 +185,4 @@ bob_forward_position_controller: - bob_wrist_1_joint - bob_wrist_2_joint - bob_wrist_3_joint + interface_name: position diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py index 1981d5a..a5b3aed 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py +++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py @@ -157,6 +157,9 @@ def controller_spawner(controllers, active=True): return Node( package="controller_manager", executable="spawner", + parameters=[ + ParameterFile(controllers_file, allow_substs=True), + ], arguments=[ "--controller-manager", "/controller_manager", @@ -189,6 +192,9 @@ def controller_spawner(controllers, active=True): alice_initial_joint_controller_spawner_started = Node( package="controller_manager", executable="spawner", + parameters=[ + ParameterFile(controllers_file, allow_substs=True), + ], arguments=[ alice_initial_joint_controller, "-c", @@ -201,6 +207,9 @@ def controller_spawner(controllers, active=True): bob_initial_joint_controller_spawner_started = Node( package="controller_manager", executable="spawner", + parameters=[ + ParameterFile(controllers_file, allow_substs=True), + ], arguments=[ bob_initial_joint_controller, "-c", @@ -213,6 +222,9 @@ def controller_spawner(controllers, active=True): alice_initial_joint_controller_spawner_stopped = Node( package="controller_manager", executable="spawner", + parameters=[ + ParameterFile(controllers_file, allow_substs=True), + ], arguments=[ alice_initial_joint_controller, "-c", @@ -226,6 +238,9 @@ def controller_spawner(controllers, active=True): bob_initial_joint_controller_spawner_stopped = Node( package="controller_manager", executable="spawner", + parameters=[ + ParameterFile(controllers_file, allow_substs=True), + ], arguments=[ bob_initial_joint_controller, "-c", @@ -396,14 +411,14 @@ def generate_launch_description(): declared_arguments.append( DeclareLaunchArgument( "alice_initial_joint_controller", - default_value="alice_scaled_joint_trajectory_controller", + default_value="alice_joint_trajectory_controller", description="Initially loaded robot controller for the alice robot arm.", ) ) declared_arguments.append( DeclareLaunchArgument( "bob_initial_joint_controller", - default_value="bob_scaled_joint_trajectory_controller", + default_value="bob_joint_trajectory_controller", description="Initially loaded robot controller for the bob robot arm.", ) ) diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/package.xml b/my_dual_robot_cell/my_dual_robot_cell_control/package.xml index 10f9f88..cfe290a 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/package.xml +++ b/my_dual_robot_cell/my_dual_robot_cell_control/package.xml @@ -13,9 +13,9 @@ ament_cmake + forward_command_controller joint_state_broadcaster joint_trajectory_controller - position_controllers robot_state_publisher my_dual_robot_cell_description ur_controllers diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro index 2e2cdd4..7099115 100644 --- a/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro +++ b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro @@ -62,6 +62,7 @@ ament_cmake - + forward_command_controller joint_state_broadcaster joint_trajectory_controller - position_controllers robot_state_publisher my_robot_cell_description ur_controllers diff --git a/my_robot_cell/my_robot_cell_control/urdf/my_robot_cell_controlled.urdf.xacro b/my_robot_cell/my_robot_cell_control/urdf/my_robot_cell_controlled.urdf.xacro index d55fa1d..2049316 100644 --- a/my_robot_cell/my_robot_cell_control/urdf/my_robot_cell_controlled.urdf.xacro +++ b/my_robot_cell/my_robot_cell_control/urdf/my_robot_cell_controlled.urdf.xacro @@ -39,6 +39,7 @@ Date: Wed, 20 May 2026 13:25:35 +0200 Subject: [PATCH 2/5] Add ROS distro overview --- README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b92ed51..255d6eb 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,22 @@ # Universal Robots ROS 2 tutorials This package contains tutorials around the ROS 2 packages for Universal Robots. +## Branches & ROS distributions +This package intends to show use-cases and examples for the ROS 2 packages for Universal Robots. +The main branch of this repository will be used to show examples for the latest ROS 2 distribution, +ROS Rolling. For older ROS 2 distributions. This is valid for all active ROS 2 distributions, as +long as there is no specialized branch for that distribution. The following table shows the +branches and their corresponding ROS 2 distributions: + +| ROS 2 Distro | Branch | Documentation | +|--------------|------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Rolling** | [main](https://github.com/UniversalRobots/Universal_Robots_ROS2_Tutorials/tree/main) | [![Documentation](https://img.shields.io/badge/docs-latest-blue)](https://docs.universal-robots.com/Universal_Robots_ROS_Documentation/rolling/doc/ur_tutorials/tutorial_index.html) | +| **Jazzy** | [jazzy](https://github.com/UniversalRobots/Universal_Robots_ROS2_Tutorials/tree/jazzy) | [![Documentation](https://img.shields.io/badge/docs-jazzy-blue)](https://docs.universal-robots.com/Universal_Robots_ROS_Documentation/jazzy/doc/ur_tutorials/tutorial_index.html) | +| **Humble** | [humble](https://github.com/UniversalRobots/Universal_Robots_ROS2_Tutorials/tree/humble) | -- | + ## Getting started To use the tutorials from this repository, please make sure to [install ROS -2](https://docs.ros.org/en/rolling/Installation.html) on your system. Currently, only ROS Jazzy and -Rolling are supported. +2](https://docs.ros.org/en/rolling/Installation.html) on your system. With that, please create a workspace, clone this repo into the workspace, install the dependencies and build the workspace. From a4f874a40c0e117decb42a5a4354c0d3326c3a5d Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Wed, 20 May 2026 13:49:14 +0200 Subject: [PATCH 3/5] Add workflows for kilted --- .github/workflows/kilted-binary-main.yml | 21 ++++++++++++++++++++ .github/workflows/kilted-binary-testing.yml | 21 ++++++++++++++++++++ .github/workflows/rolling-binary-main.yml | 2 +- .github/workflows/rolling-binary-testing.yml | 2 +- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/kilted-binary-main.yml create mode 100644 .github/workflows/kilted-binary-testing.yml diff --git a/.github/workflows/kilted-binary-main.yml b/.github/workflows/kilted-binary-main.yml new file mode 100644 index 0000000..a54866d --- /dev/null +++ b/.github/workflows/kilted-binary-main.yml @@ -0,0 +1,21 @@ +name: Kilted Binary Main +on: + workflow_dispatch: + branches: + - main + pull_request: + branches: + - main + push: + branches: + - main + schedule: + - cron: '34 12 * * 0' + +jobs: + kilted_binary_main: + uses: ./.github/workflows/reusable_ici.yml + with: + ros_distro: kilted + ros_repo: main + ref_for_scheduled_build: main diff --git a/.github/workflows/kilted-binary-testing.yml b/.github/workflows/kilted-binary-testing.yml new file mode 100644 index 0000000..8a524c8 --- /dev/null +++ b/.github/workflows/kilted-binary-testing.yml @@ -0,0 +1,21 @@ +name: Kilted Binary Testing +on: + workflow_dispatch: + branches: + - main + pull_request: + branches: + - main + push: + branches: + - main + schedule: + - cron: '34 12 * * 0' + +jobs: + kilted_binary_testing: + uses: ./.github/workflows/reusable_ici.yml + with: + ros_distro: kilted + ros_repo: testing + ref_for_scheduled_build: main diff --git a/.github/workflows/rolling-binary-main.yml b/.github/workflows/rolling-binary-main.yml index 76f54e4..ae0e8c9 100644 --- a/.github/workflows/rolling-binary-main.yml +++ b/.github/workflows/rolling-binary-main.yml @@ -10,7 +10,7 @@ on: branches: - main schedule: - - cron: '34 12 * * *' + - cron: '34 12 * * 0' jobs: rolling_binary_main: diff --git a/.github/workflows/rolling-binary-testing.yml b/.github/workflows/rolling-binary-testing.yml index 50c787d..32b7aba 100644 --- a/.github/workflows/rolling-binary-testing.yml +++ b/.github/workflows/rolling-binary-testing.yml @@ -10,7 +10,7 @@ on: branches: - main schedule: - - cron: '34 12 * * *' + - cron: '34 12 * * 0' jobs: rolling_binary_testing: From 734082621466fa73a6881ddd4e952ee4c5a7ba85 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Wed, 20 May 2026 14:47:40 +0200 Subject: [PATCH 4/5] Add lyrical builds --- .github/workflows/lyrical-binary-main.yml | 21 ++++++++++++++++++++ .github/workflows/lyrical-binary-testing.yml | 21 ++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 .github/workflows/lyrical-binary-main.yml create mode 100644 .github/workflows/lyrical-binary-testing.yml diff --git a/.github/workflows/lyrical-binary-main.yml b/.github/workflows/lyrical-binary-main.yml new file mode 100644 index 0000000..e1b9a6d --- /dev/null +++ b/.github/workflows/lyrical-binary-main.yml @@ -0,0 +1,21 @@ +name: Lyrical Binary Main +on: + workflow_dispatch: + branches: + - main + pull_request: + branches: + - main + push: + branches: + - main + schedule: + - cron: '34 12 * * 0' + +jobs: + lyrical_binary_main: + uses: ./.github/workflows/reusable_ici.yml + with: + ros_distro: lyrical + ros_repo: main + ref_for_scheduled_build: main diff --git a/.github/workflows/lyrical-binary-testing.yml b/.github/workflows/lyrical-binary-testing.yml new file mode 100644 index 0000000..2ffa6e0 --- /dev/null +++ b/.github/workflows/lyrical-binary-testing.yml @@ -0,0 +1,21 @@ +name: Lyrical Binary Testing +on: + workflow_dispatch: + branches: + - main + pull_request: + branches: + - main + push: + branches: + - main + schedule: + - cron: '34 12 * * 0' + +jobs: + lyrical_binary_testing: + uses: ./.github/workflows/reusable_ici.yml + with: + ros_distro: lyrical + ros_repo: testing + ref_for_scheduled_build: main From c4053e62fe0ba1dc1ac3d442d5349434d82e1907 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Wed, 20 May 2026 14:52:57 +0200 Subject: [PATCH 5/5] Skip moveit rosdep keys for now MoveIt isn't available on rolling and lyrical right now --- .github/workflows/lyrical-binary-main.yml | 8 ++++++++ .github/workflows/lyrical-binary-testing.yml | 8 ++++++++ .github/workflows/reusable_ici.yml | 6 ++++++ .github/workflows/rolling-binary-main.yml | 8 ++++++++ .github/workflows/rolling-binary-testing.yml | 8 ++++++++ 5 files changed, 38 insertions(+) diff --git a/.github/workflows/lyrical-binary-main.yml b/.github/workflows/lyrical-binary-main.yml index e1b9a6d..a2f13ec 100644 --- a/.github/workflows/lyrical-binary-main.yml +++ b/.github/workflows/lyrical-binary-main.yml @@ -19,3 +19,11 @@ jobs: ros_distro: lyrical ros_repo: main ref_for_scheduled_build: main + rosdep_skip_keys: >- + moveit_ros_move_group + moveit_kinematics + moveit_planners + moveit_simple_controller_manager + moveit_configs_utils + moveit_ros_visualization + moveit_setup_assistant diff --git a/.github/workflows/lyrical-binary-testing.yml b/.github/workflows/lyrical-binary-testing.yml index 2ffa6e0..9ef476f 100644 --- a/.github/workflows/lyrical-binary-testing.yml +++ b/.github/workflows/lyrical-binary-testing.yml @@ -19,3 +19,11 @@ jobs: ros_distro: lyrical ros_repo: testing ref_for_scheduled_build: main + rosdep_skip_keys: >- + moveit_ros_move_group + moveit_kinematics + moveit_planners + moveit_simple_controller_manager + moveit_configs_utils + moveit_ros_visualization + moveit_setup_assistant diff --git a/.github/workflows/reusable_ici.yml b/.github/workflows/reusable_ici.yml index f056f41..9a9721a 100644 --- a/.github/workflows/reusable_ici.yml +++ b/.github/workflows/reusable_ici.yml @@ -37,6 +37,11 @@ on: default: '.work' required: false type: string + rosdep_skip_keys: + description: "Skip those keys when doing 'rosdep install'. space-separated list" + default: '' + required: false + type: string jobs: reusable_ici: @@ -76,6 +81,7 @@ jobs: UPSTREAM_WORKSPACE: ${{ inputs.upstream_workspace }} ROS_DISTRO: ${{ inputs.ros_distro }} ROS_REPO: ${{ inputs.ros_repo }} + ROSDEP_SKIP_KEYS: ${{ inputs.rosdep_skip_keys }} - name: prepare target_ws for cache if: ${{ always() && ! matrix.env.CCOV }} run: | diff --git a/.github/workflows/rolling-binary-main.yml b/.github/workflows/rolling-binary-main.yml index ae0e8c9..5ab2fe2 100644 --- a/.github/workflows/rolling-binary-main.yml +++ b/.github/workflows/rolling-binary-main.yml @@ -19,3 +19,11 @@ jobs: ros_distro: rolling ros_repo: main ref_for_scheduled_build: main + rosdep_skip_keys: >- + moveit_ros_move_group + moveit_kinematics + moveit_planners + moveit_simple_controller_manager + moveit_configs_utils + moveit_ros_visualization + moveit_setup_assistant diff --git a/.github/workflows/rolling-binary-testing.yml b/.github/workflows/rolling-binary-testing.yml index 32b7aba..e89e8de 100644 --- a/.github/workflows/rolling-binary-testing.yml +++ b/.github/workflows/rolling-binary-testing.yml @@ -19,3 +19,11 @@ jobs: ros_distro: rolling ros_repo: testing ref_for_scheduled_build: main + rosdep_skip_keys: >- + moveit_ros_move_group + moveit_kinematics + moveit_planners + moveit_simple_controller_manager + moveit_configs_utils + moveit_ros_visualization + moveit_setup_assistant