19from launch
import LaunchDescription
20from launch.actions
import DeclareLaunchArgument, IncludeLaunchDescription, OpaqueFunction
21from launch.launch_description_sources
import PythonLaunchDescriptionSource
22from launch.substitutions
import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution
23from launch_ros.actions
import Node
24from launch_ros.substitutions
import FindPackageShare
28from ament_index_python.packages
import get_package_share_directory
34 """utility function to construct radian values from yaml."""
35 value = loader.construct_scalar(node)
39 raise Exception(
"invalid expression: %s" % value)
43 """utility function for converting degrees into radians from yaml."""
48 package_path = get_package_share_directory(package_name)
49 absolute_file_path = os.path.join(package_path, file_path)
52 yaml.SafeLoader.add_constructor(
"!radians", construct_angle_radians)
53 yaml.SafeLoader.add_constructor(
"!degrees", construct_angle_degrees)
55 raise Exception(
"yaml support not available; install python-yaml")
58 with open(absolute_file_path)
as file:
59 return yaml.safe_load(file)
72 runtime_config_package = LaunchConfiguration(
"runtime_config_package")
73 controllers_file = LaunchConfiguration(
"controllers_file")
74 description_package = LaunchConfiguration(
"description_package")
75 description_file = LaunchConfiguration(
"description_file")
76 moveit_config_package = LaunchConfiguration(
"moveit_config_package")
77 moveit_config_file = LaunchConfiguration(
"moveit_config_file")
78 prefix = LaunchConfiguration(
"prefix")
80 robot_description_content = Command(
82 PathJoinSubstitution([FindExecutable(name=
"xacro")]),
85 [FindPackageShare(description_package),
"urdf", description_file]
99 robot_description = {
"robot_description": robot_description_content}
102 robot_description_semantic_content = Command(
104 PathJoinSubstitution([FindExecutable(name=
"xacro")]),
106 PathJoinSubstitution(
107 [FindPackageShare(moveit_config_package),
"srdf", moveit_config_file]
121 robot_description_semantic = {
"robot_description_semantic": robot_description_semantic_content}
123 kinematics_yaml =
load_yaml(
"ur_moveit_config",
"config/kinematics.yaml")
124 robot_description_kinematics = {
"robot_description_kinematics": kinematics_yaml}
126 smacc2_sm_config = PathJoinSubstitution(
128 FindPackageShare(
"sm_test_moveit_ur5_sim"),
130 "sm_test_moveit_ur5_sim_config.yaml",
134 sm_test_moveit_ur5_sim_node = Node(
135 package=
"sm_test_moveit_ur5_sim",
136 executable=
"sm_test_moveit_ur5_sim_node",
138 prefix=
"xterm -xrm 'XTerm*scrollBar: true' -xrm 'xterm*rightScrollBar: true' -hold -sl 10000 -geometry 1000x600 -e",
140 {
"use_sim_time":
True},
142 robot_description_semantic,
143 robot_description_kinematics,
148 smacc2_sm_rviz = PathJoinSubstitution(
150 FindPackageShare(
"sm_test_moveit_ur5_sim"),
157 start_rviz_cmd = Node(
161 arguments=[
"-d", smacc2_sm_rviz],
164 {
"use_sim_time":
True},
166 robot_description_semantic,
167 robot_description_kinematics,
171 ur_control_launch = IncludeLaunchDescription(
172 PythonLaunchDescriptionSource(
173 [FindPackageShare(
"ur_simulation_gazebo"),
"/launch",
"/ur_sim_control.launch.py"]
177 "runtime_config_package": runtime_config_package,
178 "controllers_file": controllers_file,
179 "description_package": description_package,
180 "description_file": description_file,
182 "launch_rviz":
"false",
186 ur_moveit_launch = IncludeLaunchDescription(
187 PythonLaunchDescriptionSource(
188 [FindPackageShare(
"ur_moveit_config"),
"/launch",
"/ur_moveit.launch.py"]
192 "description_package": description_package,
193 "description_file": description_file,
194 "moveit_config_package": moveit_config_package,
195 "moveit_config_file": moveit_config_file,
196 "use_sim_time":
"true",
198 "launch_rviz":
"false",
205 sm_test_moveit_ur5_sim_node,
209 return nodes_to_launch
213 declared_arguments = []
215 declared_arguments.append(
216 DeclareLaunchArgument(
217 "runtime_config_package",
218 default_value=
"ur_bringup",
219 description=
'Package with the controller\'s configuration in "config" folder. \
220 Usually the argument is not set, it enables use of a custom setup.',
223 declared_arguments.append(
224 DeclareLaunchArgument(
226 default_value=
"ur_controllers.yaml",
227 description=
"YAML file with the controllers configuration.",
230 declared_arguments.append(
231 DeclareLaunchArgument(
232 "description_package",
233 default_value=
"ur_description",
234 description=
"Description package with robot URDF/XACRO files. Usually the argument \
235 is not set, it enables use of a custom description.",
238 declared_arguments.append(
239 DeclareLaunchArgument(
241 default_value=
"ur.urdf.xacro",
242 description=
"URDF/XACRO description file with the robot.",
245 declared_arguments.append(
246 DeclareLaunchArgument(
247 "moveit_config_package",
248 default_value=
"ur_moveit_config",
249 description=
"MoveIt config package with robot SRDF/XACRO files. Usually the argument \
250 is not set, it enables use of a custom moveit config.",
253 declared_arguments.append(
254 DeclareLaunchArgument(
255 "moveit_config_file",
256 default_value=
"ur.srdf.xacro",
257 description=
"MoveIt SRDF/XACRO description file with the robot.",
260 declared_arguments.append(
261 DeclareLaunchArgument(
264 description=
"Prefix of the joint names, useful for \
265 multi-robot setup. If changed than also joint names in the controllers' configuration \
266 have to be updated.",
269 declared_arguments.append(
270 DeclareLaunchArgument(
"launch_rviz", default_value=
"true", description=
"Launch RViz?")
273 return LaunchDescription(declared_arguments + [OpaqueFunction(function=launch_setup)])
def construct_angle_degrees(loader, node)
def construct_angle_radians(loader, node)
def launch_setup(context, *args, **kwargs)
def load_yaml(package_name, file_path)
def generate_launch_description()