From 53c46c11c09465a3d4bb5d24c8f006082c5f6777 Mon Sep 17 00:00:00 2001 From: Nicolas Hiillos Date: Thu, 23 Mar 2023 09:36:49 +0200 Subject: [PATCH] Fix virtual pen, make moveit aware of pen --- .../urdf/lite6/lite6.urdf.xacro | 47 +- .../urdf/lite6/lite6_robot_macro.xacro | 10 +- .../urdf/xarm_device.urdf.xacro | 4 +- .../urdf/xarm_device_macro.xacro | 4 +- .../_robot_moveit_gazebo_fake.launch.py | 11 +- .../srdf/xarm.srdf.xacro | 4 +- .../srdf/xarm_macro.srdf.xacro | 4 +- .../launch/robots/lite6_table.launch.py | 7 +- .../launch/lite6_gazebo.launch.py | 448 ++++++++++++++++-- 9 files changed, 472 insertions(+), 67 deletions(-) diff --git a/src/custom_xarm_description/urdf/lite6/lite6.urdf.xacro b/src/custom_xarm_description/urdf/lite6/lite6.urdf.xacro index f0682a3..f79dec7 100755 --- a/src/custom_xarm_description/urdf/lite6/lite6.urdf.xacro +++ b/src/custom_xarm_description/urdf/lite6/lite6.urdf.xacro @@ -363,5 +363,50 @@ --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + odom:=pen_position + + world + + ${prefix}link6 + + + + + 10 + + + + + - \ No newline at end of file + diff --git a/src/custom_xarm_description/urdf/lite6/lite6_robot_macro.xacro b/src/custom_xarm_description/urdf/lite6/lite6_robot_macro.xacro index aaa0860..a3f4a25 100755 --- a/src/custom_xarm_description/urdf/lite6/lite6_robot_macro.xacro +++ b/src/custom_xarm_description/urdf/lite6/lite6_robot_macro.xacro @@ -6,14 +6,14 @@ robot_ip:='' report_type:='normal' baud_checkset:='true' default_gripper_baud:=2000000 "> - - - - + + + + - + diff --git a/src/custom_xarm_description/urdf/xarm_device.urdf.xacro b/src/custom_xarm_description/urdf/xarm_device.urdf.xacro index 46ab860..e868a4d 100755 --- a/src/custom_xarm_description/urdf/xarm_device.urdf.xacro +++ b/src/custom_xarm_description/urdf/xarm_device.urdf.xacro @@ -33,11 +33,11 @@ - + - + - + - \ No newline at end of file + diff --git a/src/custom_xarm_moveit_config/launch/_robot_moveit_gazebo_fake.launch.py b/src/custom_xarm_moveit_config/launch/_robot_moveit_gazebo_fake.launch.py index 4e81ae4..cfbfd38 100644 --- a/src/custom_xarm_moveit_config/launch/_robot_moveit_gazebo_fake.launch.py +++ b/src/custom_xarm_moveit_config/launch/_robot_moveit_gazebo_fake.launch.py @@ -13,6 +13,7 @@ from launch.substitutions import LaunchConfiguration, PathJoinSubstitution from launch_ros.substitutions import FindPackageShare from launch_ros.actions import Node +from launch.actions import TimerAction def launch_setup(context, *args, **kwargs): prefix = LaunchConfiguration('prefix', default='') @@ -184,8 +185,8 @@ def launch_setup(context, *args, **kwargs): # robot gazebo launch # xarm_gazebo/launch/_robot_beside_table_gazebo.launch.py robot_gazebo_launch = IncludeLaunchDescription( - #PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('custom_xarm_gazebo'), 'launch', '_robot_beside_table_gazebo.launch.py'])), - PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('draw_svg'), 'launch', 'robots', 'lite6_table.launch.py'])), + PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('custom_xarm_gazebo'), 'launch', '_robot_beside_table_gazebo.launch.py'])), + #PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('draw_svg'), 'launch', 'robots', 'lite6_table.launch.py'])), launch_arguments={ 'prefix': prefix, 'hw_ns': hw_ns, @@ -198,6 +199,7 @@ def launch_setup(context, *args, **kwargs): 'robot_type': robot_type, 'ros2_control_plugin': ros2_control_plugin, 'load_controller': 'true', + #'load_controller': 'false', }.items(), ) @@ -206,7 +208,10 @@ def launch_setup(context, *args, **kwargs): robot_moveit_common_launch, joint_state_publisher_node, ros2_control_launch, - robot_gazebo_launch, + # Wait before launching gazebo + TimerAction(period=5.0, actions=[ + robot_gazebo_launch, + ]), ] + load_controllers diff --git a/src/custom_xarm_moveit_config/srdf/xarm.srdf.xacro b/src/custom_xarm_moveit_config/srdf/xarm.srdf.xacro index 6fbc6c9..bb67277 100644 --- a/src/custom_xarm_moveit_config/srdf/xarm.srdf.xacro +++ b/src/custom_xarm_moveit_config/srdf/xarm.srdf.xacro @@ -8,8 +8,8 @@ - + - \ No newline at end of file + diff --git a/src/custom_xarm_moveit_config/srdf/xarm_macro.srdf.xacro b/src/custom_xarm_moveit_config/srdf/xarm_macro.srdf.xacro index d3f5ade..3acc277 100644 --- a/src/custom_xarm_moveit_config/srdf/xarm_macro.srdf.xacro +++ b/src/custom_xarm_moveit_config/srdf/xarm_macro.srdf.xacro @@ -9,7 +9,7 @@ - + @@ -25,4 +25,4 @@ add_gripper="${add_gripper}" add_vacuum_gripper="${add_vacuum_gripper}" add_other_geometry="${add_other_geometry}" /> - \ No newline at end of file + diff --git a/src/draw_svg/launch/robots/lite6_table.launch.py b/src/draw_svg/launch/robots/lite6_table.launch.py index 0b1699f..c6cced0 100644 --- a/src/draw_svg/launch/robots/lite6_table.launch.py +++ b/src/draw_svg/launch/robots/lite6_table.launch.py @@ -54,12 +54,12 @@ def launch_setup(context, *args, **kwargs): # robot_description # xarm_description/launch/lib/robot_description_lib.py - mod = load_python_launch_file_as_module(os.path.join(get_package_share_directory('xarm_description'), 'launch', 'lib', 'robot_description_lib.py')) + mod = load_python_launch_file_as_module(os.path.join(get_package_share_directory('custom_xarm_description'), 'launch', 'lib', 'robot_description_lib.py')) #mod = load_python_launch_file_as_module(os.path.join(get_package_share_directory('draw_svg'), 'launch', 'robots', 'xarm_with_pen.py')) get_xacro_file_content = getattr(mod, 'get_xacro_file_content') robot_description = { 'robot_description': get_xacro_file_content( - xacro_file=PathJoinSubstitution([FindPackageShare('xarm_description'), 'urdf', 'xarm_device.urdf.xacro']), + xacro_file=PathJoinSubstitution([FindPackageShare('custom_xarm_description'), 'urdf', 'xarm_device.urdf.xacro']), #xacro_file=PathJoinSubstitution([FindPackageShare('draw_svg'), 'urdf', 'xarm_pen.urdf.xacro']), arguments={ 'prefix': prefix, @@ -105,6 +105,7 @@ def launch_setup(context, *args, **kwargs): # gazebo_ros/launch/gazebo.launch.py #xarm_gazebo_world = PathJoinSubstitution([FindPackageShare('xarm_gazebo'), 'worlds', 'table.world']) xarm_gazebo_world = PathJoinSubstitution([FindPackageShare('draw_svg'), 'worlds', 'draw_svg_world.sdf']) + #xarm_gazebo_world = PathJoinSubstitution([FindPackageShare('custom_xarm_gazebo'), 'worlds', 'table.world']) gazebo_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('gazebo_ros'), 'launch', 'gazebo.launch.py'])), launch_arguments={ @@ -143,6 +144,8 @@ def launch_setup(context, *args, **kwargs): load_controllers = [] if load_controller.perform(context) in ('True', 'true'): for controller in controllers: + #print("Attempting to load: ", controller) + #input() load_controllers.append(Node( package='controller_manager', #executable='spawner.py', diff --git a/src/lite6_controller/launch/lite6_gazebo.launch.py b/src/lite6_controller/launch/lite6_gazebo.launch.py index 6733c38..bef9ae2 100644 --- a/src/lite6_controller/launch/lite6_gazebo.launch.py +++ b/src/lite6_controller/launch/lite6_gazebo.launch.py @@ -1,47 +1,63 @@ -import os -from launch import LaunchDescription -from launch.actions import OpaqueFunction, IncludeLaunchDescription, DeclareLaunchArgument -from launch.launch_description_sources import PythonLaunchDescriptionSource -from launch.substitutions import LaunchConfiguration, PathJoinSubstitution -from launch_ros.substitutions import FindPackageShare -from launch_ros.actions import Node +#!/usr/bin/env -S ros2 launch +"""Launch Python example for following a target""" +import os from ament_index_python import get_package_share_directory from launch.launch_description_sources import load_python_launch_file_as_module from launch import LaunchDescription -from launch.actions import RegisterEventHandler, EmitEvent +from launch.actions import IncludeLaunchDescription, DeclareLaunchArgument, RegisterEventHandler +from launch.launch_description_sources import PythonLaunchDescriptionSource +from launch.substitutions import LaunchConfiguration, PathJoinSubstitution, Command, FindExecutable +from launch_ros.actions import Node +from launch_ros.substitutions import FindPackageShare from launch.event_handlers import OnProcessExit -from launch.events import Shutdown +from launch.actions import OpaqueFunction def launch_setup(context, *args, **kwargs): + use_sim_time = LaunchConfiguration("use_sim_time", default=True) + log_level = LaunchConfiguration("log_level", default='info') + rviz_config = LaunchConfiguration('rviz_config', default=os.path.join(get_package_share_directory("draw_svg"), "rviz", "ign_moveit2_examples.rviz")) + prefix = LaunchConfiguration('prefix', default='') - hw_ns = LaunchConfiguration('hw_ns', default='ufactory') - limited = LaunchConfiguration('limited', default=True) + hw_ns = LaunchConfiguration('hw_ns', default='xarm') + limited = LaunchConfiguration('limited', default=False) effort_control = LaunchConfiguration('effort_control', default=False) velocity_control = LaunchConfiguration('velocity_control', default=False) add_gripper = LaunchConfiguration('add_gripper', default=False) add_vacuum_gripper = LaunchConfiguration('add_vacuum_gripper', default=False) - - add_realsense_d435i = LaunchConfiguration('add_realsense_d435i', default=False) + dof = LaunchConfiguration('dof', default=6) + robot_type = LaunchConfiguration('robot_type', default='lite') + ros2_control_plugin = LaunchConfiguration('ros2_control_plugin', default='gazebo_ros2_control/GazeboSystem') add_other_geometry = LaunchConfiguration('add_other_geometry', default=False) - geometry_type = LaunchConfiguration('geometry_type', default='box') - geometry_mass = LaunchConfiguration('geometry_mass', default=0.1) + #geometry_type = LaunchConfiguration('geometry_type', default='box') + geometry_type = LaunchConfiguration('geometry_type', default='cylinder') + geometry_mass = LaunchConfiguration('geometry_mass', default=0.05) geometry_height = LaunchConfiguration('geometry_height', default=0.1) - geometry_radius = LaunchConfiguration('geometry_radius', default=0.1) - geometry_length = LaunchConfiguration('geometry_length', default=0.1) + geometry_radius = LaunchConfiguration('geometry_radius', default=0.005) + geometry_length = LaunchConfiguration('geometry_length', default=0.07) geometry_width = LaunchConfiguration('geometry_width', default=0.1) geometry_mesh_filename = LaunchConfiguration('geometry_mesh_filename', default='') geometry_mesh_origin_xyz = LaunchConfiguration('geometry_mesh_origin_xyz', default='"0 0 0"') geometry_mesh_origin_rpy = LaunchConfiguration('geometry_mesh_origin_rpy', default='"0 0 0"') geometry_mesh_tcp_xyz = LaunchConfiguration('geometry_mesh_tcp_xyz', default='"0 0 0"') geometry_mesh_tcp_rpy = LaunchConfiguration('geometry_mesh_tcp_rpy', default='"0 0 0"') + load_controller = LaunchConfiguration('load_controller', default=True) - # robot moveit fake launch - # xarm_moveit_config/launch/_robot_moveit_fake.launch.py - robot_moveit_gazebo_fake_launch = IncludeLaunchDescription( - PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('custom_xarm_moveit_config'), 'launch', '_robot_moveit_gazebo_fake.launch.py'])), + ros_namespace = LaunchConfiguration('ros_namespace', default='').perform(context) + + no_gui_ctrl = LaunchConfiguration('no_gui_ctrl', default=False) + + ros2_control_plugin = LaunchConfiguration('ros2_control_plugin', default='gazebo_ros2_control/GazeboSystem') + controllers_name = LaunchConfiguration('controllers_name', default='fake_controllers') + moveit_controller_manager_key = LaunchConfiguration('moveit_controller_manager_key', default='moveit_simple_controller_manager') + moveit_controller_manager_value = LaunchConfiguration('moveit_controller_manager_value', default='moveit_simple_controller_manager/MoveItSimpleControllerManager') + + # robot moveit common launch + # xarm_moveit_config/launch/_robot_moveit_common.launch.py + robot_moveit_common_launch = IncludeLaunchDescription( + PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('custom_xarm_moveit_config'), 'launch', '_robot_moveit_common.launch.py'])), launch_arguments={ 'prefix': prefix, 'hw_ns': hw_ns, @@ -49,11 +65,15 @@ def launch_setup(context, *args, **kwargs): 'effort_control': effort_control, 'velocity_control': velocity_control, 'add_gripper': add_gripper, + # 'add_gripper': add_gripper if robot_type.perform(context) == 'xarm' else 'false', 'add_vacuum_gripper': add_vacuum_gripper, - 'dof': '6', - 'robot_type': 'lite', + 'dof': dof, + 'robot_type': robot_type, 'no_gui_ctrl': 'false', - 'add_realsense_d435i': add_realsense_d435i, + 'ros2_control_plugin': ros2_control_plugin, + 'controllers_name': controllers_name, + 'moveit_controller_manager_key': moveit_controller_manager_key, + 'moveit_controller_manager_value': moveit_controller_manager_value, 'add_other_geometry': add_other_geometry, 'geometry_type': geometry_type, 'geometry_mass': geometry_mass, @@ -66,12 +86,167 @@ def launch_setup(context, *args, **kwargs): 'geometry_mesh_origin_rpy': geometry_mesh_origin_rpy, 'geometry_mesh_tcp_xyz': geometry_mesh_tcp_xyz, 'geometry_mesh_tcp_rpy': geometry_mesh_tcp_rpy, + 'use_sim_time': 'true' }.items(), ) + # robot gazebo launch + # xarm_gazebo/launch/_robot_beside_table_gazebo.launch.py + robot_gazebo_launch = IncludeLaunchDescription( + #PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('xarm_gazebo'), 'launch', '_robot_beside_table_gazebo.launch.py'])), + #PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('custom_xarm_gazebo'), 'launch', '_robot_beside_table_gazebo.launch.py'])), + PythonLaunchDescriptionSource(PathJoinSubstitution([FindPackageShare('draw_svg'), 'launch', 'robots', 'lite6_table.launch.py'])), + launch_arguments={ + 'prefix': prefix, + 'hw_ns': hw_ns, + 'limited': limited, + 'effort_control': effort_control, + 'velocity_control': velocity_control, + 'add_gripper': add_gripper, + 'add_vacuum_gripper': add_vacuum_gripper, + 'dof': dof, + 'robot_type': robot_type, + 'ros2_control_plugin': ros2_control_plugin, + 'load_controller': 'true', + }.items(), + ) + + # URDF + _robot_description_xml = Command( + [ + PathJoinSubstitution([FindExecutable(name="xacro")]), + " ", + PathJoinSubstitution( + [FindPackageShare('draw_svg'), 'urdf', 'xarm_pen.urdf.xacro'] + ), + #PathJoinSubstitution( + # [ + # FindPackageShare('xarm_description'), + # "urdf", + # "lite6", + # #"lite6.urdf.xacro", + # "lite6_robot_macro.xacro", + # ] + #), + " ", + #"name:=", "lite6", " ", + "prefix:=", " ", + "hw_ns:=", hw_ns, " ", + "limited:=", limited, " ", + "effort_control:=", effort_control, " ", + "velocity_control:=", velocity_control, " ", + "add_gripper:=", add_gripper, " ", + "add_vacuum_gripper:=", add_vacuum_gripper, " ", + "dof:=", dof, " ", + "robot_type:=", robot_type, " ", + "ros2_control_plugin:=", ros2_control_plugin, " ", + #"ros2_control_params:=", ros2_control_params, " ", + + "add_other_geometry:=", add_other_geometry, " ", + "geometry_type:=", geometry_type, " ", + "geometry_mass:=", geometry_mass, " ", + "geometry_height:=", geometry_height, " ", + "geometry_radius:=", geometry_radius, " ", + "geometry_length:=", geometry_length, " ", + "geometry_width:=", geometry_width, " ", + "geometry_mesh_filename:=", geometry_mesh_filename, " ", + "geometry_mesh_origin_xyz:=", geometry_mesh_origin_xyz, " ", + "geometry_mesh_origin_rpy:=", geometry_mesh_origin_rpy, " ", + "geometry_mesh_tcp_xyz:=", geometry_mesh_tcp_xyz, " ", + "geometry_mesh_tcp_rpy:=", geometry_mesh_tcp_rpy, " ", + + #"robot_ip:=", robot_ip, " ", + #"report_type:=", report_type, " ", + #"baud_checkset:=", baud_checkset, " ", + #"default_gripper_baud:=", default_gripper_baud, " ", + ] + ) + # TODO fix URDF loading + # xacro urdf/xarm_pen.urdf.xacro prefix:= hw_ns:=xarm dof:=6 limited:=false effort_control:=false velocity_control:=false add_gripper:=false add_vacuum_gripper:=false robot_type:=lite ros2_control_plugin:=gazebo_ros2_control/GazeboSystem add_other_geometry:=false geometry_type:=cylinder geometry_mass:=0.05 geometry_height:=0.1 geometry_radius:=0.005 geometry_length:=0.07 geometry_width:=0.1 geometry_mesh_filename:= geometry_mesh_origin_xyz:="0 0 0" geometry_mesh_origin_rpy:="0 0 0" geometry_mesh_tcp_xyz:="0 0 0" geometry_mesh_tcp_rpy:="0 0 0" + _robot_description_xml = Command(['cat ', PathJoinSubstitution([FindPackageShare('draw_svg'), 'urdf', 'lite6.tmp.urdf'])]) + robot_description = {"robot_description": _robot_description_xml} + # SRDF + _robot_description_semantic_xml = Command( + [ + PathJoinSubstitution([FindExecutable(name="xacro")]), + " ", + PathJoinSubstitution( + [ + FindPackageShare('custom_xarm_moveit_config'), + "srdf", + #"_lite6_macro.srdf.xacro", + "xarm.srdf.xacro", + ] + ), + " ", + #"name:=", "lite6", " ", + "prefix:=", " ", + #"hw_ns:=", hw_ns, " ", + #"limited:=", limited, " ", + #"effort_control:=", effort_control, " ", + #"velocity_control:=", velocity_control, " ", + #"add_gripper:=", add_gripper, " ", + #"add_vacuum_gripper:=", add_vacuum_gripper, " ", + "dof:=", dof, " ", + "robot_type:=", robot_type, " ", + #"ros2_control_plugin:=", ros2_control_plugin, " ", + #"ros2_control_params:=", ros2_control_params, " ", + + #"add_other_geometry:=", add_other_geometry, " ", + #"geometry_type:=", geometry_type, " ", + #"geometry_mass:=", geometry_mass, " ", + #"geometry_height:=", geometry_height, " ", + #"geometry_radius:=", geometry_radius, " ", + #"geometry_length:=", geometry_length, " ", + #"geometry_width:=", geometry_width, " ", + #"geometry_mesh_filename:=", geometry_mesh_filename, " ", + #"geometry_mesh_origin_xyz:=", geometry_mesh_origin_xyz, " ", + #"geometry_mesh_origin_rpy:=", geometry_mesh_origin_rpy, " ", + #"geometry_mesh_tcp_xyz:=", geometry_mesh_tcp_xyz, " ", + #"geometry_mesh_tcp_rpy:=", geometry_mesh_tcp_rpy, " ", + + #"robot_ip:=", robot_ip, " ", + #"report_type:=", report_type, " ", + #"baud_checkset:=", baud_checkset, " ", + #"default_gripper_baud:=", default_gripper_baud, " ", + ] + ) + robot_description_semantic = { + "robot_description_semantic": _robot_description_semantic_xml + } + + + nodes = [ + Node( + package="lite6_controller", + executable="lite6_controller", + output="log", + arguments=["--ros-args", "--log-level", log_level], + parameters=[ + robot_description, + robot_description_semantic, + {"use_sim_time": use_sim_time}, + ], + ), + Node( + package="draw_svg", + executable="drawing_surface.py", + output="log", + arguments=["--ros-args", "--log-level", log_level], + parameters=[{"use_sim_time": use_sim_time}], + ), + ] + +# ######################3 + + #moveit_controller_manager_key = LaunchConfiguration('moveit_controller_manager_key', default='moveit_fake_controller_manager') + #moveit_controller_manager_value = LaunchConfiguration('moveit_controller_manager_value', default='moveit_fake_controller_manager/MoveItFakeControllerManager') + + add_realsense_d435i = LaunchConfiguration('add_realsense_d435i', default=False) + + moveit_config_package_name = 'custom_xarm_moveit_config' - xarm_type = 'lite6' - ros2_control_plugin = 'uf_robot_hardware/UFRobotFakeSystemHardware' + xarm_type = '{}{}'.format(robot_type.perform(context), dof.perform(context)) # robot_description_parameters # xarm_moveit_config/launch/lib/robot_moveit_config_lib.py @@ -88,8 +263,8 @@ def launch_setup(context, *args, **kwargs): 'velocity_control': velocity_control, 'add_gripper': add_gripper, 'add_vacuum_gripper': add_vacuum_gripper, - 'dof': '6', - 'robot_type': 'lite', + 'dof': dof, + 'robot_type': robot_type, 'ros2_control_plugin': ros2_control_plugin, 'add_realsense_d435i': add_realsense_d435i, 'add_other_geometry': add_other_geometry, @@ -107,8 +282,8 @@ def launch_setup(context, *args, **kwargs): }, srdf_arguments={ 'prefix': prefix, - 'dof': '6', - 'robot_type': 'lite', + 'dof': dof, + 'robot_type': robot_type, 'add_gripper': add_gripper, 'add_vacuum_gripper': add_vacuum_gripper, 'add_other_geometry': add_other_geometry, @@ -119,32 +294,209 @@ def launch_setup(context, *args, **kwargs): } ) - lite6_controller = Node( - package="lite6_controller", - executable="lite6_controller", - output="log", - #arguments=["--ros-args", "--log-level", log_level], + load_yaml = getattr(mod, 'load_yaml') + controllers_yaml = load_yaml(moveit_config_package_name, 'config', xarm_type, '{}.yaml'.format(controllers_name.perform(context))) + ompl_planning_yaml = load_yaml(moveit_config_package_name, 'config', xarm_type, 'ompl_planning.yaml') + kinematics_yaml = robot_description_parameters['robot_description_kinematics'] + joint_limits_yaml = robot_description_parameters.get('robot_description_planning', None) + + # FIX acceleration limits + for i in range(1,7): + joint_limits_yaml['joint_limits']['joint{}'.format(i)]['has_acceleration_limits'] = True + joint_limits_yaml['joint_limits']['joint{}'.format(i)]['max_acceleration'] = 1.0 + + kinematics_yaml['kinematics_solver'] = 'kdl_kinematics_plugin/KDLKinematicsPlugin' + #kinematics_yaml['kinematics_solver'] = 'lma_kinematics_plugin/LMAKinematicsPlugin' + #kinematics_yaml['kinematics_solver_search_resolution'] = 0.005 + kinematics_yaml['kinematics_solver_timeout'] = 10.0 + kinematics_yaml['kinematics_solver_attempts'] = 10 + + #print(joint_limits_yaml) + #quit() + + #if add_gripper.perform(context) in ('True', 'true'): + # gripper_controllers_yaml = load_yaml(moveit_config_package_name, 'config', '{}_gripper'.format(robot_type.perform(context)), '{}.yaml'.format(controllers_name.perform(context))) + # gripper_ompl_planning_yaml = load_yaml(moveit_config_package_name, 'config', '{}_gripper'.format(robot_type.perform(context)), 'ompl_planning.yaml') + # gripper_joint_limits_yaml = load_yaml(moveit_config_package_name, 'config', '{}_gripper'.format(robot_type.perform(context)), 'joint_limits.yaml') + + # if gripper_controllers_yaml and 'controller_names' in gripper_controllers_yaml: + # for name in gripper_controllers_yaml['controller_names']: + # if name in gripper_controllers_yaml: + # if name not in controllers_yaml['controller_names']: + # controllers_yaml['controller_names'].append(name) + # controllers_yaml[name] = gripper_controllers_yaml[name] + # if gripper_ompl_planning_yaml: + # ompl_planning_yaml.update(gripper_ompl_planning_yaml) + # if joint_limits_yaml and gripper_joint_limits_yaml: + # joint_limits_yaml['joint_limits'].update(gripper_joint_limits_yaml['joint_limits']) + + add_prefix_to_moveit_params = getattr(mod, 'add_prefix_to_moveit_params') + add_prefix_to_moveit_params( + controllers_yaml=controllers_yaml, ompl_planning_yaml=ompl_planning_yaml, + kinematics_yaml=kinematics_yaml, joint_limits_yaml=joint_limits_yaml, + prefix=prefix.perform(context)) + + + robot_description_parameters['cartesian_limits'] = {} + robot_description_parameters['cartesian_limits']['max_trans_vel'] = 1 + robot_description_parameters['cartesian_limits']['max_trans_acc'] = 2.25 + robot_description_parameters['cartesian_limits']['max_trans_dec'] = -5 + robot_description_parameters['cartesian_limits']['max_rot_vel'] = 1.57 + + + # Planning pipeline + # https://github.com/AndrejOrsula/panda_moveit2_config/blob/master/launch/move_group_fake_control.launch.py + #planning_pipeline = { + # "planning_pipelines": ["ompl", "pilz_industrial_motion_planner"], + # "default_planning_pipeline": "pilz_industrial_motion_planner", + # "ompl": { + # "planning_plugin": "ompl_interface/OMPLPlanner", + # # TODO: Re-enable `default_planner_request_adapters/AddRuckigTrajectorySmoothing` once its issues are resolved + # "request_adapters": "default_planner_request_adapters/AddTimeOptimalParameterization default_planner_request_adapters/ResolveConstraintFrames default_planner_request_adapters/FixWorkspaceBounds default_planner_request_adapters/FixStartStateBounds default_planner_request_adapters/FixStartStateCollision default_planner_request_adapters/FixStartStatePathConstraints", + # # TODO: Reduce start_state_max_bounds_error once spawning with specific joint configuration is enabled + # "start_state_max_bounds_error": 0.31416, + # }, + # "pilz_industrial_motion_planner": { + # "planning_plugin": "pilz_industrial_motion_planner::CommandPlanner", + # "default_planner_config": "PTP", + # "capabilities": "pilz_industrial_motion_planner/MoveGroupSequenceAction pilz_industrial_motion_planner/MoveGroupSequenceService", + # }, + #} + # Kinematics + #kinematics = load_yaml('panda_moveit2_config', 'config/kinematics.yaml') + + + + + + # Planning Configuration + ompl_planning_pipeline_config = { + 'move_group': { + '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_pipeline_config['move_group'].update(ompl_planning_yaml) + + pilz_planning_pipeline_config = { + 'move_group': { + 'planning_plugin': 'pilz_industrial_motion_planner/CommandPlanner', + # Disable AddTimeOptimalParameterization to fix motion blending https://github.com/ros-planning/moveit/issues/2905 + 'request_adapters': """default_planner_request_adapters/FixWorkspaceBounds default_planner_request_adapters/FixStartStateBounds default_planner_request_adapters/FixStartStateCollision default_planner_request_adapters/FixStartStatePathConstraints""", + #'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""", + "default_planner_config": "PTP", + } + } + + move_group_capabilities = { + "capabilities": "pilz_industrial_motion_planner/MoveGroupSequenceAction pilz_industrial_motion_planner/MoveGroupSequenceService" + } + + + + # Moveit controllers Configuration + moveit_controllers = { + moveit_controller_manager_key.perform(context): controllers_yaml, + 'moveit_controller_manager': moveit_controller_manager_value.perform(context), + } + + # Trajectory Execution Configuration + trajectory_execution = { + 'moveit_manage_controllers': True, + 'trajectory_execution.allowed_execution_duration_scaling': 1.2, + 'trajectory_execution.allowed_goal_duration_margin': 0.5, + 'trajectory_execution.allowed_start_tolerance': 0.01, + 'trajectory_execution.execution_duration_monitoring': False + } + + plan_execution = { + 'plan_execution.record_trajectory_state_frequency': 10.0, + } + + planning_scene_monitor_parameters = { + 'publish_planning_scene': True, + 'publish_geometry_updates': True, + 'publish_state_updates': True, + 'publish_transforms_updates': True, + # "planning_scene_monitor_options": { + # "name": "planning_scene_monitor", + # "robot_description": "robot_description", + # "joint_state_topic": "/joint_states", + # "attached_collision_object_topic": "/move_group/planning_scene_monitor", + # "publish_planning_scene_topic": "/move_group/publish_planning_scene", + # "monitored_planning_scene_topic": "/move_group/monitored_planning_scene", + # "wait_for_initial_state_timeout": 10.0, + # }, + } + + # Start the actual move_group node/action server + move_group_node = Node( + package='moveit_ros_move_group', + executable='move_group', + output='screen', + arguments=['--log-level', 'debug'], parameters=[ robot_description_parameters, - #robot_description, - #robot_description_semantic, - #{"use_sim_time": use_sim_time}, + #ompl_planning_pipeline_config, + pilz_planning_pipeline_config, + move_group_capabilities, + trajectory_execution, + plan_execution, + moveit_controllers, + planning_scene_monitor_parameters, + {'use_sim_time': use_sim_time}, ], ) - virtual_drawing_surface = Node( - package="virtual_drawing_surface", - executable="drawing_surface.py", - output="log", - #arguments=["--ros-args", "--log-level", log_level], - #parameters=[{"use_sim_time": use_sim_time}], + # rviz with moveit configuration + # rviz_config_file = PathJoinSubstitution([FindPackageShare(moveit_config_package_name), 'config', xarm_type, 'planner.rviz' if no_gui_ctrl.perform(context) == 'true' else 'moveit.rviz']) + rviz_config_file = PathJoinSubstitution([FindPackageShare(moveit_config_package_name), 'rviz', 'planner.rviz' if no_gui_ctrl.perform(context) == 'true' else 'moveit.rviz']) + rviz2_node = Node( + package='rviz2', + executable='rviz2', + name='rviz2', + output='screen', + arguments=['-d', rviz_config_file], + parameters=[ + robot_description_parameters, + #ompl_planning_pipeline_config, + pilz_planning_pipeline_config, + {'use_sim_time': use_sim_time}, + ], + remappings=[ + ('/tf', 'tf'), + ('/tf_static', 'tf_static'), + ] + ) + + # Static TF + static_tf = Node( + package='tf2_ros', + executable='static_transform_publisher', + name='static_transform_publisher', + output='screen', + arguments=['0.0', '0.0', '0.0', '0.0', '0.0', '0.0', 'world', 'link_base'], + parameters=[{'use_sim_time': use_sim_time}], ) return [ - robot_moveit_gazebo_fake_launch, - virtual_drawing_surface, - lite6_controller, - ] + #RegisterEventHandler(event_handler=OnProcessExit( + # target_action=rviz2_node, + # on_exit=[EmitEvent(event=Shutdown())] + #)), + #rviz2_node, + static_tf, + move_group_node, + robot_gazebo_launch, + ] + nodes + +# ######################3 + + #return [ + # robot_moveit_common_launch, + # robot_gazebo_launch, + #] + nodes def generate_launch_description():