import os import yaml from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, OpaqueFunction from launch.substitutions import LaunchConfiguration, PathJoinSubstitution from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare from ament_index_python import get_package_share_directory def load_yaml(package_name: str, file_path: str): package_path = get_package_share_directory(package_name) absolute_file_path = os.path.join(package_path, file_path) try: with open(absolute_file_path, "r") as f: return yaml.safe_load(f) except EnvironmentError: return None def load_file(package_name: str, file_path: str) -> str: package_path = get_package_share_directory(package_name) absolut_file_path = os.path.join(package_path, file_path) try: with open(absolut_file_path, "r") as f: return f.read() except EnvironmentError: return None def generate_launch_description(): #============= #================================================================= Start initialize launch args ========================================================== #============= # Launch arguments launch_args = [] launch_args.append( DeclareLaunchArgument( name="robot_description", description="Robot description XML file." ) ) launch_args.append(DeclareLaunchArgument( name="sim", default_value="true", description="Launch robot in simulation or on real setup." )) #============= #================================================================= Start launching nodes ========================================================== #============= # Configure robot_description robot_description = {"robot_description": LaunchConfiguration("robot_description")} # Robot semantics SRDF robot_description_semantic = { "robot_description_semantic": load_file("rasms_moveit_config", "srdf/rasms_description.srdf") } # Kinematics kinematics_yaml = load_yaml("rasms_moveit_config", "config/kinematics.yml") # Update group name kinematics_yaml["rasms_description_arm"] = kinematics_yaml["group_name"] del kinematics_yaml["group_name"] # Joint limits robot_description_planning = { "robot_description_planning": PathJoinSubstitution( [ FindPackageShare("rasms_moveit_config"), "config/joint_limits.yml" ] ) } # Planning #ompl_yaml = load_yaml("rasms_moveit_config", "config/ompl_planning.yml") planning = { "move_group": { "planning_plugin": "ompl_interface/OMPLPlanner", "request_adapters": "default_planner_request_adapters/AddTimeParameterization default_planner_request_adapters/FixWorkspaceBounds default_planner_request_adapters/FixStartStateBounds default_planner_request_adapters/FixStartStateCollision default_planner_request_adapters/FixStartStatePathConstraints", "start_state_max_bounds_error": 0.1 } } # Trajectory execution trajectory_execution = {"allow_trajectory_execution": True, "moveit_manage_controllers": True} # Controllers moveit_simple_controller_yml = load_yaml( "rasms_moveit_config", "config/rasms_moveit_controllers.yml" ) moveit_controllers = {"moveit_simple_controller_manager": moveit_simple_controller_yml, "moveit_controller_manager": "moveit_simple_controller_manager/MoveItSimpleControllerManager"} ompl_planning_pipeline_config = { "ompl": { "planning_plugin": "ompl_interface/OMPLPlanner", "request_adapters": """default_planner_request_adapters/AddTimeOptimalParameterization default_planner_request_adapters/FixWorkspaceBounds default_planner_request_adapters/FixStartStateBounds default_planner_request_adapters/FixStartStateCollision default_planner_request_adapters/FixStartStatePathConstraints""", "start_state_max_bounds_error": 0.1, } } ompl_planning_yml = load_yaml( "rasms_moveit_config", "config/ompl_planning.yml" ) ompl_planning_pipeline_config["ompl"].update(ompl_planning_yml) # Planning scene planning_scene_monitor_parameters = {"publish_planning_scene": True, "publish_geometry_updates": True, "publish_state_updates": True, "publish_transforms_updates": True} moveit_cpp_yaml_file_name = ( get_package_share_directory("rasms_moveit_config") + "/config/moveit_cpp.yml" ) # Time configuration use_sim_time = {"use_sime_time": LaunchConfiguration("sim")} # Simple move_group interface move_group_node = Node( package="moveit_ros_move_group", executable="move_group", output="screen", arguments=["--ros-args"], parameters=[ robot_description, robot_description_semantic, kinematics_yaml, robot_description_planning, ompl_planning_pipeline_config, planning, trajectory_execution, moveit_controllers, planning_scene_monitor_parameters, use_sim_time ] ) # Node for test moveit_cpp interface moveit_cpp_node = Node( name="moveit_cpp_actions", package="rasms_moveit_actions", executable="rasms_moveit", output="screen", parameters=[ moveit_cpp_yaml_file_name, robot_description, robot_description_semantic, kinematics_yaml, ompl_planning_pipeline_config, moveit_controllers, ], ) # RViz rviz_config = PathJoinSubstitution([FindPackageShare("rasms_moveit_config"), "config/rasms.rviz"]) rviz = Node( package="rviz2", executable="rviz2", parameters=[ robot_description, robot_description_semantic, use_sim_time, kinematics_yaml ], arguments=[ '-d', rviz_config ] ) launch_nodes = [] launch_nodes.append(rviz) launch_nodes.append(move_group_node) #launch_nodes.append(moveit_cpp_node) return LaunchDescription( launch_args + launch_nodes )