diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/CMakeLists.txt b/my_dual_robot_cell/my_dual_robot_cell_control/CMakeLists.txt
new file mode 100644
index 0000000..9641ab9
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.8)
+project(my_dual_robot_cell_control)
+
+find_package(ament_cmake REQUIRED)
+
+install(
+ DIRECTORY launch config urdf
+ DESTINATION share/${PROJECT_NAME}
+)
+
+ament_package()
diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/LICENSE b/my_dual_robot_cell/my_dual_robot_cell_control/LICENSE
new file mode 100644
index 0000000..48fb689
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2022, Universal Robots A/S
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. 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.
+
+3. 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.
diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/alice_calibration.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/alice_calibration.yaml
new file mode 100644
index 0000000..278abec
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/alice_calibration.yaml
@@ -0,0 +1,44 @@
+kinematics:
+ shoulder:
+ x: 0
+ y: 0
+ z: 0.15188497379686153
+ roll: -0
+ pitch: 0
+ yaw: 6.0977137363254793e-05
+ upper_arm:
+ x: -5.6533207234432926e-06
+ y: 0
+ z: 0
+ roll: 1.570844251867735
+ pitch: 0
+ yaw: 2.541818406001163e-05
+ forearm:
+ x: -0.24357369892909492
+ y: 0
+ z: 0
+ roll: 3.1408819727448281
+ pitch: 3.1414601607728438
+ yaw: -3.1415265155090113
+ wrist_1:
+ x: -0.21292841478821867
+ y: 0.00048506402454531479
+ z: 0.11301075109662011
+ roll: 3.1373004863304383
+ pitch: 3.1363886827765697
+ yaw: 3.1415791419793657
+ wrist_2:
+ x: 4.074182080180165e-05
+ y: -0.085310893242290478
+ z: -6.4346805950626749e-05
+ roll: 1.5715505891323607
+ pitch: 0
+ yaw: -1.1414933636491948e-05
+ wrist_3:
+ x: -7.319426521397714e-05
+ y: 0.08232894752301384
+ z: -5.8521744863255091e-05
+ roll: 1.5700854986261004
+ pitch: 3.1415926535897931
+ yaw: -3.1415870300000677
+ hash: calib_3443727564195709335
\ No newline at end of file
diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/bob_calibration.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/bob_calibration.yaml
new file mode 100644
index 0000000..07d02f8
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/bob_calibration.yaml
@@ -0,0 +1,44 @@
+kinematics:
+ shoulder:
+ x: 0
+ y: 0
+ z: 0.15192390485501492
+ roll: -0
+ pitch: 0
+ yaw: 7.5207672895458863e-05
+ upper_arm:
+ x: 1.1565754681822927e-07
+ y: 0
+ z: 0
+ roll: 1.5701230398196422
+ pitch: 0
+ yaw: -3.745754755790643e-05
+ forearm:
+ x: -0.24342623565759611
+ y: 0
+ z: 0
+ roll: 0.0062667292139209178
+ pitch: -0.0013839232587116385
+ yaw: 3.5263175677186283e-05
+ wrist_1:
+ x: -0.21319918045377464
+ y: -0.00042101985050556432
+ z: 0.11194857450023041
+ roll: 0.0037608148871306722
+ pitch: 0.00014433964301166516
+ yaw: -5.7788592498697277e-05
+ wrist_2:
+ x: 3.3301180434358473e-05
+ y: -0.085304702494341758
+ z: -2.7251181339165215e-05
+ roll: 1.5711157837487961
+ pitch: 0
+ yaw: -3.3083428877200004e-05
+ wrist_3:
+ x: -4.675513506427485e-05
+ y: 0.082256832990903556
+ z: -5.7204020078096673e-05
+ roll: 1.5701008950748028
+ pitch: 3.1415926535897931
+ yaw: 3.1415605336065866
+ hash: calib_10683367749926797482
\ No newline at end of file
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
new file mode 100644
index 0000000..4a5e022
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/combined_controllers.yaml
@@ -0,0 +1,241 @@
+controller_manager:
+ ros__parameters:
+ joint_state_broadcaster:
+ type: joint_state_broadcaster/JointStateBroadcaster
+
+ alice_io_and_status_controller:
+ type: ur_controllers/GPIOController
+
+ bob_io_and_status_controller:
+ type: ur_controllers/GPIOController
+
+ alice_speed_scaling_state_broadcaster:
+ type: ur_controllers/SpeedScalingStateBroadcaster
+
+ bob_speed_scaling_state_broadcaster:
+ type: ur_controllers/SpeedScalingStateBroadcaster
+
+ alice_force_torque_sensor_broadcaster:
+ type: force_torque_sensor_broadcaster/ForceTorqueSensorBroadcaster
+
+ bob_force_torque_sensor_broadcaster:
+ type: force_torque_sensor_broadcaster/ForceTorqueSensorBroadcaster
+
+ alice_joint_trajectory_controller:
+ type: joint_trajectory_controller/JointTrajectoryController
+
+ bob_trajectory_controller:
+ type: joint_trajectory_controller/JointTrajectoryController
+
+ alice_scaled_joint_trajectory_controller:
+ type: ur_controllers/ScaledJointTrajectoryController
+
+ bob_scaled_joint_trajectory_controller:
+ type: ur_controllers/ScaledJointTrajectoryController
+
+ forward_velocity_controller:
+ type: velocity_controllers/JointGroupVelocityController
+
+ alice_forward_position_controller:
+ type: position_controllers/JointGroupPositionController
+
+ bob_forward_position_controller:
+ type: position_controllers/JointGroupPositionController
+
+
+alice_speed_scaling_state_broadcaster:
+ ros__parameters:
+ state_publish_rate: 100.0
+ tf_prefix: "alice_"
+
+bob_speed_scaling_state_broadcaster:
+ ros__parameters:
+ state_publish_rate: 100.0
+ tf_prefix: "bob_"
+
+alice_io_and_status_controller:
+ ros__parameters:
+ tf_prefix: "alice_"
+
+bob_io_and_status_controller:
+ ros__parameters:
+ tf_prefix: "bob_"
+
+alice_force_torque_sensor_broadcaster:
+ ros__parameters:
+ sensor_name: alice_tcp_fts_sensor
+ state_interface_names:
+ - force.x
+ - force.y
+ - force.z
+ - torque.x
+ - torque.y
+ - torque.z
+ frame_id: bob_tool0
+ topic_name: alice_ft_data
+
+bob_force_torque_sensor_broadcaster:
+ ros__parameters:
+ sensor_name: bob_tcp_fts_sensor
+ state_interface_names:
+ - force.x
+ - force.y
+ - force.z
+ - torque.x
+ - torque.y
+ - torque.z
+ frame_id: bob_tool0
+ topic_name: bob_ft_data
+
+
+alice_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 }
+
+bob_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 }
+
+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
+
+alice_forward_velocity_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
+ interface_name: velocity
+
+bob_forward_velocity_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
+ interface_name: velocity
+
+alice_forward_position_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
+
+bob_forward_position_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
\ No newline at end of file
diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/config/update_rate.yaml b/my_dual_robot_cell/my_dual_robot_cell_control/config/update_rate.yaml
new file mode 100644
index 0000000..66ef3d7
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/config/update_rate.yaml
@@ -0,0 +1,3 @@
+controller_manager:
+ ros__parameters:
+ update_rate: 500 # Hz
diff --git a/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py b/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py
new file mode 100644
index 0000000..5aadd21
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/rsp.launch.py
@@ -0,0 +1,203 @@
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument
+from launch.substitutions import (Command, FindExecutable, LaunchConfiguration,
+ PathJoinSubstitution)
+from launch_ros.actions import Node
+from launch_ros.substitutions import FindPackageShare
+
+
+def generate_launch_description():
+ alice_ur_type = LaunchConfiguration("alice_ur_type")
+ bob_ur_type = LaunchConfiguration("bob_ur_type")
+
+ alice_robot_ip = LaunchConfiguration("alice_robot_ip")
+ bob_robot_ip = LaunchConfiguration("bob_robot_ip")
+
+ alice_use_mock_hardware = LaunchConfiguration("alice_use_mock_hardware")
+ alice_mock_sensor_commands = LaunchConfiguration("alice_mock_sensor_commands")
+ bob_use_mock_hardware = LaunchConfiguration("bob_use_mock_hardware")
+ bob_mock_sensor_commands = LaunchConfiguration("bob_mock_sensor_commands")
+
+ headless_mode = LaunchConfiguration("headless_mode")
+
+ alice_kinematics_parameters_file = LaunchConfiguration(
+ "alice_kinematics_parameters_file"
+ )
+ bob_kinematics_parameters_file = LaunchConfiguration(
+ "bob_kinematics_parameters_file"
+ )
+
+ robot_description_content = Command(
+ [
+ PathJoinSubstitution([FindExecutable(name="xacro")]),
+ " ",
+ PathJoinSubstitution(
+ [
+ FindPackageShare("my_dual_robot_cell_control"),
+ "urdf",
+ "my_dual_robot_cell_controlled.urdf.xacro",
+ ]
+ ),
+ " ",
+ "alice_robot_ip:=",
+ alice_robot_ip,
+ " ",
+ "bob_robot_ip:=",
+ bob_robot_ip,
+ " ",
+ "alice_ur_type:=",
+ alice_ur_type,
+ " ",
+ "bob_ur_type:=",
+ bob_ur_type,
+ " ",
+ "alice_use_mock_hardware:=",
+ alice_use_mock_hardware,
+ " ",
+ "bob_use_mock_hardware:=",
+ bob_use_mock_hardware,
+ " ",
+ "alice_kinematics_parameters_file:=",
+ alice_kinematics_parameters_file,
+ " ",
+ "bob_kinematics_parameters_file:=",
+ bob_kinematics_parameters_file,
+ " ",
+ "alice_mock_sensor_commands:=",
+ alice_mock_sensor_commands,
+ " ",
+ "bob_mock_sensor_commands:=",
+ bob_mock_sensor_commands,
+ " ",
+ "headless_mode:=",
+ headless_mode,
+ ]
+ )
+ robot_description = {"robot_description": robot_description_content}
+
+ declared_arguments = []
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_ur_type",
+ description="Type/series of used UR robot.",
+ choices=[
+ "ur3",
+ "ur3e",
+ "ur5",
+ "ur5e",
+ "ur10",
+ "ur10e",
+ "ur16e",
+ "ur20",
+ "ur30",
+ ],
+ default_value="ur3e",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_ur_type",
+ description="Type/series of used UR robot.",
+ choices=[
+ "ur3",
+ "ur3e",
+ "ur5",
+ "ur5e",
+ "ur10",
+ "ur10e",
+ "ur16e",
+ "ur20",
+ "ur30",
+ ],
+ default_value="ur3e",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_robot_ip",
+ default_value="192.168.0.101",
+ description="IP address by which alice can be reached.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_robot_ip",
+ default_value="192.168.0.100",
+ description="IP address by which bob can be reached.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_kinematics_parameters_file",
+ default_value=PathJoinSubstitution(
+ [
+ FindPackageShare("my_dual_robot_cell_control"),
+ "config",
+ "alice_calibration.yaml",
+ ]
+ ),
+ description="The calibration configuration of alice.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_kinematics_parameters_file",
+ default_value=PathJoinSubstitution(
+ [
+ FindPackageShare("my_dual_robot_cell_control"),
+ "config",
+ "bob_calibration.yaml",
+ ]
+ ),
+ description="The calibration configuration of bob.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_use_mock_hardware",
+ default_value="false",
+ description="Start alice with mock hardware mirroring command to its states.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_use_mock_hardware",
+ default_value="false",
+ description="Start bob with mock hardware mirroring command to its states.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_mock_sensor_commands",
+ default_value="false",
+ description="Enable mock command interfaces for alice's sensors used for simple simulations. "
+ "Used only if 'use_mock_hardware' parameter is true.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_mock_sensor_commands",
+ default_value="false",
+ description="Enable mock command interfaces for bob's sensors used for simple simulations. "
+ "Used only if 'use_mock_hardware' parameter is true.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "headless_mode",
+ default_value="false",
+ description="Enable headless mode for robot control",
+ )
+ )
+
+ return LaunchDescription(
+ declared_arguments
+ + [
+ Node(
+ package="robot_state_publisher",
+ executable="robot_state_publisher",
+ output="both",
+ parameters=[robot_description],
+ ),
+ ]
+ )
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
new file mode 100644
index 0000000..e131c2e
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/launch/start_robots.launch.py
@@ -0,0 +1,466 @@
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription
+from launch.conditions import IfCondition, UnlessCondition
+from launch.launch_description_sources import AnyLaunchDescriptionSource
+from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
+from launch_ros.actions import Node
+from launch_ros.parameter_descriptions import ParameterFile
+from launch_ros.substitutions import FindPackageShare
+
+
+def launch_setup():
+ # Initialize Arguments
+ alice_ur_type = LaunchConfiguration("alice_ur_type")
+ bob_ur_type = LaunchConfiguration("bob_ur_type")
+
+ alice_robot_ip = LaunchConfiguration("alice_robot_ip")
+ bob_robot_ip = LaunchConfiguration("bob_robot_ip")
+
+ # General arguments
+ controllers_file = LaunchConfiguration("controllers_file")
+ controller_spawner_timeout = LaunchConfiguration("controller_spawner_timeout")
+ description_launchfile = LaunchConfiguration("description_launchfile")
+ launch_rviz = LaunchConfiguration("launch_rviz")
+ rviz_config_file = LaunchConfiguration("rviz_config_file")
+ headless_mode = LaunchConfiguration("headless_mode")
+
+ # Robot specific arguments
+ alice_use_mock_hardware = LaunchConfiguration("alice_use_mock_hardware")
+ alice_mock_sensor_commands = LaunchConfiguration("alice_mock_sensor_commands")
+ alice_initial_joint_controller = LaunchConfiguration("alice_initial_joint_controller")
+ alice_activate_joint_controller = LaunchConfiguration("alice_activate_joint_controller")
+ alice_launch_dashboard_client = LaunchConfiguration("alice_launch_dashboard_client")
+
+ bob_use_mock_hardware = LaunchConfiguration("bob_use_mock_hardware")
+ bob_mock_sensor_commands = LaunchConfiguration("bob_mock_sensor_commands")
+ bob_initial_joint_controller = LaunchConfiguration("bob_initial_joint_controller")
+ bob_activate_joint_controller = LaunchConfiguration("bob_activate_joint_controller")
+ bob_launch_dashboard_client = LaunchConfiguration("bob_launch_dashboard_client")
+
+ # Single controller manager comprising of controllers for both arms
+ control_node = Node(
+ package="controller_manager",
+ executable="ros2_control_node",
+ parameters=[
+ LaunchConfiguration("update_rate_config_file"),
+ ParameterFile(controllers_file, allow_substs=True),
+ # We use the tf_prefix as substitution in there, so that's why we keep it as an
+ # argument for this launchfile
+ ],
+ output="screen",
+ )
+
+ alice_dashboard_client_node = Node(
+ package="ur_robot_driver",
+ condition=IfCondition(alice_launch_dashboard_client) and UnlessCondition(alice_use_mock_hardware),
+ executable="dashboard_client",
+ name="dashboard_client",
+ namespace="alice",
+ output="screen",
+ emulate_tty=True,
+ parameters=[{"robot_ip": alice_robot_ip}],
+ )
+
+ bob_dashboard_client_node = Node(
+ package="ur_robot_driver",
+ condition=IfCondition(bob_launch_dashboard_client) and UnlessCondition(bob_use_mock_hardware),
+ executable="dashboard_client",
+ name="dashboard_client",
+ namespace="bob",
+ output="screen",
+ emulate_tty=True,
+ parameters=[{"robot_ip": bob_robot_ip}],
+ )
+
+ alice_urscript_interface = Node(
+ package="ur_robot_driver",
+ executable="urscript_interface",
+ namespace="alice",
+ parameters=[{"robot_ip": alice_robot_ip}],
+ output="screen",
+ condition=UnlessCondition(alice_use_mock_hardware),
+ )
+
+ bob_urscript_interface = Node(
+ package="ur_robot_driver",
+ executable="urscript_interface",
+ namespace="bob",
+ parameters=[{"robot_ip": bob_robot_ip}],
+ output="screen",
+ condition=UnlessCondition(bob_use_mock_hardware),
+ )
+
+ alice_controller_stopper_node = Node(
+ package="ur_robot_driver",
+ executable="controller_stopper_node",
+ namespace="alice",
+ name="controller_stopper",
+ output="screen",
+ emulate_tty=True,
+ condition=UnlessCondition(alice_use_mock_hardware),
+ parameters=[
+ {"headless_mode": headless_mode},
+ {"joint_controller_active": alice_activate_joint_controller},
+ {
+ "consistent_controllers": [
+ "joint_state_broadcaster",
+ "alice_io_and_status_controller",
+ "bob_io_and_status_controller",
+ "alice_force_torque_sensor_broadcaster",
+ "bob_force_torque_sensor_broadcaster",
+ "alice_speed_scaling_state_broadcaster",
+ "bob_speed_scaling_state_broadcaster",
+ ]
+ },
+ ],
+ )
+
+ bob_controller_stopper_node = Node(
+ package="ur_robot_driver",
+ executable="controller_stopper_node",
+ namespace="bob",
+ name="controller_stopper",
+ output="screen",
+ emulate_tty=True,
+ condition=UnlessCondition(bob_use_mock_hardware),
+ parameters=[
+ {"headless_mode": headless_mode},
+ {"joint_controller_active": bob_activate_joint_controller},
+ {
+ "consistent_controllers": [
+ "joint_state_broadcaster",
+ "alice_io_and_status_controller",
+ "bob_io_and_status_controller",
+ "alice_force_torque_sensor_broadcaster",
+ "bob_force_torque_sensor_broadcaster",
+ "alice_speed_scaling_state_broadcaster",
+ "bob_speed_scaling_state_broadcaster",
+ ]
+ },
+ ],
+ )
+
+ rviz_node = Node(
+ package="rviz2",
+ condition=IfCondition(launch_rviz),
+ executable="rviz2",
+ name="rviz2",
+ output="log",
+ arguments=["-d", rviz_config_file],
+ )
+
+ # Spawn controllers
+ def controller_spawner(controllers, active=True):
+ inactive_flags = ["--inactive"] if not active else []
+ return Node(
+ package="controller_manager",
+ executable="spawner",
+ arguments=[
+ "--controller-manager",
+ "/controller_manager",
+ "--controller-manager-timeout",
+ controller_spawner_timeout,
+ ]
+ + inactive_flags
+ + controllers,
+ )
+
+ controllers_active = [
+ "joint_state_broadcaster",
+ "alice_io_and_status_controller",
+ "bob_io_and_status_controller",
+ "alice_speed_scaling_state_broadcaster",
+ "bob_speed_scaling_state_broadcaster",
+ "alice_force_torque_sensor_broadcaster",
+ "bob_force_torque_sensor_broadcaster",
+ ]
+ controllers_inactive = [
+ "alice_forward_position_controller",
+ "bob_forward_position_controller",
+ ]
+
+ controller_spawners = [controller_spawner(controllers_active)] + [
+ controller_spawner(controllers_inactive, active=False)
+ ]
+
+ # There may be other controllers of the joints, but this is the initially-started one
+ alice_initial_joint_controller_spawner_started = Node(
+ package="controller_manager",
+ executable="spawner",
+ arguments=[
+ alice_initial_joint_controller,
+ "-c",
+ "/controller_manager",
+ "--controller-manager-timeout",
+ controller_spawner_timeout,
+ ],
+ condition=IfCondition(alice_activate_joint_controller),
+ )
+ bob_initial_joint_controller_spawner_started = Node(
+ package="controller_manager",
+ executable="spawner",
+ arguments=[
+ bob_initial_joint_controller,
+ "-c",
+ "/controller_manager",
+ "--controller-manager-timeout",
+ controller_spawner_timeout,
+ ],
+ condition=IfCondition(bob_activate_joint_controller),
+ )
+ alice_initial_joint_controller_spawner_stopped = Node(
+ package="controller_manager",
+ executable="spawner",
+ arguments=[
+ alice_initial_joint_controller,
+ "-c",
+ "/controller_manager",
+ "--controller-manager-timeout",
+ controller_spawner_timeout,
+ "--inactive",
+ ],
+ condition=UnlessCondition(alice_activate_joint_controller),
+ )
+ bob_initial_joint_controller_spawner_stopped = Node(
+ package="controller_manager",
+ executable="spawner",
+ arguments=[
+ bob_initial_joint_controller,
+ "-c",
+ "/controller_manager",
+ "--controller-manager-timeout",
+ controller_spawner_timeout,
+ "--inactive",
+ ],
+ condition=UnlessCondition(bob_activate_joint_controller),
+ )
+
+ rsp = IncludeLaunchDescription(
+ AnyLaunchDescriptionSource(description_launchfile),
+ launch_arguments={
+ "alice_robot_ip": alice_robot_ip,
+ "bob_robot_ip": bob_robot_ip,
+ "alice_ur_type": alice_ur_type,
+ "bob_ur_type": bob_ur_type,
+ }.items(),
+ )
+
+ nodes_to_start = [
+ control_node,
+ alice_dashboard_client_node,
+ bob_dashboard_client_node,
+ alice_controller_stopper_node,
+ bob_controller_stopper_node,
+ alice_urscript_interface,
+ bob_urscript_interface,
+ rsp,
+ rviz_node,
+ alice_initial_joint_controller_spawner_stopped,
+ bob_initial_joint_controller_spawner_stopped,
+ alice_initial_joint_controller_spawner_started,
+ bob_initial_joint_controller_spawner_started,
+ ] + controller_spawners
+
+ return nodes_to_start
+
+
+def generate_launch_description():
+ declared_arguments = []
+ # UR specific arguments
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_ur_type",
+ description="Type/series of used UR robot.",
+ choices=[
+ "ur3",
+ "ur3e",
+ "ur5",
+ "ur5e",
+ "ur10",
+ "ur10e",
+ "ur16e",
+ "ur20",
+ "ur30",
+ ],
+ default_value="ur3e",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_ur_type",
+ description="Type/series of used UR robot.",
+ choices=[
+ "ur3",
+ "ur3e",
+ "ur5",
+ "ur5e",
+ "ur10",
+ "ur10e",
+ "ur16e",
+ "ur20",
+ "ur30",
+ ],
+ default_value="ur3e",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_robot_ip",
+ default_value="192.168.0.101",
+ description="IP address by which alice can be reached.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_robot_ip",
+ default_value="192.168.0.100",
+ description="IP address by which bob can be reached.",
+ )
+ )
+
+ # General arguments
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "controllers_file",
+ default_value=PathJoinSubstitution(
+ [
+ FindPackageShare("my_dual_robot_cell_control"),
+ "config",
+ "combined_controllers.yaml",
+ ]
+ ),
+ description="YAML file with the controllers configuration.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "description_launchfile",
+ default_value=PathJoinSubstitution(
+ [
+ FindPackageShare("my_dual_robot_cell_control"),
+ "launch",
+ "rsp.launch.py",
+ ]
+ ),
+ description="Launchfile (absolute path) providing the description. "
+ "The launchfile has to start a robot_state_publisher node that "
+ "publishes the description topic.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_use_mock_hardware",
+ default_value="false",
+ description="Start alice with mock hardware mirroring command to its states.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_use_mock_hardware",
+ default_value="false",
+ description="Start bob with mock hardware mirroring command to its states.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_mock_sensor_commands",
+ default_value="false",
+ description="Enable mock command interfaces for alice's sensors used for simple simulations. "
+ "Used only if 'use_mock_hardware' parameter is true.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_mock_sensor_commands",
+ default_value="false",
+ description="Enable mock command interfaces for bob's sensors used for simple simulations. "
+ "Used only if 'use_mock_hardware' parameter is true.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "headless_mode",
+ default_value="false",
+ description="Enable headless mode for robot control for both arms.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "controller_spawner_timeout",
+ default_value="10",
+ description="Timeout used when spawning controllers.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_initial_joint_controller",
+ default_value="alice_scaled_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",
+ description="Initially loaded robot controller for the bob robot arm.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_activate_joint_controller",
+ default_value="true",
+ description="Activate loaded joint controller for the alice robot arm.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_activate_joint_controller",
+ default_value="true",
+ description="Activate loaded joint controller for the bob robot arm.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "launch_rviz", default_value="true", description="Launch RViz?"
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "rviz_config_file",
+ default_value=PathJoinSubstitution(
+ [FindPackageShare("my_dual_robot_cell_description"), "rviz", "urdf.rviz"]
+ ),
+ description="RViz config file (absolute path) to use when launching rviz.",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "alice_launch_dashboard_client",
+ default_value="true",
+ description="Launch Dashboard Client?",
+ )
+ )
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ "bob_launch_dashboard_client",
+ default_value="true",
+ description="Launch Dashboard Client?",
+ )
+ )
+
+ declared_arguments.append(
+ DeclareLaunchArgument(
+ name="update_rate_config_file",
+ default_value=[
+ PathJoinSubstitution(
+ [
+ FindPackageShare("my_dual_robot_cell_control"),
+ "config",
+ ]
+ ),
+ "/",
+ "update_rate.yaml",
+ ],
+ )
+ )
+ return LaunchDescription(declared_arguments + launch_setup())
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
new file mode 100644
index 0000000..10f9f88
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/package.xml
@@ -0,0 +1,31 @@
+
+
+
+ my_dual_robot_cell_control
+ 1.0.0
+
+ ros2_control setup
+
+ Vihaan Shah
+ Felix Durchdewald
+ BSD-3-Clause
+
+
+ ament_cmake
+
+ joint_state_broadcaster
+ joint_trajectory_controller
+ position_controllers
+ robot_state_publisher
+ my_dual_robot_cell_description
+ ur_controllers
+ ur_robot_driver
+ ur_client_library
+ xacro
+ controller_manager
+
+
+
+ ament_cmake
+
+
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
new file mode 100644
index 0000000..c1bacd8
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_control/urdf/my_dual_robot_cell_controlled.urdf.xacro
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/CMakeLists.txt b/my_dual_robot_cell/my_dual_robot_cell_description/CMakeLists.txt
new file mode 100644
index 0000000..e71962f
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_description/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.5)
+project(my_dual_robot_cell_description)
+
+find_package(ament_cmake REQUIRED)
+
+install(
+ DIRECTORY launch rviz urdf
+ DESTINATION share/${PROJECT_NAME}
+)
+
+ament_package()
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/LICENSE b/my_dual_robot_cell/my_dual_robot_cell_description/LICENSE
new file mode 100644
index 0000000..48fb689
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_description/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2022, Universal Robots A/S
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. 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.
+
+3. 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.
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/UR_LICENSE.txt b/my_dual_robot_cell/my_dual_robot_cell_description/UR_LICENSE.txt
new file mode 100644
index 0000000..cba4e38
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_description/UR_LICENSE.txt
@@ -0,0 +1,84 @@
+TERMS AND CONDITIONS FOR USE OF GRAPHICAL DOCUMENTATION
+
+Version: 1.01 / release date: 2023-09-12
+
+These Terms and Conditions for Use of Graphical Documentation (the “T&Cs”) govern your use of graphical files and documents*, including the contents hereof, (the “Graphical Documentation”) provided or made available to you by Universal Robots A/S (“Universal Robots”) for the purposes of creating simulations, visualizations, digital representations, path planning, collision avoidance and algorithms of or for Universal Robots’ products. The T&Cs constitute a binding agreement between you and Universal Robots. By accessing, storing, copying, sharing, opening, or otherwise using or disposing of the Graphical Documentation, you acknowledge that you are bound by the T&Cs.
+
+1. PERMITTED USE OF THE GRAPHICAL DOCUMENTATION
+
+1.1. You may use the Graphical Documentation for the purposes of creating simulations, visualizations, digital representations, path planning, collision avoidance and algorithms of or for Universal Robots’ products, provided that your use does not constitute comparative advertising and is not otherwise unfair, disloyal, or disparaging to Universal Robots.
+
+1.2. Hobbyists, students and/or researchers are allowed to use the Graphical Documentation to create models or similar solely for non-commercial purposes as part of their hobby, academic studies, or research. However, no one is allowed to use the Graphical Documentation to create a physical model or similar for commercial purposes, nor to create or improve a product that is capable of competing, either directly or indirectly, with any of Universal Robots’ or its affiliates’ current or future robots.
+
+1.3. You are permitted to create a product or solution that simulates, visualizes, or digitally represents a Universal Robots product, regardless of the origin of the underlying software, and regardless of whether Universal Robots or its affiliates have released a product that competes with the underlying software. However, you may not in any way use the Graphical Documentation to create a product or solution that simulates, visualizes or represents a product that is capable of competing, either directly or indirectly, with any of Universal Robots’ or its affiliates’ current or future products without Universal Robots’ prior written permission.
+
+1.4. You may share the Graphical Documentation or any whole or partial copies thereof with a third party (i) if and to the extent it is necessary for you to do so in order for you to engage in use permitted pursuant to this Section 1, and (ii) you provide the recipient with a copy of the T&Cs. However, you may only make the Graphical Documentation or any whole or partial copies thereof available to the public via download if it is part of a downloadable software package that includes a copy of the T&Cs. If you download a software package that includes the Graphical Documentation, your use of the Graphical Documentation will be subject to and governed by the latest version of the T&Cs, which can be found here: https://www.universal-robots.com/legal/terms-and-conditions/terms_and_conditions_for_use_of_graphical_documentation.txt , regardless of whether they are included in the software package or not.
+
+1.4.1. You are not allowed to alter, obscure, remove or replace any copyright or other legal notices, trademarks, business names and/or logos embedded in, superimposed on, affixed to, or otherwise included in, the Graphical Documentation without Universal Robots’ prior written permission.
+
+1.4.2. You may show the Graphical Documentation in whole or in part to a third party or the public in the course of you engaging in the use permitted pursuant to this Section 1, provided that you display any copyright notice already contained in the Graphical Documentation, cf. also Section 1.4.1.
+
+1.4.3. You may show graphical representations of Universal Robots’ products based on the Graphical Documentation to a third party or the public in the course of you engaging in the use permitted pursuant to this Section 1, if you, to the extent possible, display the following copyright notice in connection with such use: “© 2023 Universal Robots A/S. Use hereof is subject to Universal Robots A/S’ Terms and Conditions for Use of Graphical Documentation.” If the medium that you use limits or does not support the possibility of displaying the copyright notice, you may in good faith disregard this requirement.
+
+1.5. You may under no circumstances use the Graphical Documentation for planning, construction, maintenance, operation, or use, directly or indirectly, in nuclear power plants, missile technology, chemical or biological weapons applications or flight, navigation, or communication of aircraft or ground support equipment.
+
+1.6. Any use of the Graphical Documentation that is not expressly permitted pursuant to this Section 1 constitutes a material breach of the T&Cs.
+
+1.7. If your intended use of the Graphical Documentation is not permitted pursuant to the T&Cs, you may contact Universal Robots via email at legal@universal-robots.com and request a special permission to engage in your particular intended use.
+
+
+2. INTELLECTUAL PROPERTY RIGHTS
+
+2.1. You acknowledge and agree that the Graphical Documentation and all intellectual property rights contained and/or embodied therein, including, but not limited to, rights under the Danish Marketing Practices Act or under similar rules of law, patents, utility models, copyrights and related rights, software, trademarks, semiconductors, designs, know-how, rights in databases, trade secrets, and all applications or pending applications for such in all cases, whether or not registrable in any country, and all rights and forms of protection of a similar nature or having equivalent or similar effect anywhere in the world, shall be and remain the sole property of Universal Robots. Nothing in the T&Cs shall be construed as granting you any license to such rights, including, without limitation, any licenses to use Universal Robots’ trademarks, patents, or designs, except as strictly necessary in order for you to engage in the use permitted pursuant to Section 1.
+
+2.2. If you create any derivative works based on the Graphical Documentation, Universal Robots shall own the intellectual property rights in and to such derivative works. The foregoing notwithstanding, you may use such derivative works in connection with your use of the Graphical Documentation in accordance with Section 1.
+
+
+3. NO WARRANTIES, LIMITATIONS OF LIABILITY
+
+3.1. THE GRAPHICAL DOCUMENTATION IS PROVIDED ON AN “AS IS” BASIS AND UNIVERSAL ROBOTS MAKES NO WARRANTY OF ANY KIND WITH RESPECT TO THE GRAPHICAL DOCUMENTATION AND WE HEREBY EXPRESSLY EXCLUDE ANY WARRANTIES WITH RESPECT THERETO, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING BUT NOT LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, NONINFRINGEMENT, ACCURACY OR ANY OTHER WARRANTIES OR GUARANTEES THAT MAY ARISE FROM COURSE OF DEALING, USAGE, OR TRADE PRACTICE. NEITHER UNIVERSAL ROBOTS NOR ITS SUPPLIERS, INCLUDING – WITHOUT LIMITATION – ITS LICENSORS, MAKE ANY REPRESENTATION, WARRANTY, OR OTHER COMMITMENT REGARDING (1) THE USE OR INABILITY TO USE THE GRAPHICAL DOCUMENTATION; OR (2) ANY RESULTS OF SUCH USE IN TERMS OF CORRECTNESS, ACCURACY, OR RELIABILITY. YOU UNDERSTAND AND AGREE THAT YOU ASSUME THE ENTIRE RISK AS TO YOUR USE OF THE GRAPHICAL DOCUMENTATION.
+
+3.2. TO THE EXTENT PERMITTED BY LAW, IN NO EVENT WILL UNIVERSAL ROBOTS BE LIABLE FOR ANY LOSSES OR DAMAGES INCURRED BY YOU, WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL, INCLUDING LOST OR ANTICIPATED PROFITS, SAVINGS, INTERRUPTION TO BUSINESS, LOSS OF BUSINESS OPPORTUNITIES, LOSS OF BUSINESS INFORMATION OR OTHER DATA, THE COST OF RECOVERING SUCH LOST INFORMATION OR DATA, THE COST OF SUBSTITUTE INTELLECTUAL PROPERTY OR ANY OTHER PECUNIARY LOSS ARISING FROM THE USE OF, OR THE INABILITY TO USE, THE GRAPHICAL DOCUMENTATION REGARDLESS OF WHETHER UNIVERSAL ROBOTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THE FOREGOING LIMITATIONS APPLY REGARDLESS OF THE CAUSE OR CIRCUMSTANCES GIVING RISE TO SUCH LOSS, DAMAGE OR LIABILITY, EVEN IF SUCH LOSS, DAMAGE OR LIABILITY IS BASED ON NEGLIGENCE OR OTHER TORTS OR BREACH OF CONTRACT.
+
+
+4. INDEMNIFICATION
+
+4.1. You shall defend, indemnify, and hold Universal Robots and its affiliates, employees, and agents harmless, from and against all sums, claims, costs, duties, liabilities, losses, obligations, suits, actions, damages, penalties, awards, fines, interest, and other expenses (including investigation expenses and attorneys’ fees) that Universal Robots may incur or be obligated to pay as a result of your unauthorized use, modification, resale, transfer, shipment, or export of the Graphical Documentation.
+
+
+5. MISCELLANEOUS
+
+5.1. Entire Agreement. Except as otherwise explicitly provided for herein, the T&Cs constitute the entire agreement and supersedes all prior negotiations, promises, understandings, and agreements between the parties with respect to the subject matter hereof.
+
+5.2. Changes to the T&Cs. Universal Robots reserves the right, in its sole and absolute discretion, to change the terms of the T&Cs by providing you with ninety (90) days’ notice.
+
+5.3. Obligations on Legal Successors. The parties undertake to impose the obligations under the T&Cs on their statutory or contractual legal successors, if any.
+
+5.4. Export Laws. You agree to comply with all applicable laws and regulations, including export laws of the United States and any other applicable country or jurisdiction. You agree that the Graphical Documentation will not be shipped, transferred, or exported into any country or used in any manner prohibited by the United States Export Administration Act or any other country’s export laws, restrictions, or regulations (collectively the “Export Laws”). In addition, if the Graphical Documentation are identified as export controlled items under the Export Laws, you represent and warrant that you are not a citizen, or otherwise located within, an embargoed nation and that you are not otherwise prohibited under the Export Laws from receiving the Graphical Documentation.
+
+5.5. No Agency. The parties are independent contractors and nothing in the T&Cs shall be construed as to create an agency, joint venture, partnership, or other form of business association between the parties.
+
+5.6. Survival. If the contents of individual provisions of the T&Cs are intended to survive the termination or expiration of the T&Cs, such provisions, including but not limited to provisions governing warranties and representations and the transfer of rights, title and interest to Universal Robots, shall to this extent remain in effect and be fully enforceable also after the termination or expiration of the T&Cs for whatever reason.
+
+
+6. TERM AND TERMINATION
+
+6.1. The T&Cs shall enter into force upon your receipt of, or you accessing, the Graphical Documentation and continue to be in force until terminated in accordance with this Section 6. The T&Cs shall automatically expire at such time as you are no longer permitted to use the Graphical Documentation in accordance with Section 1.
+
+6.2. You may terminate the T&Cs for convenience at any time by deleting all copies of the Graphical Documentation in your possession. Universal Robots may terminate the T&Cs for convenience by providing you with ninety (90) days’ notice.
+
+6.3. Universal Robots may terminate the T&Cs for cause with immediate effect in case of your material breach of the T&Cs.
+
+
+7. EFFECTS OF TERMINATION
+
+7.1. Upon expiration or termination of the T&Cs, for whatever reason, you must immediately cease use of the Graphical Documentation and delete all copies of the Graphical Documentation in your possession.
+
+8. GOVERNING LAW AND VENUE
+
+8.1. The T&Cs shall be governed by and construed in accordance with the laws of Denmark, without giving effect to conflict of law provisions thereof. The parties expressly disclaim the applicability of the United Nations Convention on Contracts for the International Sale of Goods.
+
+8.2. Any and all disputes arising out of or in connection with the T&Cs shall be submitted to the International Chamber of Commerce and shall be settled under the Rules of Arbitration of the International Chamber of Commerce by one (1) arbitrator appointed in accordance with said Rules. The place of arbitration shall be Copenhagen, Denmark. The arbitration shall be conducted in the English language. The foregoing notwithstanding, Universal Robots may seek preliminary, temporary, or permanent injunctive relief and other equitable remedies in any court of competent jurisdiction prior to or during arbitration and may enforce the award of the arbitrator in any court of competent jurisdiction.
+
+
+* E.g., STEP-Files (ISO 10303-21), Collada (.dae), STL files (.stl), GLB files (.glb), GLFT files (.glft) , Jupiter Tessellation files (.jt), E-plan files (.emp), electrical schematics, CAD files, and drawings including the contents of these technical files. “Software”, as defined in Universal Robots End User Software License Agreement, does not constitute “Technical Documentation” and your use thereof is, unless otherwise agreed with Universal Robots in writing, governed by Universal Robots’ End User Software License Agreement.
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/launch/view_robot.launch.py b/my_dual_robot_cell/my_dual_robot_cell_description/launch/view_robot.launch.py
new file mode 100644
index 0000000..4a8c477
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_description/launch/view_robot.launch.py
@@ -0,0 +1,52 @@
+from launch import LaunchDescription
+from launch.substitutions import Command, PathJoinSubstitution
+from launch_ros.actions import Node
+from launch_ros.parameter_descriptions import ParameterValue
+from launch_ros.substitutions import FindPackageShare
+
+
+def generate_launch_description():
+ description_package = FindPackageShare("my_dual_robot_cell_description")
+ description_file = PathJoinSubstitution(
+ [description_package, "urdf", "my_dual_robot_cell.urdf.xacro"]
+ )
+ rvizconfig_file = PathJoinSubstitution([description_package, "rviz", "urdf.rviz"])
+
+ robot_description = ParameterValue(
+ Command(
+ [
+ "xacro ",
+ description_file,
+ " ",
+ "alice_ur_type:=",
+ "ur3",
+ " ",
+ "bob_ur_type:=",
+ "ur3",
+ ]
+ ),
+ value_type=str,
+ )
+
+ robot_state_publisher_node = Node(
+ package="robot_state_publisher",
+ executable="robot_state_publisher",
+ parameters=[{"robot_description": robot_description}],
+ )
+
+ joint_state_publisher_gui_node = Node(
+ package="joint_state_publisher_gui",
+ executable="joint_state_publisher_gui",
+ )
+
+ rviz_node = Node(
+ package="rviz2",
+ executable="rviz2",
+ name="rviz2",
+ output="screen",
+ arguments=["-d", rvizconfig_file],
+ )
+
+ return LaunchDescription(
+ [joint_state_publisher_gui_node, robot_state_publisher_node, rviz_node]
+ )
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/package.xml b/my_dual_robot_cell/my_dual_robot_cell_description/package.xml
new file mode 100644
index 0000000..ef021ee
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_description/package.xml
@@ -0,0 +1,27 @@
+
+
+
+ my_dual_robot_cell_description
+ 1.0.0
+
+ This package contains an urdf of a shared workspace.
+ Felix Exner
+
+ BSD-3-Clause
+
+ Vihaan Shah
+
+ ament_cmake
+ joint_state_publisher
+ joint_state_publisher_gui
+ robot_state_publisher
+ rviz2
+ xacro
+ ur_description
+ ur_robot_driver
+ my_robot_cell_description
+
+
+ ament_cmake
+
+
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz b/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz
new file mode 100644
index 0000000..360c746
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_description/rviz/urdf.rviz
@@ -0,0 +1,358 @@
+Panels:
+ - Class: rviz_common/Displays
+ Help Height: 87
+ Name: Displays
+ Property Tree Widget:
+ Expanded:
+ - /RobotModel1
+ - /TF1
+ - /TF1/Tree1
+ Splitter Ratio: 0.5
+ Tree Height: 398
+ - Class: rviz_common/Views
+ Expanded:
+ - /Current View1
+ Name: Views
+ Splitter Ratio: 0.5
+Visualization Manager:
+ Class: ""
+ Displays:
+ - Alpha: 0.5
+ Cell Size: 1
+ Class: rviz_default_plugins/Grid
+ Color: 160; 160; 164
+ Enabled: true
+ Line Style:
+ Line Width: 0.029999999329447746
+ Value: Lines
+ Name: Grid
+ Normal Cell Count: 0
+ Offset:
+ X: 0
+ Y: 0
+ Z: 0
+ Plane: XY
+ Plane Cell Count: 10
+ Reference Frame:
+ Value: true
+ - Alpha: 1
+ Class: rviz_default_plugins/RobotModel
+ Collision Enabled: false
+ Description File: ""
+ Description Source: Topic
+ Description Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /robot_description
+ Enabled: true
+ Links:
+ All Links Enabled: true
+ Expand Joint Details: false
+ Expand Link Details: false
+ Expand Tree: false
+ Link Tree Style: Links in Alphabetic Order
+ alice_base:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_base_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_base_link_inertia:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_flange:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_forearm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_ft_frame:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_robot_mount:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_shoulder_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_tool0:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_upper_arm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_1_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_2_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_3_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_base:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_base_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_base_link_inertia:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_flange:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_forearm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_ft_frame:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_robot_mount:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_shoulder_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_tool0:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_upper_arm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_1_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_2_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_3_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ monitor:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ table:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ wall:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ world:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Mass Properties:
+ Inertia: false
+ Mass: false
+ Name: RobotModel
+ TF Prefix: ""
+ Update Interval: 0
+ Value: true
+ Visual Enabled: true
+ - Class: rviz_default_plugins/TF
+ Enabled: true
+ Frame Timeout: 15
+ Frames:
+ All Enabled: true
+ alice_base:
+ Value: true
+ alice_base_link:
+ Value: true
+ alice_base_link_inertia:
+ Value: true
+ alice_flange:
+ Value: true
+ alice_forearm_link:
+ Value: true
+ alice_ft_frame:
+ Value: true
+ alice_robot_mount:
+ Value: true
+ alice_shoulder_link:
+ Value: true
+ alice_tool0:
+ Value: true
+ alice_upper_arm_link:
+ Value: true
+ alice_wrist_1_link:
+ Value: true
+ alice_wrist_2_link:
+ Value: true
+ alice_wrist_3_link:
+ Value: true
+ bob_base:
+ Value: true
+ bob_base_link:
+ Value: true
+ bob_base_link_inertia:
+ Value: true
+ bob_flange:
+ Value: true
+ bob_forearm_link:
+ Value: true
+ bob_ft_frame:
+ Value: true
+ bob_robot_mount:
+ Value: true
+ bob_shoulder_link:
+ Value: true
+ bob_tool0:
+ Value: true
+ bob_upper_arm_link:
+ Value: true
+ bob_wrist_1_link:
+ Value: true
+ bob_wrist_2_link:
+ Value: true
+ bob_wrist_3_link:
+ Value: true
+ monitor:
+ Value: true
+ table:
+ Value: true
+ wall:
+ Value: true
+ world:
+ Value: true
+ Marker Scale: 1
+ Name: TF
+ Show Arrows: true
+ Show Axes: true
+ Show Names: false
+ Tree:
+ world:
+ table:
+ alice_robot_mount:
+ alice_base_link:
+ alice_base:
+ {}
+ alice_base_link_inertia:
+ alice_shoulder_link:
+ alice_upper_arm_link:
+ alice_forearm_link:
+ alice_wrist_1_link:
+ alice_wrist_2_link:
+ alice_wrist_3_link:
+ alice_flange:
+ alice_tool0:
+ {}
+ alice_ft_frame:
+ {}
+ bob_robot_mount:
+ bob_base_link:
+ bob_base:
+ {}
+ bob_base_link_inertia:
+ bob_shoulder_link:
+ bob_upper_arm_link:
+ bob_forearm_link:
+ bob_wrist_1_link:
+ bob_wrist_2_link:
+ bob_wrist_3_link:
+ bob_flange:
+ bob_tool0:
+ {}
+ bob_ft_frame:
+ {}
+ monitor:
+ {}
+ wall:
+ {}
+ Update Interval: 0
+ Value: true
+ Enabled: true
+ Global Options:
+ Background Color: 48; 48; 48
+ Fixed Frame: world
+ Frame Rate: 30
+ Name: root
+ Tools:
+ - Class: rviz_default_plugins/MoveCamera
+ Transformation:
+ Current:
+ Class: rviz_default_plugins/TF
+ Value: true
+ Views:
+ Current:
+ Class: rviz_default_plugins/Orbit
+ Distance: 4.675174713134766
+ Enable Stereo Rendering:
+ Stereo Eye Separation: 0.05999999865889549
+ Stereo Focal Distance: 1
+ Swap Stereo Eyes: false
+ Value: false
+ Focal Point:
+ X: 0.9431386590003967
+ Y: 0.6480544209480286
+ Z: 1.3101682662963867
+ Focal Shape Fixed Size: true
+ Focal Shape Size: 0.05000000074505806
+ Invert Z Axis: false
+ Name: Current View
+ Near Clip Distance: 0.009999999776482582
+ Pitch: 0.49500054121017456
+ Target Frame:
+ Value: Orbit (rviz)
+ Yaw: 4.259994983673096
+ Saved: ~
+Window Geometry:
+ Displays:
+ collapsed: false
+ Height: 1016
+ Hide Left Dock: false
+ Hide Right Dock: false
+ QMainWindow State: 000000ff00000000fd0000000100000000000001ad0000039efc0200000002fb000000100044006900730070006c006100790073010000003d00000222000000c900fffffffb0000000a00560069006500770073010000026500000176000000a400ffffff000005cd0000039e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
+ Views:
+ collapsed: false
+ Width: 1920
+ X: 0
+ Y: 27
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell.urdf.xacro b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell.urdf.xacro
new file mode 100644
index 0000000..7f86dcc
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell.urdf.xacro
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro
new file mode 100644
index 0000000..1d0ff25
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_description/urdf/my_dual_robot_cell_macro.xacro
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant
new file mode 100644
index 0000000..23da84d
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/.setup_assistant
@@ -0,0 +1,10 @@
+moveit_setup_assistant_config:
+ urdf:
+ package: my_dual_robot_cell_description
+ relative_path: urdf/my_dual_robot_cell.urdf.xacro
+ srdf:
+ relative_path: config/my_dual_robot_cell.srdf
+ package_settings:
+ author_name: Vihaan Shah
+ author_email: vihaan.shah@uconn.edu
+ generated_timestamp: 1719324402
\ No newline at end of file
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/CMakeLists.txt b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/CMakeLists.txt
new file mode 100644
index 0000000..0cb4e73
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 3.22)
+project(my_dual_robot_cell_moveit_config)
+
+find_package(ament_cmake REQUIRED)
+
+ament_package()
+
+install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}
+ PATTERN "setup_assistant.launch" EXCLUDE)
+install(DIRECTORY config DESTINATION share/${PROJECT_NAME})
+install(FILES .setup_assistant DESTINATION share/${PROJECT_NAME})
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/initial_positions.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/initial_positions.yaml
new file mode 100644
index 0000000..ecb90d7
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/initial_positions.yaml
@@ -0,0 +1,15 @@
+# Default initial positions for my_dual_robot_cell's ros2_control fake system
+
+initial_positions:
+ alice_elbow_joint: 0
+ alice_shoulder_lift_joint: 0
+ alice_shoulder_pan_joint: 0
+ alice_wrist_1_joint: 0
+ alice_wrist_2_joint: 0
+ alice_wrist_3_joint: 0
+ bob_elbow_joint: 0
+ bob_shoulder_lift_joint: 0
+ bob_shoulder_pan_joint: 0
+ bob_wrist_1_joint: 0
+ bob_wrist_2_joint: 0
+ bob_wrist_3_joint: 0
\ No newline at end of file
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml
new file mode 100644
index 0000000..f5ee057
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/joint_limits.yaml
@@ -0,0 +1,70 @@
+# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed
+
+# For beginners, we downscale velocity and acceleration limits.
+# You can always specify higher scaling factors (<= 1.0) in your motion requests. # Increase the values below to 1.0 to always move at maximum speed.
+default_velocity_scaling_factor: 0.1
+default_acceleration_scaling_factor: 0.1
+
+# Specific joint properties can be changed with the keys [max_position, min_position, max_velocity, max_acceleration]
+# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits]
+joint_limits:
+ alice_elbow_joint:
+ has_velocity_limits: true
+ max_velocity: 3.1415926535897931
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ alice_shoulder_lift_joint:
+ has_velocity_limits: true
+ max_velocity: 3.1415926535897931
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ alice_shoulder_pan_joint:
+ has_velocity_limits: true
+ max_velocity: 3.1415926535897931
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ alice_wrist_1_joint:
+ has_velocity_limits: true
+ max_velocity: 6.2831853071795862
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ alice_wrist_2_joint:
+ has_velocity_limits: true
+ max_velocity: 6.2831853071795862
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ alice_wrist_3_joint:
+ has_velocity_limits: true
+ max_velocity: 6.2831853071795862
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ bob_elbow_joint:
+ has_velocity_limits: true
+ max_velocity: 3.1415926535897931
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ bob_shoulder_lift_joint:
+ has_velocity_limits: true
+ max_velocity: 3.1415926535897931
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ bob_shoulder_pan_joint:
+ has_velocity_limits: true
+ max_velocity: 3.1415926535897931
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ bob_wrist_1_joint:
+ has_velocity_limits: true
+ max_velocity: 6.2831853071795862
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ bob_wrist_2_joint:
+ has_velocity_limits: true
+ max_velocity: 6.2831853071795862
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ bob_wrist_3_joint:
+ has_velocity_limits: true
+ max_velocity: 6.2831853071795862
+ has_acceleration_limits: true
+ max_acceleration: 5.0
\ No newline at end of file
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml
new file mode 100644
index 0000000..87cc61c
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/kinematics.yaml
@@ -0,0 +1,8 @@
+alice_manipulator:
+ kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
+ kinematics_solver_search_resolution: 0.0050000000000000001
+ kinematics_solver_timeout: 0.0050000000000000001
+bob_manipulator:
+ kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
+ kinematics_solver_search_resolution: 0.0050000000000000001
+ kinematics_solver_timeout: 0.0050000000000000001
\ No newline at end of file
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz
new file mode 100644
index 0000000..2cbcdc6
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit.rviz
@@ -0,0 +1,484 @@
+Panels:
+ - Class: rviz_common/Displays
+ Help Height: 87
+ Name: Displays
+ Property Tree Widget:
+ Expanded: ~
+ Splitter Ratio: 0.4957627058029175
+ Tree Height: 380
+ - Class: rviz_common/Selection
+ Name: Selection
+ - Class: rviz_common/Tool Properties
+ Expanded:
+ - /2D Goal Pose1
+ - /Publish Point1
+ Name: Tool Properties
+ Splitter Ratio: 0.5886790156364441
+ - Class: rviz_common/Views
+ Expanded:
+ - /Current View1
+ Name: Views
+ Splitter Ratio: 0.5
+Visualization Manager:
+ Class: ""
+ Displays:
+ - Alpha: 0.5
+ Cell Size: 1
+ Class: rviz_default_plugins/Grid
+ Color: 160; 160; 164
+ Enabled: true
+ Line Style:
+ Line Width: 0.029999999329447746
+ Value: Lines
+ Name: Grid
+ Normal Cell Count: 0
+ Offset:
+ X: 0
+ Y: 0
+ Z: 0
+ Plane: XY
+ Plane Cell Count: 10
+ Reference Frame:
+ Value: true
+ - Acceleration_Scaling_Factor: 0.1
+ Class: moveit_rviz_plugin/MotionPlanning
+ Enabled: true
+ Move Group Namespace: ""
+ MoveIt_Allow_Approximate_IK: false
+ MoveIt_Allow_External_Program: false
+ MoveIt_Allow_Replanning: false
+ MoveIt_Allow_Sensor_Positioning: false
+ MoveIt_Planning_Attempts: 10
+ MoveIt_Planning_Time: 5
+ MoveIt_Use_Cartesian_Path: false
+ MoveIt_Use_Constraint_Aware_IK: false
+ MoveIt_Workspace:
+ Center:
+ X: 0
+ Y: 0
+ Z: 0
+ Size:
+ X: 2
+ Y: 2
+ Z: 2
+ Name: MotionPlanning
+ Planned Path:
+ Color Enabled: true
+ Interrupt Display: true
+ Links:
+ All Links Enabled: true
+ Expand Joint Details: false
+ Expand Link Details: false
+ Expand Tree: false
+ Link Tree Style: Links in Alphabetic Order
+ alice_base:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_base_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_base_link_inertia:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_flange:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_forearm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_ft_frame:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_robot_mount:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_shoulder_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_tool0:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_upper_arm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_1_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_2_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_3_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_base:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_base_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_base_link_inertia:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_flange:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_forearm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_ft_frame:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_robot_mount:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_shoulder_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_tool0:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_upper_arm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_1_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_2_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_3_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ monitor:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ table:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ wall:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ world:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Loop Animation: false
+ Robot Alpha: 0.5
+ Robot Color: 150; 50; 150
+ Show Robot Collision: false
+ Show Robot Visual: true
+ Show Trail: false
+ State Display Time: 0.05 s
+ Trail Step Size: 1
+ Trajectory Topic: /display_planned_path
+ Use Sim Time: false
+ Planning Metrics:
+ Payload: 1
+ Show Joint Torques: false
+ Show Manipulability: false
+ Show Manipulability Index: false
+ Show Weight Limit: false
+ TextHeight: 0.07999999821186066
+ Planning Request:
+ Colliding Link Color: 255; 0; 0
+ Goal State Alpha: 1
+ Goal State Color: 250; 128; 0
+ Interactive Marker Size: 0
+ Joint Violation Color: 255; 0; 255
+ Planning Group: alice_manipulator
+ Query Goal State: true
+ Query Start State: false
+ Show Workspace: false
+ Start State Alpha: 1
+ Start State Color: 0; 255; 0
+ Planning Scene Topic: monitored_planning_scene
+ Robot Description: robot_description
+ Scene Geometry:
+ Scene Alpha: 0.8999999761581421
+ Scene Color: 50; 230; 50
+ Scene Display Time: 0.009999999776482582
+ Show Scene Geometry: true
+ Voxel Coloring: Z-Axis
+ Voxel Rendering: Occupied Voxels
+ Scene Robot:
+ Attached Body Color: 150; 50; 150
+ Links:
+ All Links Enabled: true
+ Expand Joint Details: false
+ Expand Link Details: false
+ Expand Tree: false
+ Link Tree Style: Links in Alphabetic Order
+ alice_base:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_base_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_base_link_inertia:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_flange:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_forearm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_ft_frame:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_robot_mount:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_shoulder_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_tool0:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ alice_upper_arm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_1_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_2_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ alice_wrist_3_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_base:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_base_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_base_link_inertia:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_flange:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_forearm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_ft_frame:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_robot_mount:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_shoulder_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_tool0:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ bob_upper_arm_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_1_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_2_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ bob_wrist_3_link:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ monitor:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ table:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ wall:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Value: true
+ world:
+ Alpha: 1
+ Show Axes: false
+ Show Trail: false
+ Robot Alpha: 1
+ Show Robot Collision: false
+ Show Robot Visual: true
+ Value: true
+ Velocity_Scaling_Factor: 0.1
+ Enabled: true
+ Global Options:
+ Background Color: 48; 48; 48
+ Fixed Frame: world
+ Frame Rate: 30
+ Name: root
+ Tools:
+ - Class: rviz_default_plugins/Interact
+ Hide Inactive Objects: true
+ - Class: rviz_default_plugins/MoveCamera
+ - Class: rviz_default_plugins/Select
+ - Class: rviz_default_plugins/FocusCamera
+ - Class: rviz_default_plugins/Measure
+ Line color: 128; 128; 0
+ - Class: rviz_default_plugins/SetInitialPose
+ Covariance x: 0.25
+ Covariance y: 0.25
+ Covariance yaw: 0.06853891909122467
+ Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /initialpose
+ - Class: rviz_default_plugins/SetGoal
+ Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /goal_pose
+ - Class: rviz_default_plugins/PublishPoint
+ Single click: true
+ Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /clicked_point
+ Transformation:
+ Current:
+ Class: rviz_default_plugins/TF
+ Value: true
+ Views:
+ Current:
+ Class: rviz_default_plugins/Orbit
+ Distance: 4.587055683135986
+ Enable Stereo Rendering:
+ Stereo Eye Separation: 0.05999999865889549
+ Stereo Focal Distance: 1
+ Swap Stereo Eyes: false
+ Value: false
+ Focal Point:
+ X: 0.4825928509235382
+ Y: 0.6104342937469482
+ Z: 1.4097795486450195
+ Focal Shape Fixed Size: true
+ Focal Shape Size: 0.05000000074505806
+ Invert Z Axis: false
+ Name: Current View
+ Near Clip Distance: 0.009999999776482582
+ Pitch: 0.41039803624153137
+ Target Frame:
+ Value: Orbit (rviz)
+ Yaw: 4.133575916290283
+ Saved: ~
+Window Geometry:
+ Displays:
+ collapsed: false
+ Height: 1016
+ Hide Left Dock: false
+ Hide Right Dock: false
+ MotionPlanning:
+ collapsed: false
+ MotionPlanning - Trajectory Slider:
+ collapsed: false
+ QMainWindow State: 000000ff00000000fd0000000400000000000001f30000039efc020000000bfb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d00000210000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb000000280020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000000000000000fb00000044004d006f00740069006f006e0050006c0061006e006e0069006e00670020002d0020005400720061006a006500630074006f0072007900200053006c00690064006500720000000000ffffffff0000004100fffffffb0000001c004d006f00740069006f006e0050006c0061006e006e0069006e00670100000253000001880000017d00ffffff00000001000001100000039efc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d0000039e000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004420000003efc0100000002fb0000000800540069006d00650100000000000004420000000000000000fb0000000800540069006d00650100000000000004500000000000000000000004710000039e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
+ Selection:
+ collapsed: false
+ Tool Properties:
+ collapsed: false
+ Views:
+ collapsed: false
+ Width: 1920
+ X: 0
+ Y: 27
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit_controllers.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit_controllers.yaml
new file mode 100644
index 0000000..dace306
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/moveit_controllers.yaml
@@ -0,0 +1,32 @@
+# MoveIt uses this configuration for controller management
+
+moveit_controller_manager: moveit_simple_controller_manager/MoveItSimpleControllerManager
+
+moveit_simple_controller_manager:
+ controller_names:
+ - alice_scaled_joint_trajectory_controller
+ - bob_scaled_joint_trajectory_controller
+
+ alice_scaled_joint_trajectory_controller:
+ type: FollowJointTrajectory
+ action_ns: follow_joint_trajectory
+ default: true
+ joints:
+ - alice_shoulder_pan_joint
+ - alice_shoulder_lift_joint
+ - alice_elbow_joint
+ - alice_wrist_1_joint
+ - alice_wrist_2_joint
+ - alice_wrist_3_joint
+
+ bob_scaled_joint_trajectory_controller:
+ type: FollowJointTrajectory
+ action_ns: follow_joint_trajectory
+ default: true
+ joints:
+ - bob_shoulder_pan_joint
+ - bob_shoulder_lift_joint
+ - bob_elbow_joint
+ - bob_wrist_1_joint
+ - bob_wrist_2_joint
+ - bob_wrist_3_joint
\ No newline at end of file
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/my_dual_robot_cell.srdf b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/my_dual_robot_cell.srdf
new file mode 100644
index 0000000..70480a0
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/my_dual_robot_cell.srdf
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/pilz_cartesian_limits.yaml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/pilz_cartesian_limits.yaml
new file mode 100644
index 0000000..b2997ca
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/config/pilz_cartesian_limits.yaml
@@ -0,0 +1,6 @@
+# Limits for the Pilz planner
+cartesian_limits:
+ max_trans_vel: 1.0
+ max_trans_acc: 2.25
+ max_trans_dec: -5.0
+ max_rot_vel: 1.57
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py
new file mode 100644
index 0000000..de5a476
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/launch/dual_ur_moveit.launch.py
@@ -0,0 +1,79 @@
+import os
+from pathlib import Path
+
+import yaml
+from ament_index_python.packages import get_package_share_directory
+from launch import LaunchDescription
+from launch.actions import (DeclareLaunchArgument, ExecuteProcess,
+ RegisterEventHandler)
+from launch.conditions import IfCondition
+from launch.event_handlers import OnProcessExit
+from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
+from launch_ros.actions import Node
+from launch_ros.substitutions import FindPackageShare
+from moveit_configs_utils import MoveItConfigsBuilder
+
+
+def load_yaml(package_name, file_path):
+ package_path = get_package_share_directory(package_name)
+ absolute_file_path = os.path.join(package_path, file_path)
+
+ try:
+ with open(absolute_file_path) as file:
+ return yaml.safe_load(file)
+ except OSError: # parent of IOError, OSError *and* WindowsError where available
+ return None
+
+
+def generate_launch_description():
+ moveit_config = MoveItConfigsBuilder(
+ "my_dual_robot_cell", package_name="my_dual_robot_cell_moveit_config"
+ ).to_moveit_configs()
+
+ move_group_configuration = {
+ "publish_robot_description_semantic": True,
+ "allow_trajectory_execution": True,
+ "publish_planning_scene": True,
+ "publish_geometry_updates": True,
+ "publish_state_updates": True,
+ "publish_transforms_updates": True,
+ }
+
+ move_group_params = [
+ moveit_config.to_dict(),
+ move_group_configuration,
+ ]
+
+ move_group_node = Node(
+ package="moveit_ros_move_group",
+ executable="move_group",
+ output="screen",
+ parameters=move_group_params,
+ additional_env={"DISPLAY": ":0"},
+ )
+
+ rviz_config_file = PathJoinSubstitution(
+ [FindPackageShare("my_dual_robot_cell_moveit_config"), "config", "moveit.rviz"]
+ )
+
+ rviz_node = Node(
+ package="rviz2",
+ executable="rviz2",
+ name="rviz2_moveit",
+ output="log",
+ arguments=["-d", rviz_config_file],
+ parameters=[
+ moveit_config.robot_description,
+ moveit_config.robot_description_semantic,
+ moveit_config.robot_description_kinematics,
+ moveit_config.planning_pipelines,
+ moveit_config.joint_limits,
+ ],
+ )
+
+ return LaunchDescription(
+ [
+ move_group_node,
+ rviz_node,
+ ]
+ )
diff --git a/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml
new file mode 100644
index 0000000..ae4308f
--- /dev/null
+++ b/my_dual_robot_cell/my_dual_robot_cell_moveit_config/package.xml
@@ -0,0 +1,41 @@
+
+
+
+ my_dual_robot_cell_moveit_config
+ 0.3.0
+
+ An automatically generated package with all the configuration and launch files for using the my_dual_robot_cell with the MoveIt Motion Planning Framework
+
+ Vihaan Shah
+
+ BSD-3-Clause
+
+ http://moveit.ros.org/
+ https://github.com/ros-planning/moveit2/issues
+ https://github.com/ros-planning/moveit2
+
+ Vihaan Shah
+
+ ament_cmake
+
+ moveit_ros_move_group
+ moveit_kinematics
+ moveit_planners
+ moveit_simple_controller_manager
+ joint_state_publisher
+ joint_state_publisher_gui
+ tf2_ros
+ xacro
+ moveit_configs_utils
+ moveit_ros_move_group
+ moveit_ros_visualization
+ my_dual_robot_cell_description
+ rviz2
+ rviz_common
+ rviz_default_plugins
+
+
+
+ ament_cmake
+
+