diff --git a/README.md b/README.md
index 30aea6242..99290e892 100644
--- a/README.md
+++ b/README.md
@@ -124,7 +124,7 @@ For getting started, you'll basically need three steps:
details.
```bash
- # Replace ur5e with one of ur3, ur3e, ur5, ur5e, ur7e, ur10, ur10e, ur12e, ur16e, ur15, ur20, ur30
+ # Replace ur5e with one of ur3, ur5, ur10, ur3e, ur5e, ur7e, ur10e, ur12e, ur16e, ur8long, ur15, ur20, ur30
# Replace the IP address with the IP address of your actual robot / URSim
ros2 launch ur_robot_driver ur_control.launch.py ur_type:=ur5e robot_ip:=192.168.56.101
```
diff --git a/ur_moveit_config/launch/ur_moveit.launch.py b/ur_moveit_config/launch/ur_moveit.launch.py
index ed896439f..163ad1f69 100644
--- a/ur_moveit_config/launch/ur_moveit.launch.py
+++ b/ur_moveit_config/launch/ur_moveit.launch.py
@@ -70,14 +70,15 @@ def declare_arguments():
description="Typo/series of used UR robot.",
choices=[
"ur3",
- "ur3e",
"ur5",
+ "ur10",
+ "ur3e",
"ur5e",
"ur7e",
- "ur10",
"ur10e",
"ur12e",
"ur16e",
+ "ur8long",
"ur15",
"ur20",
"ur30",
diff --git a/ur_robot_driver/config/ur8long_update_rate.yaml b/ur_robot_driver/config/ur8long_update_rate.yaml
new file mode 100644
index 000000000..66ef3d736
--- /dev/null
+++ b/ur_robot_driver/config/ur8long_update_rate.yaml
@@ -0,0 +1,3 @@
+controller_manager:
+ ros__parameters:
+ update_rate: 500 # Hz
diff --git a/ur_robot_driver/doc/usage/startup.rst b/ur_robot_driver/doc/usage/startup.rst
index 44680c49b..80ceb0e3b 100644
--- a/ur_robot_driver/doc/usage/startup.rst
+++ b/ur_robot_driver/doc/usage/startup.rst
@@ -24,8 +24,8 @@ nodes for UR robots. The only required arguments are the ``ur_type`` and ``robot
$ ros2 launch ur_robot_driver ur_control.launch.py ur_type:=ur5e robot_ip:=192.168.56.101
-Allowed ``ur_type`` strings: ``ur3``, ``ur3e``, ``ur5``, ``ur5e``, ``ur7e``, ``ur10``, ``ur10e``,
-``ur12e``, ``ur16e``, ``ur15``, ``ur20``, ``ur30``.
+Allowed ``ur_type`` strings: ``ur3``, ``ur5``, ``ur10``, ``ur3e``, ``ur5e``, ``ur7e``, ``ur10e``,
+``ur12e``, ``ur16e``, ``ur8long``, ``ur15``, ``ur20``, ``ur30``.
Other important arguments are:
diff --git a/ur_robot_driver/launch/ur8long.launch.py b/ur_robot_driver/launch/ur8long.launch.py
new file mode 100644
index 000000000..5eb25f91e
--- /dev/null
+++ b/ur_robot_driver/launch/ur8long.launch.py
@@ -0,0 +1,101 @@
+# Copyright (c) 2025 Universal Robots A/S
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# * Neither the name of the {copyright_holder} nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription
+from launch.launch_description_sources import PythonLaunchDescriptionSource
+from launch.substitutions import LaunchConfiguration, ThisLaunchFileDir
+
+
+def generate_launch_description():
+ # Declare arguments
+ declared_arguments = []
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "robot_ip",
+ description="IP address by which the robot can be reached.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "use_mock_hardware",
+ default_value="false",
+ description="Start robot with mock hardware mirroring command to its states.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "mock_sensor_commands",
+ default_value="false",
+ description="Enable mock command interfaces for sensors used for simple simulations. "
+ "Used only if 'use_mock_hardware' parameter is true.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "initial_joint_controller",
+ default_value="scaled_joint_trajectory_controller",
+ description="Initially loaded robot controller.",
+ choices=[
+ "scaled_joint_trajectory_controller",
+ "joint_trajectory_controller",
+ "forward_velocity_controller",
+ "forward_position_controller",
+ "freedrive_mode_controller",
+ "passthrough_trajectory_controller",
+ ],
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "activate_joint_controller",
+ default_value="true",
+ description="Activate loaded joint controller.",
+ )
+ )
+
+ # Initialize Arguments
+ robot_ip = LaunchConfiguration("robot_ip")
+ use_mock_hardware = LaunchConfiguration("use_mock_hardware")
+ mock_sensor_commands = LaunchConfiguration("mock_sensor_commands")
+ initial_joint_controller = LaunchConfiguration("initial_joint_controller")
+ activate_joint_controller = LaunchConfiguration("activate_joint_controller")
+
+ base_launch = IncludeLaunchDescription(
+ PythonLaunchDescriptionSource([ThisLaunchFileDir(), "/ur_control.launch.py"]),
+ launch_arguments={
+ "ur_type": "ur8long",
+ "robot_ip": robot_ip,
+ "use_mock_hardware": use_mock_hardware,
+ "mock_sensor_commands": mock_sensor_commands,
+ "initial_joint_controller": initial_joint_controller,
+ "activate_joint_controller": activate_joint_controller,
+ }.items(),
+ )
+
+ return LaunchDescription(declared_arguments + [base_launch])
diff --git a/ur_robot_driver/launch/ur_control.launch.py b/ur_robot_driver/launch/ur_control.launch.py
index 528da2ee7..22d6ba6be 100644
--- a/ur_robot_driver/launch/ur_control.launch.py
+++ b/ur_robot_driver/launch/ur_control.launch.py
@@ -235,14 +235,15 @@ def generate_launch_description():
description="Type/series of used UR robot.",
choices=[
"ur3",
- "ur3e",
"ur5",
+ "ur10",
+ "ur3e",
"ur5e",
"ur7e",
- "ur10",
"ur10e",
"ur12e",
"ur16e",
+ "ur8long",
"ur15",
"ur20",
"ur30",
diff --git a/ur_robot_driver/launch/ur_rsp.launch.py b/ur_robot_driver/launch/ur_rsp.launch.py
index 963e2dba7..c509845e1 100644
--- a/ur_robot_driver/launch/ur_rsp.launch.py
+++ b/ur_robot_driver/launch/ur_rsp.launch.py
@@ -198,14 +198,15 @@ def generate_launch_description():
description="Typo/series of used UR robot.",
choices=[
"ur3",
- "ur3e",
"ur5",
+ "ur10",
+ "ur3e",
"ur5e",
"ur7e",
- "ur10",
"ur10e",
"ur12e",
"ur16e",
+ "ur8long",
"ur15",
"ur20",
"ur30",
diff --git a/ur_robot_driver/test/test_common.py b/ur_robot_driver/test/test_common.py
index 215f8ff55..e43f3760e 100644
--- a/ur_robot_driver/test/test_common.py
+++ b/ur_robot_driver/test/test_common.py
@@ -310,14 +310,15 @@ def _declare_launch_arguments():
description="Type/series of used UR robot.",
choices=[
"ur3",
- "ur3e",
"ur5",
+ "ur10",
+ "ur3e",
"ur5e",
"ur7e",
- "ur10",
"ur10e",
"ur12e",
"ur16e",
+ "ur8long",
"ur15",
"ur20",
"ur30",
diff --git a/ur_robot_driver/urdf/ur.urdf.xacro b/ur_robot_driver/urdf/ur.urdf.xacro
index c9f6a55ca..f41c9d35c 100644
--- a/ur_robot_driver/urdf/ur.urdf.xacro
+++ b/ur_robot_driver/urdf/ur.urdf.xacro
@@ -8,7 +8,7 @@
-
+