|  | 
|  | 1 | +# Copyright (c) 2025 Universal Robots A/S | 
|  | 2 | +# | 
|  | 3 | +# Redistribution and use in source and binary forms, with or without | 
|  | 4 | +# modification, are permitted provided that the following conditions are met: | 
|  | 5 | +# | 
|  | 6 | +#    * Redistributions of source code must retain the above copyright | 
|  | 7 | +#      notice, this list of conditions and the following disclaimer. | 
|  | 8 | +# | 
|  | 9 | +#    * Redistributions in binary form must reproduce the above copyright | 
|  | 10 | +#      notice, this list of conditions and the following disclaimer in the | 
|  | 11 | +#      documentation and/or other materials provided with the distribution. | 
|  | 12 | +# | 
|  | 13 | +#    * Neither the name of the {copyright_holder} nor the names of its | 
|  | 14 | +#      contributors may be used to endorse or promote products derived from | 
|  | 15 | +#      this software without specific prior written permission. | 
|  | 16 | +# | 
|  | 17 | +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
|  | 18 | +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|  | 19 | +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
|  | 20 | +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE | 
|  | 21 | +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
|  | 22 | +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
|  | 23 | +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
|  | 24 | +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
|  | 25 | +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
|  | 26 | +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
|  | 27 | +# POSSIBILITY OF SUCH DAMAGE. | 
|  | 28 | + | 
|  | 29 | +from launch import LaunchDescription | 
|  | 30 | +from launch.actions import DeclareLaunchArgument, IncludeLaunchDescription | 
|  | 31 | +from launch.launch_description_sources import PythonLaunchDescriptionSource | 
|  | 32 | +from launch.substitutions import LaunchConfiguration, ThisLaunchFileDir | 
|  | 33 | + | 
|  | 34 | + | 
|  | 35 | +def generate_launch_description(): | 
|  | 36 | +    # Declare arguments | 
|  | 37 | +    declared_arguments = [] | 
|  | 38 | +    declared_arguments.append( | 
|  | 39 | +        DeclareLaunchArgument( | 
|  | 40 | +            "robot_ip", | 
|  | 41 | +            description="IP address by which the robot can be reached.", | 
|  | 42 | +        ) | 
|  | 43 | +    ) | 
|  | 44 | +    declared_arguments.append( | 
|  | 45 | +        DeclareLaunchArgument( | 
|  | 46 | +            "use_mock_hardware", | 
|  | 47 | +            default_value="false", | 
|  | 48 | +            description="Start robot with mock hardware mirroring command to its states.", | 
|  | 49 | +        ) | 
|  | 50 | +    ) | 
|  | 51 | +    declared_arguments.append( | 
|  | 52 | +        DeclareLaunchArgument( | 
|  | 53 | +            "mock_sensor_commands", | 
|  | 54 | +            default_value="false", | 
|  | 55 | +            description="Enable mock command interfaces for sensors used for simple simulations. " | 
|  | 56 | +            "Used only if 'use_mock_hardware' parameter is true.", | 
|  | 57 | +        ) | 
|  | 58 | +    ) | 
|  | 59 | +    declared_arguments.append( | 
|  | 60 | +        DeclareLaunchArgument( | 
|  | 61 | +            "initial_joint_controller", | 
|  | 62 | +            default_value="scaled_joint_trajectory_controller", | 
|  | 63 | +            description="Initially loaded robot controller.", | 
|  | 64 | +            choices=[ | 
|  | 65 | +                "scaled_joint_trajectory_controller", | 
|  | 66 | +                "joint_trajectory_controller", | 
|  | 67 | +                "forward_velocity_controller", | 
|  | 68 | +                "forward_position_controller", | 
|  | 69 | +                "freedrive_mode_controller", | 
|  | 70 | +                "passthrough_trajectory_controller", | 
|  | 71 | +            ], | 
|  | 72 | +        ) | 
|  | 73 | +    ) | 
|  | 74 | +    declared_arguments.append( | 
|  | 75 | +        DeclareLaunchArgument( | 
|  | 76 | +            "activate_joint_controller", | 
|  | 77 | +            default_value="true", | 
|  | 78 | +            description="Activate loaded joint controller.", | 
|  | 79 | +        ) | 
|  | 80 | +    ) | 
|  | 81 | + | 
|  | 82 | +    # Initialize Arguments | 
|  | 83 | +    robot_ip = LaunchConfiguration("robot_ip") | 
|  | 84 | +    use_mock_hardware = LaunchConfiguration("use_mock_hardware") | 
|  | 85 | +    mock_sensor_commands = LaunchConfiguration("mock_sensor_commands") | 
|  | 86 | +    initial_joint_controller = LaunchConfiguration("initial_joint_controller") | 
|  | 87 | +    activate_joint_controller = LaunchConfiguration("activate_joint_controller") | 
|  | 88 | + | 
|  | 89 | +    base_launch = IncludeLaunchDescription( | 
|  | 90 | +        PythonLaunchDescriptionSource([ThisLaunchFileDir(), "/ur_control.launch.py"]), | 
|  | 91 | +        launch_arguments={ | 
|  | 92 | +            "ur_type": "ur18", | 
|  | 93 | +            "robot_ip": robot_ip, | 
|  | 94 | +            "use_mock_hardware": use_mock_hardware, | 
|  | 95 | +            "mock_sensor_commands": mock_sensor_commands, | 
|  | 96 | +            "initial_joint_controller": initial_joint_controller, | 
|  | 97 | +            "activate_joint_controller": activate_joint_controller, | 
|  | 98 | +        }.items(), | 
|  | 99 | +    ) | 
|  | 100 | + | 
|  | 101 | +    return LaunchDescription(declared_arguments + [base_launch]) | 
0 commit comments