def __init__(self, desired_tilt):
		'''Constructor'''

		super(TiltHeadState, self).__init__(outcomes=['done', 'failed'])


		if not rospy.has_param("behavior/joint_controllers_name"):
			Logger.logerr("Need to specify parameter behavior/joint_controllers_name at the parameter server")
			return

		controller_namespace = rospy.get_param("behavior/joint_controllers_name")

		# self._configs['flor']['same'] =  {
		# 	20: {'joint_name': 'neck_ry', 'joint_values': [+0.00], 'controller': 'neck_traj_controller'}, # max -40 degrees
		# 	21: {'joint_name': 'neck_ry', 'joint_values': [-40.0], 'controller': 'neck_traj_controller'},
		# 	22: {'joint_name': 'neck_ry', 'joint_values': [-20.0], 'controller': 'neck_traj_controller'},
		# 	23: {'joint_name': 'neck_ry', 'joint_values': [+20.0], 'controller': 'neck_traj_controller'},
		# 	24: {'joint_name': 'neck_ry', 'joint_values': [+40.0], 'controller': 'neck_traj_controller'},
		# 	25: {'joint_name': 'neck_ry', 'joint_values': [+60.0], 'controller': 'neck_traj_controller'}  # max +60 degrees
		# }

		self._action_topic = "/" + controller_namespace + \
							 "/neck_traj_controller" + "/follow_joint_trajectory"

		self._client = ProxyActionClient({self._action_topic: FollowJointTrajectoryAction})

		# Convert desired position to radians
		self._desired_tilt = math.radians(desired_tilt)

		self._failed = False
	def on_enter(self, userdata):

		self._failed = False
		self._done = False

		# Create footstep planner request
		strafing = self._direction == PatternParameters.STRAFE_LEFT or self._direction == PatternParameters.STRAFE_RIGHT
		pattern_parameters = PatternParameters()
		pattern_parameters.mode = self._direction
		pattern_parameters.step_distance_forward = self._step_distance_forward if not strafing else 0.0 # will it ignore?
		pattern_parameters.step_distance_sideward = self._step_distance_sideward if strafing else 0.0 # will it ignore?
		pattern_parameters.close_step = True
		step_distance = pattern_parameters.step_distance_sideward if strafing else pattern_parameters.step_distance_forward
		pattern_parameters.steps = int(round(userdata.distance / step_distance))

		request = StepPlanRequest()
		request.parameter_set_name = String('drc_step_no_collision')
		request.header = Header(frame_id = '/world', stamp = rospy.Time.now())
		request.planning_mode = StepPlanRequest.PLANNING_MODE_PATTERN
		request.pattern_parameters = pattern_parameters

		action_goal = StepPlanRequestGoal(plan_request = request)

		try:
			self._client.send_goal(self._action_topic, action_goal)
		except Exception as e:
			Logger.logwarn('Was unable to create footstep pattern for wide stance:\n%s' % str(e))
			self._failed = True
	def on_enter(self, userdata):
		'''Upon entering, create a neck trajectory and send the action goal.'''

		self._failed = False

		# Create neck point
		neck_point = JointTrajectoryPoint()
		neck_point.time_from_start = rospy.Duration.from_sec(1.0)
		neck_point.positions.append(self._desired_tilt)

		# Create neck trajectory
		neck_trajectory = JointTrajectory()
		neck_trajectory.header.stamp = rospy.Time.now() + rospy.Duration(0.2)
		neck_trajectory.joint_names = ['neck_ry']
		neck_trajectory.points.append(neck_point)

		# Create action goal
		action_goal = FollowJointTrajectoryGoal(trajectory = neck_trajectory)

		# execute the motion
		try: 
			self._client.send_goal(self._action_topic, action_goal)
		except Exception as e:
			Logger.logwarn('Failed to send neck trajectory goal:\n%s' % str(e))
			self._failed = True
	def __init__(self, direction):
		'''
		Constructor
		'''
		super(FootstepPlanRelativeState, self).__init__(outcomes=['planned', 'failed'],
														input_keys=['distance'],
														output_keys=['plan_header'])

		if not rospy.has_param("behavior/step_distance_forward"):
			Logger.logerr("Need to specify parameter behavior/step_distance_forward at the parameter server")
			return
		if not rospy.has_param("behavior/step_distance_sideward"):
			Logger.logerr("Need to specify parameter behavior/step_distance_sideward at the parameter server")
			return

		self._step_distance_forward = rospy.get_param("behavior/step_distance_forward")
		self._step_distance_sideward = rospy.get_param("behavior/step_distance_sideward")
		
		self._action_topic = '/vigir/footstep_manager/step_plan_request'

		self._client = ProxyActionClient({self._action_topic: StepPlanRequestAction})

		self._done   = False
		self._failed = False
		self._direction = direction
	def on_enter(self, userdata):
		self._sampling_failed = False
		self._planning_failed = False
		self._control_failed = False
		self._success = False

		action_goal = ArgoCombinedPlanGoal()
		action_goal.target = deepcopy(userdata.object_pose)
		
		type_map = {
			'dial_gauge': ObjectTypes.DIAL_GAUGE,
			'level_gauge': ObjectTypes.LEVEL_GAUGE,
			'valve': ObjectTypes.VALVE,
			'hotspot': ObjectTypes.HOTSPOT,
			'pipes' : ObjectTypes.PIPES,
			'victim' : ObjectTypes.VICTIM
		}
		object_type = type_map.get(userdata.object_type, ObjectTypes.UNKNOWN)
		
		q = [ action_goal.target.pose.orientation.x, action_goal.target.pose.orientation.y,
			  action_goal.target.pose.orientation.z, action_goal.target.pose.orientation.w ]
		q = tf.transformations.quaternion_multiply(q, self._rot)
		action_goal.target.pose.orientation = Quaternion(*q)
		
		action_goal.object_id.data = userdata.object_id
		action_goal.object_type.val = object_type
		action_goal.action_type.val = ActionCodes.SAMPLE_MOVE_ARM

		Logger.loginfo('Position arm to look at %s object' % str(userdata.object_type))
		
		try:
			self._client.send_goal(self._action_topic, action_goal)
		except Exception as e:
			Logger.logwarn('Failed to send move group goal for arm motion:\n%s' % str(e))
			self._control_failed = True
	def execute(self, userdata):
		'''
		Execute this state
		'''
		if self._planning_failed:
			return 'planning_failed'
		if self._control_failed:
			return 'control_failed'
		if self._success:
			return 'reached'

		if self._client.has_result(self._action_topic):
			result = self._client.get_result(self._action_topic)
			
			if result.error_code.val == MoveItErrorCodes.CONTROL_FAILED:
				Logger.logwarn('Control failed for move action of group: %s (error code: %s)' % (self._move_group, str(result.error_code)))
				self._control_failed = True
				return 'control_failed'
			elif result.error_code.val != MoveItErrorCodes.SUCCESS:
				Logger.logwarn('Move action failed with result error code: %s' % str(result.error_code))
				self._planning_failed = True
				return 'planning_failed'
			else:
				self._success = True
				return 'reached'
    def on_enter(self, userdata):
        """On enter, create and send the follow joint trajectory action goal."""

        self._failed = False

        current_config = userdata.current_config

        # Get the index of the joint whose value will be replaced
        index_of_joint = current_config["joint_names"].index(self._joint_name)

        # Replace the old joint value with the target_config's one
        new_values = current_config["joint_values"]
        new_values[index_of_joint] = self._joint_value

        # Create trajectory point out of the revised joint values
        point = JointTrajectoryPoint(positions=new_values, time_from_start=rospy.Duration.from_sec(self._time))

        # Create trajectory message
        trajectory = JointTrajectory(joint_names=current_config["joint_names"], points=[point])

        action_goal = FollowJointTrajectoryGoal(trajectory=trajectory)

        # execute the motion
        try:
            self._client.send_goal(self._action_topic, action_goal)
        except Exception as e:
            Logger.logwarn("Failed to send trajectory action goal:\n%s" % str(e))
            self._failed = True
	def on_exit(self, userdata):
		# Make sure that the action is not running when leaving this state.
		# A situation where the action would still be active is for example when the operator manually triggers an outcome.

		if not self._client.has_result(self._topic):
			self._client.cancel(self._topic)
			Logger.loginfo('Cancelled active action goal.')
	def on_enter(self, userdata):

		self._startTime = Time.now()

		self._failed = False
		self._reached = False
		
		goal_id = GoalID()
		goal_id.id = 'abcd'
		goal_id.stamp = Time.now()

		action_goal = MoveBaseGoal()
		action_goal.target_pose = userdata.waypoint
		action_goal.speed = userdata.speed

		if action_goal.target_pose.header.frame_id == "":
			action_goal.target_pose.header.frame_id = "world"

		try:
			self._move_client.send_goal(self._action_topic, action_goal)
			resp = self.set_tolerance(goal_id, 0.2, 1.55)
		except Exception as e:
			Logger.logwarn('Failed to send motion request to waypoint (%(x).3f, %(y).3f):\n%(err)s' % {
				'err': str(e),
				'x': userdata.waypoint.pose.position.x,
				'y': userdata.waypoint.pose.position.y
			})
			self._failed = True
		
		Logger.loginfo('Driving to next waypoint')
	def combine_plans(self, plans):
		output_dict = {}
		try:
			left_arm = plans[0]
			right_arm = plans[1]
			left_leg = plans[2]
			right_leg = plans[3]
			torso = plans[4]
			#hacky_dict_combination = lambda p: dict({'left_arm': p[0]}, **{'right_arm': p[1]})
	
			# Logger.loginfo('SystemIdentificationTestsSM:combine_plans: plans="%s"' % str(plans))
	
			if left_arm is not None:
				output_dict['left_arm'] = left_arm.joint_trajectory
	
			if right_arm is not None: 
				output_dict['right_arm'] = right_arm.joint_trajectory
	
			if left_leg is not None:
				output_dict['left_leg'] = left_leg.joint_trajectory
	
			if right_leg is not None: 
				output_dict['right_leg'] = right_leg.joint_trajectory
	
			if torso is not None: 
				output_dict['torso'] = torso.joint_trajectory
		except Exception as e:
			Logger.loginfo('SystemIdentificationTestsSM:combine_plans: Error "%s"' % (str(e)))
		return output_dict
    def on_enter(self, userdata):
        # When entering this state, we send the action goal once to let the robot start its work.

        # As documented above, we get the specification of which dishwasher to use as input key.
        # This enables a previous state to make this decision during runtime and provide the ID as its own output key.

        # Create the goal.
        tweet = SendTweetGoal() 
        tweet.text = userdata.tweet_text
        
        if len(userdata.tweet_text) > 140:
            tweet.text = '#LAMoR15 #ECMR15 I just told a too looong joke, stupid tweet length!'

        tweet.with_photo = True
        img = cv2.imread(userdata.picture_path)

        bridge = CvBridge()
        image_message = bridge.cv2_to_imgmsg(img, encoding="bgr8")
        tweet.photo = image_message

        try:
            self._client.send_goal(self._topic, tweet)
        except Exception as e:
                # Since a state failure not necessarily causes a behavior failure, it is recommended to only print warnings, not errors.
                # Using a linebreak before appending the error log enables the operator to collapse details in the GUI.
            Logger.logwarn('Failed to send the TweetPictureState command:\n%s' % str(e))
            self._error = True
Example #12
0
	def on_enter(self, userdata):
			
		speedValue = self._dynrec.get_configuration(timeout = 0.5)
		if speedValue is not None:
			self._defaultspeed = speedValue['speed']	
			
		self._dynrec.update_configuration({'speed':userdata.speed})		
		self._succeeded = False
		self._failed = False
		
		action_goal = MoveBaseGoal()
		action_goal.exploration = True
		action_goal.speed = userdata.speed

		if action_goal.target_pose.header.frame_id == "":
			action_goal.target_pose.header.frame_id = "world"

		try:
			if self._move_client.is_active(self._action_topic):
				self._move_client.cancel(self._action_topic)
			self._move_client.send_goal(self._action_topic, action_goal)
		except Exception as e:
			Logger.logwarn('Failed to start Exploration' % {
				'err': str(e),
				'x': userdata.waypoint.pose.position.x,
				'y': userdata.waypoint.pose.position.y
			})
			self._failed = True
	def set_back_rotation(self, input_keys):
		affordance = input_keys[0]
		back_rotation = input_keys[1]
		degrees = math.copysign(back_rotation, affordance.displacement)
		affordance.displacement = math.radians(degrees)
		Logger.loginfo("Turning back %.1f degrees" % degrees)
		return affordance
	def __init__(self, config_name, srdf_file, move_group = "", robot_name = ""):
		'''
		Constructor
		'''
		super(GetJointsFromSrdfState, self).__init__(outcomes=['retrieved', 'file_error'],
												output_keys=['joint_values'])

		self._config_name = config_name
		self._move_group = move_group
		self._robot_name = robot_name

		# Check existence of SRDF file to reduce risk of runtime failure.
		# Anyways, values will only be read during runtime to allow modifications.
		self._srdf_path = None
		try:
			rp = RosPack()
			pkg_name = srdf_file.split('/')[0]
			self._srdf_path = os.path.join(rp.get_path(pkg_name), '/'.join(srdf_file.split('/')[1:]))
			if not os.path.isfile(self._srdf_path):
				raise IOError('File "%s" does not exist!' % self._srdf_path)
		except Exception as e:
			Logger.logwarn('Unable to find given SRDF file: %s\n%s' % (srdf_file, str(e)))

		self._file_error = False
		self._srdf = None
	def execute(self, userdata):
		'''
		Execute this state
		'''
		if not self._connected:
			return 'no_connection'
		if self._received:
			return 'received'

		if self._client.has_result(self._action_topic):
			result = self._client.get_result(self._action_topic)
			if result.result_code != BehaviorInputResult.RESULT_OK:
				userdata.data = None
				return 'aborted'
			else:
				try:
					response_data = pickle.loads(result.data)
					#print 'Input request response:', response_data
					userdata.data = response_data
					# If this was a template ID request, log that template ID:
					if self._request == BehaviorInputGoal.SELECTED_OBJECT_ID:
						Logger.loginfo('Received template ID: %d' % int(response_data))
				
				except Exception as e:
					Logger.logwarn('Was unable to load provided data:\n%s' % str(e))
					userdata.data = None
					return 'data_error'

				self._received = True
				return 'received'
	def _version_callback(self, msg):
		vui = self._parse_version(msg.data)
		vex = self._parse_version(BehaviorLauncher.MIN_VERSION)
		if vui < vex:
			Logger.logwarn('FlexBE App needs to be updated!\n' \
				+ 'Require at least version %s, but have %s\n' % (BehaviorLauncher.MIN_VERSION, msg.data) \
				+ 'You can update the app by dropping the file flexbe_behavior_engine/FlexBE.crx onto the Chrome extension page.')
    def __init__(self, config_name, move_group="", duration=1.0, wait_for_execution=True, action_topic='/execute_kinematic_path', robot_name=""):
        '''
                Constructor
                '''
        super(SrdfStateToMoveitExecute, self).__init__(
            outcomes=['reached', 'request_failed', 'moveit_failed', 'param_error'])

        self._config_name  = config_name
        self._robot_name   = robot_name
        self._move_group   = move_group
        self._duration     = duration
        self._wait_for_execution = wait_for_execution
        self._action_topic = action_topic
        self._client       = ProxyServiceCaller({self._action_topic: ExecuteKnownTrajectory})

        # self._action_topic = action_topic
        # self._client       =  ProxyActionServer({self._action_topic: ExecuteTrajectoryAction})

        self._request_failed = False
        self._moveit_failed  = False
        self._success        = False

        self._srdf_param = None
        if rospy.has_param("/robot_description_semantic"):
            self._srdf_param = rospy.get_param("/robot_description_semantic")
        else:
            Logger.logerror('Unable to get parameter: /robot_description_semantic')

        self._param_error = False
        self._srdf = None
        self._response = None
	def on_enter(self, userdata):
		"""Upon entering the state"""

		try:
			self._pub.publish(self._topic, OCSLogging(run=self._command, no_video=self._no_video, no_bags=self._no_bags, experiment_name=userdata.experiment_name, description=userdata.description))
		except Exception as e:
			Logger.logwarn('Could not send video logging command:\n %s' % str(e))
	def __init__(self, controllers = ["left_arm_traj_controller", "right_arm_traj_controller"]):
		'''Constructor'''
		
		super(ExecuteTrajectoryBothArmsState, self).__init__(outcomes = ['done', 'failed'],
															 input_keys = ['trajectories'])

		self._controllers = controllers
		self._controllers = ["left_arm_traj_controller", "right_arm_traj_controller"] if not(controllers) else controllers

		self._client = ProxyActionClient()
		
		self._client_topics = dict()
		self._active_topics = list()
		
		for controller in self._controllers:
			if "left_arm" in controller:
				action_topic_left  = "/trajectory_controllers/" + controller + "/follow_joint_trajectory"
				self._client.setupClient(action_topic_left, FollowJointTrajectoryAction)
				self._client_topics['left_arm'] = action_topic_left
			elif "right_arm" in controller:
				action_topic_right = "/trajectory_controllers/" + controller + "/follow_joint_trajectory"
				self._client.setupClient(action_topic_right, FollowJointTrajectoryAction)
				self._client_topics['right_arm'] = action_topic_right
			else:
				Logger.logwarn('The controller is neither a left nor a right arm trajectory controller!? %s' % str(controller))

		self._failed = False
        def on_enter(self, userdata):
                self._param_error     = False
                self._planning_failed = False
                self._control_failed  = False
                self._success         = False

                #Parameter check
                if self._srdf_param is None:
                        self._param_error = True
                        return

                try:
                        self._srdf = ET.fromstring(self._srdf_param)
                except Exception as e:
                        Logger.logwarn('Unable to parse given SRDF parameter: /robot_description_semantic')
                        self._param_error = True

                if not self._param_error:

                        robot = None
                        for r in self._srdf.iter('robot'):
                                if self._robot_name == '' or self._robot_name == r.attrib['name']:
                                        robot = r
                                        break
                        if robot is None:
                                Logger.logwarn('Did not find robot name in SRDF: %s' % self._robot_name)
                                return 'param_error'

                        config = None
                        for c in robot.iter('group_state'):
                                if (self._move_group == '' or self._move_group == c.attrib['group']) \
                                and c.attrib['name'] == self._config_name:
                                        config = c
                                        self._move_group = c.attrib['group'] #Set move group name in case it was not defined
                                        break
                        if config is None:
                                Logger.logwarn('Did not find config name in SRDF: %s' % self._config_name)
                                return 'param_error'

                        try:
                                self._joint_config = [float(j.attrib['value']) for j in config.iter('joint')]
                                self._joint_names  = [str(j.attrib['name']) for j in config.iter('joint')]
                        except Exception as e:
                                Logger.logwarn('Unable to parse joint values from SRDF:\n%s' % str(e))
                                return 'param_error'


                        #Action Initialization
                        action_goal = MoveGroupGoal()
                        action_goal.request.group_name = self._move_group
                        goal_constraints = Constraints()
                        for i in range(len(self._joint_names)):
                                goal_constraints.joint_constraints.append(JointConstraint(joint_name=self._joint_names[i], position=self._joint_config[i]))
                        action_goal.request.goal_constraints.append(goal_constraints)

                        try:
                                self._client.send_goal(self._action_topic, action_goal)
                        except Exception as e:
                                Logger.logwarn('Failed to send action goal for group: %s\n%s' % (self._move_group, str(e)))
                                self._planning_failed = True
        def __init__(self, config_name, move_group="", action_topic = '/move_group', robot_name=""):
                '''
                Constructor
                '''
                super(SrdfStateToMoveit, self).__init__(outcomes=['reached', 'planning_failed', 'control_failed', 'param_error'])


                self._config_name  = config_name
                self._move_group   = move_group
                self._robot_name   = robot_name
                self._action_topic = action_topic
                self._client       = ProxyActionClient({self._action_topic: MoveGroupAction})

                self._planning_failed = False
                self._control_failed = False
                self._success = False

                self._srdf_param = None
                if rospy.has_param("/robot_description_semantic"):
                        self._srdf_param = rospy.get_param("/robot_description_semantic")
                else:
                        Logger.logerror('Unable to get parameter: /robot_description_semantic')

                self._param_error = False
                self._srdf = None
	def on_enter(self, userdata):
		self._failed = False

		planning_group = ""
		joint_values = []
		if userdata.side == 'left' and self._target_pose in self._poses[self._robot]['left'].keys():
			planning_group = self._poses[self._robot]['left'][self._target_pose]['group']
			joint_values = self._poses[self._robot]['left'][self._target_pose]['joints']
		elif userdata.side == 'right' and self._target_pose in self._poses[self._robot]['right'].keys():
			planning_group = self._poses[self._robot]['right'][self._target_pose]['group']
			joint_values = self._poses[self._robot]['right'][self._target_pose]['joints']
		elif self._target_pose in self._poses[self._robot]['same'].keys():
			planning_group = self._poses[self._robot]['same'][self._target_pose]['group']
			joint_values = self._poses[self._robot]['same'][self._target_pose]['joints']
		else:
			Logger.logwarn('Specified target pose %d is not specified for %s side' % (self._target_pose, userdata.side))
			self._failed = True
			return

		# create the motion goal
		self._client.new_goal(planning_group)
		self._client.add_joint_values(joint_values)
		self._client.set_velocity_scaling(self._vel_scaling)
		self._client.set_collision_avoidance(self._ignore_collisions)
		self._client.add_link_padding(link_paddings = self._link_paddings) #dict
		if self._is_cartesian:
			self._client.set_cartesian_motion()

		# execute the motion
		try: 
			self._client.start_execution()
		except Exception as e:
			Logger.logwarn('Was unable to execute move group request:\n%s' % str(e))
			self._failed = True
    def execute(self, userdata):
        # execute all active states
        for name, state in self._states.items():
            if self._returned_outcomes.has_key(name): continue
            outcome = None
            if isinstance(state, smach.StateMachine):
                rmp_ud = smach.Remapper(
                            userdata,
                            state.get_registered_input_keys(),
                            state.get_registered_output_keys(),
                            {key: name + '_' + key for key in state.get_registered_input_keys() + state.get_registered_output_keys()})
                state.userdata.merge(rmp_ud, rmp_ud.keys(), dict())
                with state._state_transitioning_lock:
                    outcome = state._update_once()
            else:
                outcome = state.execute(smach.Remapper(
                            userdata,
                            state.get_registered_input_keys(),
                            state.get_registered_output_keys(),
                            {key: name + '_' + key for key in state.get_registered_input_keys() + state.get_registered_output_keys()}))
            if outcome is not None and outcome != "loopback":
                Logger.loginfo("Concurrency: %s > %s" % (name, outcome))
                self._returned_outcomes[name] = outcome

        # determine outcome
        for element in self._outcome_mapping:
            state_outcome = element['outcome']
            mapping = element['condition']
            if all(name in self._returned_outcomes and self._returned_outcomes[name] is outcome for name, outcome in mapping.items()):
                return state_outcome
	def on_enter(self, userdata):
		self._failed = False
		request = GetCartesianPathRequest()
		request.group_name = self._move_group
		request.avoid_collisions = not self._ignore_collisions
		request.max_step = 0.05

		request.header = userdata.eef_pose.header
		request.waypoints.append(userdata.eef_pose.pose)

		now = rospy.Time.now()

		try:
			self._tf.waitForTransform('base_link', 'gripper_cam_link', now, rospy.Duration(1))
			(p,q) = self._tf.lookupTransform('gripper_cam_link', 'base_link', now)

			c = OrientationConstraint()
			c.header.frame_id = 'base_link'
			c.header.stamp = now
			c.link_name = 'gripper_cam_link'
			c.orientation.x = q[0]
			c.orientation.y = q[1]
			c.orientation.z = q[2]
			c.orientation.w = q[3]
			c.weight = 1
			c.absolute_x_axis_tolerance = 0.1
			c.absolute_y_axis_tolerance = 0.1
			c.absolute_z_axis_tolerance = 0.1

			#request.path_constraints.orientation_constraints.append(c)

			self._result = self._srv.call(self._topic, request)
		except Exception as e:
			Logger.logwarn('Exception while calculating path:\n%s' % str(e))
			self._failed = True
	def execute(self, userdata):

		if self._failed or self._srv_result is None:
			return 'failed'
		
		if self._done:
			return 'done'

		if self._not_available:
			return 'not_available'

		try:
			choices = self._srv_result.template_type_information.stand_poses
			Logger.loginfo("There are %d stand pose choices and want to select entry %d" % (len(choices), userdata.preference))
			if len(choices) <= userdata.preference:
				self._not_available = True
				return 'not_available'
			userdata.stand_pose = choices[userdata.preference].pose
		except Exception as e:
			Logger.logwarn('Failed to retrieve pose information from service result:\n%s' % str(e))
			self._failed = True
			return 'failed'
		
		self._done = True
		return 'done'
	def __init__(self):
		self._sub = rospy.Subscriber("flexbe/request_behavior", BehaviorRequest, self._callback)
		self._version_sub = rospy.Subscriber("flexbe/ui_version", String, self._version_callback)

		self._pub = rospy.Publisher("flexbe/start_behavior", BehaviorSelection, queue_size=100)
		self._status_pub = rospy.Publisher("flexbe/status", BEStatus, queue_size=100)
		self._mirror_pub = rospy.Publisher("flexbe/mirror/structure", ContainerStructure, queue_size=100)

		self._rp = RosPack()
		self._behavior_lib = dict()

		Logger.initialize()

		behaviors_package = "flexbe_behaviors"
		if rospy.has_param("behaviors_package"):
			behaviors_package = rospy.get_param("behaviors_package")
		else:
			rospy.loginfo("Using default behaviors package: %s" % behaviors_package)

		manifest_folder = os.path.join(self._rp.get_path(behaviors_package), 'behaviors/')

		file_entries = [os.path.join(manifest_folder, filename) for filename in os.listdir(manifest_folder) if not filename.startswith('#')]
		manifests = sorted([xmlpath for xmlpath in file_entries if not os.path.isdir(xmlpath)])

		for i in range(len(manifests)):
			m = ET.parse(manifests[i]).getroot()
			e = m.find("executable")
			self._behavior_lib[i] = {
				"name": m.get("name"),
				"package": e.get("package_path").split(".")[0],
				"file": e.get("package_path").split(".")[1],
				"class": e.get("class")
			}

		rospy.loginfo("%d behaviors available, ready for start request." % len(self._behavior_lib.items()))
	def on_enter(self, userdata):
		''' 
		Sending plan request with wide stance mode
		'''

		self._failed = False
		self._done = False

		pattern_parameters = PatternParameters()
		pattern_parameters.steps = 4
		pattern_parameters.mode = PatternParameters.FEET_REALIGN_ON_CENTER
		pattern_parameters.close_step = True
		pattern_parameters.extra_seperation = False

		request = StepPlanRequest()
		request.parameter_set_name = String('drc_step_no_collision')
		request.header = Header(frame_id = '/world', stamp = rospy.Time.now())
		request.planning_mode = StepPlanRequest.PLANNING_MODE_PATTERN
		request.pattern_parameters = pattern_parameters

		action_goal = StepPlanRequestGoal(plan_request = request)

		try:
			self._client.send_goal(self._action_topic, action_goal)
		except Exception as e:
			Logger.logwarn('Was unable to create footstep pattern for wide stance:\n%s' % str(e))
			self._failed = True
	def set_retract_distance(self, affordance):
		'''Sets the displacement of the "insert" affordance to a negative number.'''

		retract_distance = -abs(self._insert_distance) # negative number means retract
		affordance.displacement = retract_distance
		Logger.loginfo("Will be retracting by %d centimeters" % (retract_distance*100))
		
		return affordance
	def on_enter(self, userdata):

		try:
			self._srv_result = self._srv.call(self._service_topic, GetTemplateStateAndTypeInfoRequest(userdata.template_id, 0)) # We don't care about the hand side
		
		except Exception as e:
			Logger.logwarn('Failed to send service call:\n%s' % str(e))
			self._failed = True
	def set_push_distance(self, affordance):
		'''Sets the displacement of the "insert" affordance to a positive number.'''

		push_distance = +abs(self._push_distance)
		affordance.displacement = push_distance
		Logger.loginfo("Will be retracting by %d centimeters" % (push_distance*100))
		
		return affordance
    def execute(self, userdata):
        if self._bumper_sub.has_msg(self._bumper_topic):
            sensor = self._bumper_sub.get_last_msg(self._bumper_topic)
            self._bumper_sub.remove_last_msg(self._bumper_topic)

            if sensor.state > 0:
                Logger.logwarn('Bumper %d contact' % (sensor.bumper))
                self._return = 'bumper'

        if self._cliff_sub.has_msg(self._cliff_topic):
            sensor = self._cliff_sub.get_last_msg(self._cliff_topic)
            self._cliff_sub.remove_last_msg(self._cliff_topic)
            if sensor.state > 0:
                Logger.logwarn('Cliff alert')
                self._return = 'cliff'

        return self._return
    def check_plan(self, pose, orientation=False):
        action_goal = make_default_action_goal(self, pose, orientation)
        action_goal.planning_options.planning_scene_diff.is_diff = True
        action_goal.planning_options.planning_scene_diff.robot_state.is_diff = True
        action_goal.planning_options.plan_only = True
        try:
            self._client.send_goal(action_goal)
            self._client.wait_for_result()
            res = self._client.get_result()
            print(res.error_code.val, self.planning_frame)
            if res.error_code.val < 1:
                return False
            else:
                return True

        except Exception as e:
            Logger.logwarn('Failed to send action goal for group: %s\n%s' % (self._move_group, str(e)))
    def on_enter(self, userdata):
        self._failed = False

        # create the motion goal
        self._client.new_goal(self._planning_group)
        self._client.add_joint_values(userdata.target_joint_config)

        # execute the motion
        try:
            Logger.loginfo("Moving %s to: %s" %
                           (self._planning_group, ", ".join(
                               map(str, userdata.target_joint_config))))
            self._client.start_execution()
        except Exception as e:
            Logger.logwarn('Was unable to execute move group request:\n%s' %
                           str(e))
            self._failed = True
	def execute(self, userdata):
		if self._failed:
			return 'failed'

		if self._client.has_result(self._action_topic):
			result = self._client.get_result(self._action_topic)
			if result:
				if result.error_code == FollowJointTrajectoryResult.SUCCESSFUL:
					return 'done'
				else:
					Logger.logwarn('Joint trajectory request failed to execute (%d). Reason: %s' % (result.error_code, result.error_string))
					self._failed = True
					return 'failed'
			else:
				Logger.logwarn('Wait for result returned True even though the result is %s' % str(result))
				self._failed = True
				return 'failed'
Example #35
0
    def execute(self, userdata):
        # While this state is active, check if the action has been finished and evaluate the result.

        # Check if the client failed to send the goal.
        if self._error:
            return 'failed'

        # Check if the action has been finished
        if self._client.has_result(self._topic):
            result = self._client.get_result(self._topic)

            # Set output keys
            userdata.outcome = {
                'origin': 'get_path',
                'outcome': result.outcome
            }
            userdata.path = result.path

            # Send result log
            Logger.loginfo(result.message)

            # Based on the result, decide which outcome to trigger.
            if result.outcome == GetPathResult.SUCCESS:
                return 'succeeded'
            elif result.outcome == GetPathResult.FAILURE:
                return 'failed'
            elif result.outcome == GetPathResult.NO_PATH_FOUND:
                return 'failed'
            elif result.outcome == GetPathResult.INVALID_GOAL:
                return 'failed'
            elif result.outcome == GetPathResult.INVALID_PLUGIN:
                return 'aborted'
            elif result.outcome == GetPathResult.INVALID_START:
                return 'aborted'
            elif result.outcome == GetPathResult.EMPTY_PATH:
                return 'aborted'
            elif result.outcome == GetPathResult.INTERNAL_ERROR:
                return 'aborted'
            elif result.outcome == GetPathResult.NOT_INITIALIZED:
                return 'aborted'
            elif result.outcome == GetPathResult.PAT_EXCEEDED:
                return 'failed'
            elif result.outcome == GetPathResult.STOPPED:
                return 'aborted'
            else:
                return 'aborted'
Example #36
0
    def __init__(self):
        '''
        Constructor
        '''
        self.be = None
        Logger.initialize()
        smach.set_loggers(
            rospy.logdebug,  # hide SMACH transition log spamming
            rospy.logwarn,
            rospy.logdebug,
            rospy.logerr)

        #ProxyPublisher._simulate_delay = True
        #ProxySubscriberCached._simulate_delay = True

        # prepare temp folder
        rp = rospkg.RosPack()
        self._tmp_folder = tempfile.mkdtemp()
        sys.path.append(self._tmp_folder)
        rospy.on_shutdown(self._cleanup_tempdir)

        # prepare manifest folder access
        self._behavior_lib = BehaviorLibrary()

        self._pub = ProxyPublisher()
        self._sub = ProxySubscriberCached()

        self.status_topic = 'flexbe/status'
        self.feedback_topic = 'flexbe/command_feedback'

        self._pub.createPublisher(self.status_topic, BEStatus, _latch=True)
        self._pub.createPublisher(self.feedback_topic, CommandFeedback)

        # listen for new behavior to start
        self._running = False
        self._switching = False
        self._sub.subscribe('flexbe/start_behavior', BehaviorSelection,
                            self._behavior_callback)

        # heartbeat
        self._pub.createPublisher('flexbe/heartbeat', Empty)
        self._execute_heartbeat()

        rospy.sleep(0.5)  # wait for publishers etc to really be set up
        self._pub.publish(self.status_topic, BEStatus(code=BEStatus.READY))
        rospy.loginfo('\033[92m--- Behavior Engine ready! ---\033[0m')
 def _convert_input_data(self, keys, values):
     result = dict()
     for k, v in zip(keys, values):
         # action call has empty string as default, not a valid input key
         if k == '':
             continue
         try:
             result[k] = self._convert_dict(cast(v))
         except ValueError:
             # unquoted strings will raise a ValueError, so leave it as string in this case
             result[k] = str(v)
         except SyntaxError as se:
             Logger.loginfo(
                 'Unable to parse input value for key "%s", assuming string:\n%s\n%s'
                 % (k, str(v), str(se)))
             result[k] = str(v)
     return result
	def execute(self, userdata):
		'''Execute this state'''
		if self._subscriber.has_msg(self._topic):
			msg = self._subscriber.get_last_msg(self._topic)
			# in case you want to make sure the same message is not processed twice:
			self._subscriber.remove_last_msg(self._topic)
			if not msg.found:
				return 'success'

			self.calculate_error(msg)
			Logger.loghint(self._error_result)

			for key in self._keys:
				# check tolerance
				if self._tolerance < abs(self._error_result[key]):
					userdata.output_value = self._error_result
					return 'unacceptable'
    def on_enter(self, userdata):
        # This method is called when the state becomes active, i.e. a transition from another state to this one is taken.
        # It is primarily used to start actions which are associated with this state.

        # Get transform between camera and robot1_base
        while True:
            rospy.sleep(0.1)
            try:
                target_pose = self._tf_buffer.transform(userdata.pose, "world")
                break
            except (tf2_ros.LookupException, tf2_ros.ConnectivityException,
                    tf2_ros.ExtrapolationException):
                rospy.logerr(
                    "ComputeGraspState::on_enter - Failed to transform to world"
                )
                continue

        # the grasp pose is defined as being located on top of the box
        target_pose.pose.position.z += self._offset + 0.0

        # rotate the object pose 180 degrees around - now works with -90???

        #q_orig = [target_pose.pose.orientation.x, target_pose.pose.orientation.y, target_pose.pose.orientation.z, target_pose.pose.orientation.w]
        q_orig = [0, 0, 0, 1]
        q_rot = quaternion_from_euler(self._rotation, 0, 0)
        res_q = quaternion_multiply(q_rot, q_orig)
        target_pose.pose.orientation = geometry_msgs.msg.Quaternion(*res_q)

        # use ik service to compute joint_values
        self._srv_req = GetPositionIKRequest()
        self._srv_req.ik_request.group_name = self._group
        self._srv_req.ik_request.robot_state.joint_state = rospy.wait_for_message(
            self._group + '/joint_states', sensor_msgs.msg.JointState)

        self._srv_req.ik_request.ik_link_name = self._tool_link  # TODO: this needs to be a parameter
        self._srv_req.ik_request.pose_stamped = target_pose
        self._srv_req.ik_request.avoid_collisions = False
        self._srv_req.ik_request.attempts = 500

        try:
            self._srv_result = self._ik_srv.call(self._srv_name, self._srv_req)
            self._failed = False

        except Exception as e:
            Logger.logwarn('Could not call IK: ' + str(e))
            self._failed = True
    def execute(self, userdata):

        if self.preempt_requested():
            self.service_preempt()
            return 'preempted'

        request = GetTaskRequest()
        # before userdata.task_details_task_id
        request.task_id = 'victim_0_autonomous'

        try:
            response = self.getTask.call(self._topic_get_task, request).task
        except Exception, e:
            Logger.loginfo('[behavior_get_closer] Could not get task:' +
                           str(e))
            rospy.sleep(0.5)
            return 'waiting'
    def on_enter(self, userdata):
        # Update self.current_pose.
        whole_body = self.robot.get('whole_body')
        self.current_pose = whole_body.get_end_effector_pose(ref_frame_id='map')
        target_poses = [poses for poses in userdata.target_poses.items()]
        #target_poses = userdata.target_poses
        category = userdata.category
        # failed_objects = userdata.failed_objects
        # collections = {"known": self.known_dict.keys(), "unknown": self.unknown_list}
        candidates = [category]
        print("category: ", candidates)
        target_pose = [pose for pose in target_poses if pose[0] in candidates]
        print("target: ", target_pose)
        # target_pose = [pose for pose in target_pose if not pose[0] in [object for object, value in failed_objects.items() if value is True]]
        if target_pose != []:
            print('target_pose:', target_pose)
            distance_array = np.array([])
            for pose in target_pose:
                distance = \
                math.sqrt(pow((pose[1].position.x - self.current_pose.pos.x), 2) \
                + pow((pose[1].position.y - self.current_pose.pos.y), 2) \
                + pow((pose[1].position.z - self.current_pose.pos.z), 2))
                distance_array = np.append(distance_array, distance)
            distance_index = np.argsort(distance_array)
            self.selected_pose_grasp = copy.deepcopy(target_pose[distance_index[0]][1])
            self.selected_object_name = target_pose[distance_index[0]][0]
            self.selected_object_status = 'Success!'


            fix_orientation =self.quaternion_from_position(self.current_pose.pos, self.selected_pose_grasp.position)
            self.selected_pose_grasp.orientation.x, self.selected_pose_grasp.orientation.y, \
            self.selected_pose_grasp.orientation.z, self.selected_pose_grasp.orientation.w = fix_orientation
            print("grasp: ", self.selected_pose_grasp)
            print("name: ", self.selected_object_name)
            # if self.check_plan(pose = self.selected_pose_grasp, orientation=True) == False:
            #     self.selected_pose_approach = None
            #     self.selected_pose_grasp = None
            #     self.selected_object_status = 'fail_plan'
            print('object_name: ', self.selected_object_name)
            print('object_status: ', self.selected_object_status)
        else:
            Logger.logwarn('detect result is empty')
            self.selected_pose_grasp = None
            self.selected_object_name = None
            self.selected_object_status = 'not_detect'
    def execute(self, userdata):
        '''
        Execute this state
        '''
        if self.return_code is not None:
            # Return any previously assigned return code if we are in pause
            userdata.status_text = self.status_text
            return self.return_code

        if self.client.has_result(self.current_action_topic):
            result = self.client.get_result(self.current_action_topic)

            if (result.valid):
                self.return_code = 'valid'
                self.status_text = 'checked robot state is valid'
            else:
                self.return_code = 'invalid'
                self.status_text = 'checked robot state is not valid! number of contacts = %d' % (
                    len(result.contacts))

            Logger.loginfo(self.status_text)
            userdata.status_text = self.status_text
            return self.return_code

        elif self.client.get_state(
                self.current_action_topic) == GoalStatus.ABORTED:
            self.status_text = "StateValidation - %s request aborted by state validation action server\n %s" % (
                self.name,
                self.action_client.get_goal_status_text(
                    self.current_action_topic))
            self.return_code = 'failed'
            Logger.logerr(self.status_text)
            userdata.status_text = self.status_text
            return self.return_code
        elif self.client.get_state(
                self.current_action_topic) == GoalStatus.REJECTED:
            # No result returned is returned for this action, so go by the client state
            userdata.valid = self.valid
            self.status_text = "StateValidation - %s request rejected by state validation action server" % (
                self.name,
                self.action_client.get_goal_status_text(
                    self.current_action_topic))
            self.return_code = 'failed'
            Logger.logerr(self.status_text)
            userdata.status_text = self.status_text
            return self.return_code
        elif self.timeout_target is not None and rospy.Time.now(
        ) > self.timeout_target:
            self.status_text = "StateValidation - timeout waiting for %s to state validation (%f > %f (%f))" % (
                self.name, rospy.Time.now().to_sec(),
                self.timeout_target.to_sec(), self.timeout_duration.to_sec())
            self.return_code = 'failed'
            Logger.logerr(self.status_text)
            userdata.status_text = self.status_text
            return self.return_code
    def on_enter(self, userdata):
        self._failed = False

        planning_group = ""
        joint_values = []
        if userdata.side == 'left' and self._target_pose in self._poses[
                self._robot]['left'].keys():
            planning_group = self._poses[self._robot]['left'][
                self._target_pose]['group']
            joint_values = self._poses[self._robot]['left'][
                self._target_pose]['joints']
        elif userdata.side == 'right' and self._target_pose in self._poses[
                self._robot]['right'].keys():
            planning_group = self._poses[self._robot]['right'][
                self._target_pose]['group']
            joint_values = self._poses[self._robot]['right'][
                self._target_pose]['joints']
        elif self._target_pose in self._poses[self._robot]['same'].keys():
            planning_group = self._poses[self._robot]['same'][
                self._target_pose]['group']
            joint_values = self._poses[self._robot]['same'][
                self._target_pose]['joints']
        else:
            Logger.logwarn(
                'Specified target pose %d is not specified for %s side' %
                (self._target_pose, userdata.side))
            self._failed = True
            return

        # create the motion goal
        self._client.new_goal(planning_group)
        self._client.add_joint_values(joint_values)
        self._client.set_velocity_scaling(self._vel_scaling)
        self._client.set_collision_avoidance(self._ignore_collisions)
        self._client.add_link_padding(link_paddings=self._link_paddings)  #dict
        if self._is_cartesian:
            self._client.set_cartesian_motion()

        # execute the motion
        try:
            self._client.start_execution()
        except Exception as e:
            Logger.logwarn('Was unable to execute move group request:\n%s' %
                           str(e))
            self._failed = True
    def on_enter(self, userdata):
        self.save_file = userdata.load_file
        if self.tidy_order == []:
            try:
                dict2string_obj_inf = []
                for k, v in userdata.detect_objects.items():
                    pose_txt = str(v.position.x)+","+ \
                               str(v.position.y)+","+ \
                               str(v.position.z)
                    feature = ""
                    for f in userdata.detect_objects_feature[k]:
                        feature += str(f) + ","
                    # rospy.loginfo("\n\n"+str(feature)+str(len(feature))+"\n\n")
                    dict2string_obj_inf.append(k)
                    dict2string_obj_inf.append(pose_txt)
                    dict2string_obj_inf.append(feature)

                #print"SpaCoTyPlanning debug: "+str(dict2string_obj_inf)
                req = self.em_spacoty_tidy_greedy(dict2string_obj_inf,
                                                  self.save_file)
            except rospy.ServiceException, e:
                rospy.loginfo("[Service spacoty/client] call failed: %s", e)
            if req.done == True:
                request_result = req.tidy_object_order_and_pose
                self.low_obj_prob = req.low_obj_prob
                #tidy_order = []
                # string to dict
                self.s2d = {}
                for i in xrange(len(request_result)):
                    if i % 2 == 0:
                        p = Pose()
                        p_and_o = request_result[i + 1].split(",")
                        p.position.x = float(p_and_o[0])
                        p.position.y = float(p_and_o[1])
                        p.position.z = float(p_and_o[2])
                        #p.orientation.w = 1.0

                        self.s2d.update({request_result[i]: p})
                        self.tidy_order.append(request_result[i])

                str_nm = "["
                for i, nm in enumerate(self.tidy_order):
                    str_nm += " " + str(i) + ": " + nm
                str_nm += "]"
                Logger.loginfo("Plan: " + str_nm)
    def __init__(self):
        '''
        Constructor
        '''
        super(GetJointNamesFromMoveGroupState,
              self).__init__(outcomes=['retrieved', 'param_error'],
                             input_keys=['robot_name', 'selected_move_group'],
                             output_keys=['move_group', 'joint_names'])
        self.moveit_client = None
        try:
            self.moveit_client = ProxyMoveItClient(None)

        except Exception as e:
            Logger.logerr(
                " %s  -  exception on initialization of ProxyMoveItClient \n%s"
                % (self.name, str(e)))

        self.return_code = None
Example #46
0
    def on_enter(self, userdata):
        # When entering this state, we send the action goal once to let the robot start its work.

        # Create the goal.
        goal = MoveBaseGoal()
        goal.tolerance = self._tolerance
        goal.target_pose = userdata.target_pose
        goal.planner = self._planner
        goal.controller = self._controller
        goal.recovery_behaviors = self._recovery_behaviors

        # Send the goal.
        self._error = False  # make sure to reset the error state since a previous state execution might have failed
        try:
            self._client.send_goal(self._topic, goal)
        except Exception as e:
            Logger.logwarn('Failed to send goal:\n%s' % str(e))
            self._error = True
	def execute(self, userdata):
		'''Execute this state'''

		print("age: " +str(userdata.age))
		print("gender: " +str(userdata.gender))
		Logger.logwarn("age: " +str(userdata.age))
		Logger.logwarn("gender: " +str(userdata.gender))

		print("talking now")

		if(userdata.age>40 and userdata.gender=="Male"):
			os.system("python3 {}catkin_ws/src/robot_voice/src/ohbot_say_function.py {}".format(home,str(7)))
		if(userdata.age<40 and userdata.gender=="Male"):
			os.system("python3 {}catkin_ws/src/robot_voice/src/ohbot_say_function.py {}".format(home,str(8)))
		if(userdata.gender=="Female"):
			os.system("python3 {}catkin_ws/src/robot_voice/src/ohbot_say_function.py {}".format(home,str(9)))

		return self._outcome
Example #48
0
    def execute(self, userdata):
        """Wait for action result and return outcome accordingly"""

        if self._arrived:
            return 'arrived'
        if self._failed:
            return 'failed'

        if self._client.has_result(self._action_topic):
            status = self._client.get_state(self._action_topic)
            if status == GoalStatus.SUCCEEDED:
                self._arrived = True
                return 'arrived'
            elif status in [GoalStatus.PREEMPTED, GoalStatus.REJECTED,
                            GoalStatus.RECALLED, GoalStatus.ABORTED]:
                Logger.logwarn('Navigation failed: %s' % str(status))
                self._failed = True
                return 'failed'
Example #49
0
    def calc_pose(self, input_list):
        pose = input_list[0]
        sdv = input_list[1]

        out_pose = PoseStamped()
        out_pose.pose.position.x = pose.pose.position.x + random.gauss(
            self.waypoint_distance, sdv)
        out_pose.pose.position.y = pose.pose.position.y + random.gauss(0, sdv)
        out_pose.pose.orientation = Quaternion(w=1)
        out_pose.header = Header(frame_id="world")

        print out_pose

        Logger.loginfo(
            "Calculated new positon (%s/%s)." %
            (str(out_pose.pose.position.x), str(out_pose.pose.position.y)))

        return out_pose
    def execute(self, userdata):
        if self.result:
            return self.result

        if self.waitForExecution:
            curState = self.group.get_current_joint_values()
            diff = compareStates(curState, self.endState)
            print("diff=" + str(diff))
            if diff < self.tol or self.timeout + rospy.Duration(
                    self.watchdog) < rospy.Time.now():
                self.count += 1
                if self.count > 3:
                    Logger.loginfo('Target reached :)')
                    return "done"
            else:
                self.count = 0
        else:
            return "done"
    def __init__(self, topic='/do_adaption'):

        super(HandoverAdaptionReset,
              self).__init__(outcomes=['succeeded', 'error'])

        self._topic = topic
        self._command = 0
        self._reality_damp = 0.5
        self._fixed_orientation = False
        self._terminate = True

        self._client = actionlib.SimpleActionClient(self._topic,
                                                    DoAdaptionAction)
        Logger.loginfo('Waiting for adaption server ...')
        self._client.wait_for_server()
        Logger.loginfo('found adaption server!')

        self._error = False
Example #52
0
    def execute(self, userdata):
        '''
		Execute this state
		'''
        if self._failed:
            return 'failed'
        if self._reached:
            return 'reached'

        if self._client.has_result(self._action_topic):
            result = self._client.get_result(self._action_topic)
            if result.result == 1:
                self._reached = True
                return 'reached'
            else:
                self._failed = True
                Logger.logwarn('Failed to reach waypoint!')
                return 'failed'
	def calc_rotation_angle(self, affordance):
		'''Calculates the angle for the next planning step'''
		if ( self._state_machine.userdata.move_to_poses ):
			new_rotation_angle = math.radians(self.angle_increment_deg)
			self.total_displacement += new_rotation_angle
		else:
			new_rotation_angle = affordance.displacement + math.radians(self.angle_increment_deg)
			self.total_displacement = new_rotation_angle
		
		self._state_machine.userdata.current_target_angle_deg = self._state_machine.userdata.current_target_angle_deg + self.angle_increment_deg
		while ( self._state_machine.userdata.current_target_angle_deg >= 360 ):
			self._state_machine.userdata.current_target_angle_deg = self._state_machine.userdata.current_target_angle_deg - 360;
		
		affordance.displacement = new_rotation_angle
		
		Logger.loginfo("Next rotation step: %f degrees (%f increment from current position)" % (self._state_machine.userdata.current_target_angle_deg, math.degrees(new_rotation_angle)))
		
		return affordance
    def on_exit(self, userdata):
        self.cmd_pub.linear.x = 0.0
        self.pub.publish(self.vel_topic, self.cmd_pub)

        self.cmd_status = RobotStatus()
        self.cmd_status.currentTask = ''
        self.cmd_status.currentBehaviorStatus = ''
        self.cmd_status.lastTask = ''
        self.cmd_status.lastTaskResult = ''
        self.cmd_status.nextTask = ''
        self.cmd_status.allActions = []
        self.cmd_status.indexCurrent = -1
        self.cmd_status.actionResults = []
        self.cmd_status.batteryCapacity = 0.0
        self.cmd_status.batteryVoltage = 0.0
        self.cmd_status.listen = False

        Logger.loginfo("Drive FWD ENDED!")
 def execute(self, userdata):
     '''
     Execute this state
     '''
     if self._param_error:
         return 'param_error'
     if self._request_failed:
         return 'request_failed'
     if self._response.error_code.val != MoveItErrorCodes.SUCCESS:
         Logger.logwarn('Move action failed with result error code: %s' %
                        str(self._response.error_code))
         self._moveit_failed = True
         return 'moveit_failed'
     else:
         Logger.loginfo('Move action succeeded: %s' %
                        str(self._response.error_code))
         self._success = True
         return 'reached'
Example #56
0
    def setGoal(self, pose):

        rospy.wait_for_service('/move_base/clear_costmaps')
        serv = rospy.ServiceProxy('/move_base/clear_costmaps', Empty)
        serv()
        goal = MoveBaseGoal()

        goal.target_pose.pose = pose

        goal.target_pose.header.frame_id = "base_link"
        # goal.target_pose.header.stamp.secs = 5.0

        # Send the action goal for execution
        try:
            self._client.send_goal(self._action_topic, goal)
        except Exception as e:
            Logger.logwarn("Unable to send navigation action goal:\n%s" % str(e))
            self._failed = True
Example #57
0
	def on_enter(self, userdata):
		# When entering this state, we send the action goal once to let the robot start its work.

		# As documented above, we get the specification of which dishwasher to use as input key.
		# This enables a previous state to make this decision during runtime and provide the ID as its own output key.
		
		# Create the goal.
		

		# Send the goal.
		self._error = False # make sure to reset the error state since a previous state execution might have failed
		try:
			self._client.send_goal(self._topic, goal)
		except Exception as e:
			# Since a state failure not necessarily causes a behavior failure, it is recommended to only print warnings, not errors.
			# Using a linebreak before appending the error log enables the operator to collapse details in the GUI.
			Logger.logwarn('Failed to send the move command:\n%s' % str(e))
			self._error = True
Example #58
0
    def execute(self, userdata):
        if self._active:
            """Wait for action result and return outcome accordingly"""

            self.Entity = None

            # Get the entity's object in the latest detections
            if self._sub.has_msg(self.entities_topic):
                message = self._sub.get_last_msg(self.entities_topic)
                for entity in message.entities:
                    if entity.ID == userdata.ID:
                        self.Entity = entity
                        print("entity found: "+str(entity.ID))

            # If entity is defined, get the direction to it
            if self.Entity:

                if (self.Entity.name == "person"):
                    if (self.Entity.face.id != ""):
                        self.Entity.position.z += self.Entity.face.boundingBox.Center.z-0.1
                    else:
                        self.Entity.position.z += 1.6

                ms = Float64()
                serv = rospy.ServiceProxy('/get_direction', get_direction)
                self.service.point = self.Entity.position
                resp = serv(self.service)
                # Publish to both Yaw and Pitch controllers
                ms.data = min(max(-resp.pitch, -0), 1)
                self.pubp.publish(ms)
                ms.data = min(max(resp.yaw, -1.2), 1.2)
                self.puby.publish(ms)
                return
        else:
            Logger.logwarn("simulation mode: let's assume I'm looking at something")
            return

        ms = Float64()
        ms.data = 0.3
        self.pubp.publish(ms)
        ms.data = 0
        self.puby.publish(ms)

        return "failed"
Example #59
0
    def on_start(self):

        self._return = None  # Clear completion flag

        # Wait for odometry message
        while (not self._odom_sub.has_msg(self._odom_topic)):
            Logger.logwarn('Waiting for odometry message from the robot ')
            rospy.sleep(0.05)

        while (not self._odom_sub.has_msg(self._odom_topic)):
            Logger.logwarn(
                'Waiting for odometry message to become available from the robot '
            )
            rospy.sleep(0.25)

        self._last_odom = self._sub.get_last_msg(self._odom_topic)
        self._odom_frame = self._last_odom.header.frame_id
        #Logger.loginfo('   odometry frame id <%s>' % (self._odom_frame))

        # Update the target transformation
        self._target.header.stamp = self._last_odom.header.stamp
        while (self.transformOdom(self._target) is None):
            Logger.logwarn(
                'Waiting for tf transformations to odometry frame to become available from the robot '
            )
            rospy.sleep(0.25)
            self._target.header.stamp = rospy.Time.now()

        while (self.transformMap(self._last_odom) is None):
            Logger.logwarn(
                'Waiting for tf transformations to map frame become available from the robot '
            )
            rospy.sleep(0.25)
            self._last_odom = self._sub.get_last_msg(self._odom_topic)

        self._current_position = self.transformMap(self._last_odom)

        # This method is called when the state becomes active, i.e. a transition from another state to this one is taken.
        if (self._marker_pub):
            self._marker.action = Marker.ADD
            self._marker.color.a = 1.0  # Set alpha otherwise the marker is invisible
            self._marker.color.r = 0.0
            self._marker.color.g = 0.0
            self._marker.color.b = 1.0  # Indicate this target is planned
            self._marker_pub.publish(self._marker_topic, self._marker)
            self._marker_pub.publish(self._marker_topic,
                                     self._reference_marker)
            self._marker_pub.publish(self._marker_topic,
                                     self._local_target_marker)
            self._marker.action = Marker.MODIFY
            self._reference_marker.action = Marker.MODIFY
            self._reference_marker.color.a = 1.0  # Set alpha so it will become visible on next publish
            self._local_target_marker.action = Marker.MODIFY
            self._local_target_marker.color.a = 1.0  # Set alpha so it will become visible on next publish
    def __init__(self,
                 timeout=5.0,
                 enter_wait_duration=0.0,
                 action_topic=None):
        '''
        Constructor
        '''
        super(JointValuesToMoveItPlanState,
              self).__init__(outcomes=[
                  'planned', 'failed', 'topics_unavailable', 'param_error'
              ],
                             input_keys=[
                                 'action_topic', 'move_group', 'joint_names',
                                 'joint_values'
                             ],
                             output_keys=['joint_trajectory'])

        self.timeout_duration = rospy.Duration(timeout)
        self.enter_wait_duration = enter_wait_duration
        self.given_action_topic = action_topic
        self.moveit_client = None
        self.action_client = None
        self.return_code = None
        self.move_group = None
        self.joint_names = None
        self.joint_values = None

        try:
            self.moveit_client = ProxyMoveItClient(None)

            if (self.given_action_topic
                    is not None) and (len(self.given_action_topic) > 0):
                # If topic is defined, set the client up on startup
                self.moveit_client.setup_action_client(
                    self.given_action_topic, "MoveGroupAction",
                    self.enter_wait_duration)
            else:
                self.given_action_topic = None  # override empty string

        except Exception as e:
            Logger.logerr(" Exception on initialization of %s\n %s" %
                          (self.name, str(e)))

        self.current_action_topic = self.given_action_topic