def Wave(robot): env = robot.GetEnv() wave_path = FindCatkinResource('fetchpy', 'config/WaveTraj/') traj0 = load_trajectory(env, join(wave_path, 'wave1.xml')) traj1 = load_trajectory(env, join(wave_path, 'wave2.xml')) traj2 = load_trajectory(env, join(wave_path, 'wave1.xml')) traj3 = load_trajectory(env, join(wave_path, 'wave2.xml')) manip = robot.arm robot.HaltHand(manip=manip) pause = 0.30 time.sleep(pause) robot.ExecuteTrajectory(traj0) robot.ExecuteTrajectory(traj1) robot.ExecuteTrajectory(traj2) robot.ExecuteTrajectory(traj3)
def Wave(robot): """ @param robot The robot waving with their right arm """ from prpy.rave import load_trajectory from os.path import join env = robot.GetEnv() wave_path = FindCatkinResource('herbpy', 'config/waveTrajs/') traj0 = load_trajectory(env, join(wave_path, 'wave0.xml')) traj1 = load_trajectory(env, join(wave_path, 'wave1.xml')) traj2 = load_trajectory(env, join(wave_path, 'wave2.xml')) traj3 = load_trajectory(env, join(wave_path, 'wave3.xml')) manip = robot.right_arm robot.HaltHand(manip=manip) robot.ExecuteTrajectory(traj0) robot.ExecuteTrajectory(traj1) robot.ExecuteTrajectory(traj2) robot.ExecuteTrajectory(traj3)
def Wave2(robot): robot.gripper.OpenHand() pose1 = ([-1.50, 0.55, 0.00, -1.94, 0.00, 0.00, -1.43]) robot.arm.PlanToConfiguration(pose1, execute=True) env = robot.GetEnv() wave_path = FindCatkinResource('fetchpy', 'config/WaveTraj2/') traj0 = load_trajectory(env, join(wave_path, 'wave1.xml')) traj1 = load_trajectory(env, join(wave_path, 'wave2.xml')) traj2 = load_trajectory(env, join(wave_path, 'wave1.xml')) traj3 = load_trajectory(env, join(wave_path, 'wave2.xml')) traj4 = load_trajectory(env, join(wave_path, 'wave1.xml')) traj5 = load_trajectory(env, join(wave_path, 'wave2.xml')) manip = robot.arm pause = 0.60 time.sleep(pause) robot.ExecuteTrajectory(traj1) robot.ExecuteTrajectory(traj2) robot.ExecuteTrajectory(traj3) robot.ExecuteTrajectory(traj4) robot.ExecuteTrajectory(traj5) robot.ExecuteTrajectory(traj0) robot.gripper.CloseHand()
def __init__(self, arm_sim, hand_sim, ft_sim, segway_sim, ): from prpy.util import FindCatkinResource Robot.__init__(self, robot_name='BarrettWAM') # Convenience attributes for accessing self components. self.arm = self.GetManipulator('arm') self.arm.hand = self.arm.GetEndEffector() self.hand = self.arm.hand # 'handbase' self.manipulators = [ self.arm ] # Dynamically switch to self-specific subclasses. prpy.bind_subclass(self.arm, WAM, sim=arm_sim, owd_namespace='/arm/owd') # namespace must be set, even for sim prpy.bind_subclass(self.arm.hand, BarrettHand, sim=hand_sim, manipulator=self.arm, owd_namespace='/arm/owd', bhd_namespace='/arm/bhd', ft_sim=ft_sim) self.base = WAMBase(sim=segway_sim, robot=self) #self.base = WAMBase(sim=base_sim, robot=self) # Set WAM acceleration limits. These are not specified in URDF. accel_limits = self.GetDOFAccelerationLimits() accel_limits[self.arm.GetArmIndices()] = [ 2. ] * self.arm.GetArmDOF() self.SetDOFAccelerationLimits(accel_limits) # Support for named configurations. import os.path self.configurations.add_group('arm', self.arm.GetArmIndices()) self.configurations.add_group('hand', self.hand.GetIndices()) configurations_path = FindCatkinResource('wampy', 'config/configurations.yaml') try: self.configurations.load_yaml(configurations_path) except IOError as e: raise ValueError('Failed laoding named configurations from "{:s}".'.format( configurations_path)) # Initialize a default planning pipeline. from prpy.planning import ( FirstSupported, MethodMask, Ranked, Sequence, ) from prpy.planning import ( CBiRRTPlanner, CHOMPPlanner, GreedyIKPlanner, IKPlanner, NamedPlanner, SBPLPlanner, SnapPlanner, TSRPlanner, VectorFieldPlanner ) # TODO: These should be meta-planners. self.named_planner = NamedPlanner() self.ik_planner = IKPlanner() # Special-purpose planners. self.snap_planner = SnapPlanner() self.vectorfield_planner = VectorFieldPlanner() self.greedyik_planner = GreedyIKPlanner() # General-purpose planners. self.cbirrt_planner = CBiRRTPlanner() # Trajectory optimizer. try: from or_trajopt import TrajoptPlanner self.trajopt_planner = TrajoptPlanner() except ImportError: self.trajopt_planner = None logger.warning('Failed creating TrajoptPlanner. Is the or_trajopt' ' package in your workspace and built?') try: self.chomp_planner = CHOMPPlanner() except UnsupportedPlanningError: self.chomp_planner = None logger.warning('Failed loading the CHOMP module. Is the or_cdchomp' ' package in your workspace and built?') if not (self.trajopt_planner or self.chomp_planner): raise PrPyException('Unable to load both CHOMP and TrajOpt. At' ' least one of these packages is required.') actual_planner = Sequence( # First, try the straight-line trajectory. self.snap_planner, # Then, try a few simple (and fast!) heuristics. self.vectorfield_planner, #self.greedyik_planner, # Next, try a trajectory optimizer. self.trajopt_planner or self.chomp_planner ) self.planner = FirstSupported( Sequence(actual_planner, TSRPlanner(delegate_planner=actual_planner), self.cbirrt_planner), # Special purpose meta-planner. NamedPlanner(delegate_planner=actual_planner), ) from prpy.planning.retimer import HauserParabolicSmoother self.smoother = HauserParabolicSmoother(do_blend=True, do_shortcut=True) self.retimer = HauserParabolicSmoother(do_blend=True, do_shortcut=False, blend_iterations=5, blend_radius=0.4) self.simplifier = None # Base planning from prpy.util import FindCatkinResource planner_parameters_path = FindCatkinResource('wampy', 'config/base_planner_parameters.yaml') self.sbpl_planner = SBPLPlanner() try: with open(planner_parameters_path, 'rb') as config_file: import yaml params_yaml = yaml.load(config_file) self.sbpl_planner.SetPlannerParameters(params_yaml) except IOError as e: raise ValueError('Failed loading base planner parameters from "{:s}".'.format( planner_parameters_path)) self.base_planner = self.sbpl_planner # Create action library from prpy.action import ActionLibrary self.actions = ActionLibrary() # Register default actions and TSRs import wampy.action import wampy.tsr # Setting necessary sim flags self.segway_sim = segway_sim
def __init__(self, left_arm_sim, right_arm_sim, right_ft_sim, left_hand_sim, right_hand_sim, left_ft_sim, head_sim, talker_sim, segway_sim, perception_sim, robot_checker_factory): Robot.__init__(self, robot_name='herb') self.robot_checker_factory = robot_checker_factory # Controller setup self.controller_manager = None self.controllers_always_on = [] self.full_controller_sim = (left_arm_sim and right_arm_sim and left_ft_sim and right_ft_sim and left_hand_sim and right_hand_sim and head_sim) if not self.full_controller_sim: # any non-simulation requires ros and the ros_control stack import rospy from ros_control_client_py import ( ControllerManagerClient, JointStateClient, ) if not rospy.core.is_initialized(): raise RuntimeError('rospy not initialized. ' 'Must call rospy.init_node()') # update openrave state from /joint_states self._jointstate_client = JointStateClient( self, topic_name='/joint_states') self.controller_manager = ControllerManagerClient() self.controllers_always_on.append('joint_state_controller') # Convenience attributes for accessing self components. self.left_arm = self.GetManipulator('left') self.right_arm = self.GetManipulator('right') self.head = self.GetManipulator('head') self.left_arm.hand = self.left_arm.GetEndEffector() self.right_arm.hand = self.right_arm.GetEndEffector() self.left_hand = self.left_arm.hand self.right_hand = self.right_arm.hand self.manipulators = [self.left_arm, self.right_arm, self.head] # Dynamically switch to self-specific subclasses. prpy.bind_subclass(self.left_arm, WAM, sim=left_arm_sim, namespace='/left') prpy.bind_subclass(self.right_arm, WAM, sim=right_arm_sim, namespace='/right') prpy.bind_subclass(self.head, HERBPantilt, sim=head_sim, owd_namespace='/head/owd') prpy.bind_subclass(self.left_arm.hand, BarrettHand, sim=left_hand_sim, manipulator=self.left_arm, bhd_namespace='/left', ft_sim=left_ft_sim) prpy.bind_subclass(self.right_arm.hand, BarrettHand, sim=right_hand_sim, manipulator=self.right_arm, bhd_namespace='/right', ft_sim=right_ft_sim) self.base = HerbBase(sim=segway_sim, robot=self) # Set HERB's acceleration limits. These are not specified in URDF. accel_limits = self.GetDOFAccelerationLimits() accel_limits[self.head.GetArmIndices()] = [2.] * self.head.GetArmDOF() accel_limits[ self.left_arm.GetArmIndices()] = [2.] * self.left_arm.GetArmDOF() accel_limits[self.right_arm.GetArmIndices( )] = [2.] * self.right_arm.GetArmDOF() self.SetDOFAccelerationLimits(accel_limits) # Determine always-on controllers # hand controllers if not left_hand_sim: self.controllers_always_on.append('left_hand_controller') if not right_hand_sim: self.controllers_always_on.append('right_hand_controller') # force/torque controllers if not left_ft_sim or not right_ft_sim: self.controllers_always_on.append('force_torque_sensor_controller') if not left_ft_sim: self.controllers_always_on.append('left_tare_controller') if not right_ft_sim: self.controllers_always_on.append('right_tare_controller') # Set default manipulator controllers in sim only # NOTE: head is ignored until TODO new Schunk head integrated if left_arm_sim: self.left_arm.sim_controller = self.AttachController( name=self.left_arm.GetName(), args='IdealController', dof_indices=self.left_arm.GetArmIndices(), affine_dofs=0, simulated=True) if right_arm_sim: self.right_arm.sim_controller = self.AttachController( name=self.right_arm.GetName(), args='IdealController', dof_indices=self.right_arm.GetArmIndices(), affine_dofs=0, simulated=True) # load and activate initial controllers if self.controller_manager is not None: self.controller_manager.request( self.controllers_always_on).switch() # Support for named configurations. import os.path self.configurations.add_group('left_arm', self.left_arm.GetArmIndices()) self.configurations.add_group('right_arm', self.right_arm.GetArmIndices()) self.configurations.add_group('head', self.head.GetArmIndices()) self.configurations.add_group('left_hand', self.left_hand.GetIndices()) self.configurations.add_group('right_hand', self.right_hand.GetIndices()) configurations_path = FindCatkinResource('herbpy', 'config/configurations.yaml') try: self.configurations.load_yaml(configurations_path) except IOError as e: raise ValueError( 'Failed laoding named configurations from "{:s}".'.format( configurations_path)) # Hand configurations for hand in [self.left_hand, self.right_hand]: hand.configurations = ConfigurationLibrary() hand.configurations.add_group('hand', hand.GetIndices()) if isinstance(hand, BarrettHand): hand_configs_path = FindCatkinResource( 'herbpy', 'config/barrett_preshapes.yaml') try: hand.configurations.load_yaml(hand_configs_path) except IOError as e: raise ValueError( 'Failed loading named hand configurations from "{:s}".' .format(hand_configs_path)) else: logger.warning( 'Unrecognized hand class. Not loading named configurations.' ) # Planner. snap_planner = SnapPlanner( robot_checker_factory=self.robot_checker_factory) vectorfield_planner = VectorFieldPlanner( robot_checker_factory=self.robot_checker_factory) trajopt_planner = TrajoptPlanner( robot_checker_factory=self.robot_checker_factory) rrt_planner = OMPLPlanner( 'RRTConnect', robot_checker_factory=self.robot_checker_factory) cbirrt_planner = CBiRRTPlanner( timelimit=1., robot_checker_factory=self.robot_checker_factory) actual_planner = Sequence( snap_planner, vectorfield_planner, trajopt_planner, TSRPlanner(delegate_planner=Sequence(snap_planner, trajopt_planner), robot_checker_factory=self.robot_checker_factory), FirstSupported(rrt_planner, cbirrt_planner), ) self.planner = FirstSupported( actual_planner, NamedPlanner(delegate_planner=actual_planner), ) # Post-processor. self.smoother = HauserParabolicSmoother(do_blend=True, blend_iterations=1, blend_radius=0.4, do_shortcut=True, timelimit=0.6) self.retimer = HauserParabolicSmoother(do_blend=True, blend_iterations=1, blend_radius=0.4, do_shortcut=False) self.simplifier = None # Base planning planner_parameters_path = FindCatkinResource( 'herbpy', 'config/base_planner_parameters.yaml') self.sbpl_planner = SBPLPlanner() try: with open(planner_parameters_path, 'rb') as config_file: params_yaml = yaml.load(config_file) self.sbpl_planner.SetPlannerParameters(params_yaml) except IOError as e: raise ValueError( 'Failed loading base planner parameters from "{:s}".'.format( planner_parameters_path)) self.base_planner = self.sbpl_planner # Create action library self.actions = ActionLibrary() # Register default actions and TSRs import herbpy.action import herbpy.tsr # Setting necessary sim flags self.talker_simulated = talker_sim self.segway_sim = segway_sim # Set up perception self.detector = None if perception_sim: from prpy.perception import SimulatedPerceptionModule self.detector = SimulatedPerceptionModule() else: from prpy.perception import ApriltagsModule try: kinbody_path = FindCatkinResource('pr_ordata', 'data/objects') marker_data_path = FindCatkinResource( 'pr_ordata', 'data/objects/tag_data.json') self.detector = ApriltagsModule( marker_topic='/apriltags_kinect2/marker_array', marker_data_path=marker_data_path, kinbody_path=kinbody_path, detection_frame='head/kinect2_rgb_optical_frame', destination_frame='herb_base', reference_link=self.GetLink('/herb_base')) except IOError as e: logger.warning('Failed to find required resource path. ' \ 'pr_ordata package cannot be found. ' \ 'Perception detector will not be loaded.' \ '\n{}'.format(e)) if not self.talker_simulated: # Initialize herbpy ROS Node import rospy if not rospy.core.is_initialized(): raise RuntimeError('rospy not initialized. ' 'Must call rospy.init_node()') import talker.msg from actionlib import SimpleActionClient self._say_action_client = SimpleActionClient( 'say', talker.msg.SayAction)
def __init__(self, arm_sim, arm_torso_sim, gripper_sim, head_sim, torso_sim, base_sim, talker_sim, whole_body_sim, perception_sim, robot_checker_factory): Robot.__init__(self, robot_name='fetch') self.robot_checker_factory = robot_checker_factory #Controller Setup self.controller_manager = None self.controller_always_on = [] self.full_controller_sim = (arm_sim and arm_torso_sim and gripper_sim and head_sim) if not self.full_controller_sim: import rospy from ros_control_client_py import ( ControllerManagerClient, JointStateClient, ) import rosgraph.masterapi if not rospy.core.is_initialized(): raise RuntimeError('rospy not initialized.' 'Must call rospy.init_node()') master = rosgraph.masterapi.Master('/rostopic') topics = [] for i in master.getPublishedTopics(''): topics.append(i[0]) if '/joint_states' not in topics: raise RuntimeError( 'The -sim argument should be set if there is' ' No real robot/Gazebo robot connected') #update openrave state from /joint_states self._jointstate_client = JointStateClient( self, topic_name='/joint_states') self.controller_always_on.append('joint_state_controller') # Convenience attributes for accessing self components. self.arm = self.GetManipulator('arm') self.arm_torso = self.GetManipulator('arm_torso') self.gripper = self.arm.GetEndEffector() self.hand = self.gripper self.head = self.GetManipulator('head') self.manipulators = [self.arm, self.arm_torso] #Dynamically switch to self-specific subclasses. prpy.bind_subclass(self.arm, ARM, sim=arm_sim, namespace='arm') prpy.bind_subclass(self.arm_torso, ARM, sim=arm_torso_sim, namespace='arm_torso') prpy.bind_subclass(self.gripper, GRIPPER, sim=gripper_sim, manipulator=self.arm, namespace='') prpy.bind_subclass(self.head, HEAD, robot=self, sim=head_sim, namespace='') self.base = BASE(sim=base_sim, robot=self) self.whole_body = WholeBody(sim=whole_body_sim, robot=self) # Set FETCH's acceleration limits. These are not specified in URDF. accel_limits = self.GetDOFAccelerationLimits() accel_limits[self.arm.GetArmIndices()] = [2.] * self.arm.GetArmDOF() accel_limits[self.arm_torso.GetArmIndices( )] = [2.] * self.arm_torso.GetArmDOF() #get acceleration limits and set them here(change) self.SetDOFAccelerationLimits(accel_limits) # Determine always-on controllers # Set default manipulator controllers in sim only (change) if not gripper_sim: self.controller_always_on.append('gripper_controller') if not head_sim: self.controller_always_on.append('head_controller') if not base_sim: self.controller_always_on.append('base_controller') if arm_sim: self.arm.sim_controller = self.AttachController( name=self.arm.GetName(), args='IdealController', dof_indices=self.arm.GetArmIndices(), affine_dofs=0, simulated=True) # For simulation we cannot assign same DOF indices to different controllers # So for arm_torso only the torso is included if arm_torso_sim: self.arm_torso.sim_controller = self.AttachController( name=self.arm_torso.GetName(), args='IdealController', dof_indices=[11], affine_dofs=0, simulated=True) # Support for named configurations.(change) import os.path self.configurations.add_group('arm', self.arm.GetArmIndices()) #self.configurations.add_group('arm_torso',self.arm.GetArmIndices()) self.configurations.add_group('gripper', self.gripper.GetIndices()) self.configurations.add_group('head', self.head.GetIndices()) configurations_path = FindCatkinResource('fetchpy', 'config/configurations.yaml') try: self.configurations.load_yaml(configurations_path) except IOError as e: raise ValueError( 'Failed loading named configurations from "{:s}".'.format( configurations_path)) #Gripper configurations self.gripper.configurations = ConfigurationLibrary() self.gripper.configurations.add_group('gripper', self.gripper.GetIndices()) if isinstance(self.hand, GRIPPER): gripper_configurations_path = FindCatkinResource( 'fetchpy', 'config/gripper_preshapes.yaml') try: self.configurations.load_yaml(gripper_configurations_path) except IOError as e: raise ValueError( 'Failed loading named configurations from "{:s}".'.format( gripper_configurations_path)) else: logger.warning( 'Unrecognized hand class. Not loading named configurations.') #Head configurations self.head.configurations = ConfigurationLibrary() self.head.configurations.add_group('head', self.head.GetIndices()) if isinstance(self.head, HEAD): head_configurations_path = FindCatkinResource( 'fetchpy', 'config/head_preshapes.yaml') try: self.configurations.load_yaml(head_configurations_path) except IOError as e: raise ValueError( 'Failed loading named configurations from "{:s}".'.format( head_configurations_path)) else: logger.warning( 'Unrecognized HEAD class. Not loading named configurations.') #Planner. snap_planner = SnapPlanner( robot_checker_factory=self.robot_checker_factory) vectorfield_planner = VectorFieldPlanner( robot_checker_factory=self.robot_checker_factory) trajopt_planner = TrajoptPlanner( robot_checker_factory=self.robot_checker_factory) rrt_planner = OMPLPlanner( 'RRTConnect', robot_checker_factory=self.robot_checker_factory) cbirrt_planner = CBiRRTPlanner( timelimit=1., robot_checker_factory=self.robot_checker_factory) actual_planner = Sequence( snap_planner, vectorfield_planner, trajopt_planner, TSRPlanner(delegate_planner=Sequence(snap_planner, trajopt_planner), robot_checker_factory=self.robot_checker_factory), FirstSupported(rrt_planner, cbirrt_planner), ) self.planner = FirstSupported( actual_planner, NamedPlanner(delegate_planner=actual_planner), ) # Post-processor. self.smoother = HauserParabolicSmoother(do_blend=True, blend_iterations=1, blend_radius=0.4, do_shortcut=True, timelimit=0.6) self.retimer = HauserParabolicSmoother(do_blend=True, blend_iterations=1, blend_radius=0.4, do_shortcut=False) self.simplifier = None #Base Planning self.sbpl_planner = SBPLPlanner() self.base_planner = self.sbpl_planner #Create action library(change) self.actions = ActionLibrary() # Register default actions and TSRs: TODO(change) import fetchpy.action #import fetch.tsr #Setting necessary sim flags self.talker_simulated = talker_sim self.base_sim = base_sim #Set up perception(change) self.detector = None if perception_sim: from prpy.perception import SimulatedPerceptionModule self.detector = SimulatedPerceptionModule() else: from prpy.perception import ApriltagsModule try: kinbody_path = FindCatkinResource('pr_ordata', 'data/objects') marker_data_path = FindCatkinResource( 'pr_ordata', 'data/objects/tag_data.json') self.detector = ApriltagsModule( marker_topic='/apriltags_kinect2/marker_array', marker_data_path=marker_data_path, kinbody_path=kinbody_path, detection_frame='head/kinect2_rgb_optical_frame', destination_frame='fetch_base', reference_link=self.GetLink('/base')) except IOError as e: logger.warning('Failed to find required resource path. ' \ 'pr_ordata package cannot be found. ' \ 'Perception detector will not be loaded.' \ '\n{}'.format(e)) #TALKER if not self.talker_simulated: # Initialize fetchpy ROS Node if not rospy.core.is_initialized(): raise RuntimeError('rospy not initialized. ' 'Must call rospy.init_node()') from sound_play.msg import SoundRequest from sound_play.libsoundplay import SoundClient self.soundhandle = SoundClient() self.voice = 'voice_kal_diphone' self.volume = 1.0