00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 import roslib
00040 roslib.load_manifest('pr2_gripper_grasp_planner_cluster')
00041 import rospy
00042 from object_manipulation_msgs.srv import GraspPlanning, GraspPlanningResponse
00043 from object_manipulation_msgs.msg import Grasp
00044 import pr2_gripper_grasp_planner_cluster.pr2_gripper_grasp_planner_cluster as grasp_planner_cluster
00045 from sensor_msgs.msg import JointState
00046 import random
00047 import pdb
00048 from object_manipulator.convert_functions import *
00049
00050
00051 class PointClusterGraspPlannerServer:
00052
00053 def __init__(self):
00054
00055 self.pcgp = grasp_planner_cluster.PointClusterGraspPlanner()
00056
00057
00058 rospy.Service('plan_point_cluster_grasp', GraspPlanning, self.plan_point_cluster_grasp_callback)
00059
00060
00061 rospy.Service('evaluate_point_cluster_grasps', GraspPlanning, self.evaluate_point_cluster_grasps_callback)
00062
00063
00064 self.randomize_grasps = rospy.get_param("~randomize_grasps", 0)
00065 rospy.loginfo("randomize_grasps:"+str(self.randomize_grasps))
00066 random.seed()
00067
00068
00069
00070 def evaluate_point_cluster_grasps_callback(self, req):
00071
00072
00073
00074 self.pcgp.init_cluster_grasper(req.target.cluster)
00075
00076
00077 probs = self.pcgp.evaluate_point_cluster_grasps(req.grasps_to_evaluate, req.target.cluster.header.frame_id)
00078
00079
00080 try:
00081 for (grasp, prob) in zip(req.grasps_to_evaluate, probs):
00082 grasp.success_probability = prob
00083 except:
00084 pdb.set_trace()
00085
00086
00087 resp = GraspPlanningResponse()
00088 resp.error_code.value = 0
00089 resp.grasps = req.grasps_to_evaluate
00090
00091 return resp
00092
00093
00094
00095
00096 def create_joint_state(self, hand_joints, position):
00097 js = JointState()
00098 js.name = hand_joints
00099 js.position = len(hand_joints)*[position]
00100 js.effort = len(hand_joints)*[100.]
00101 return js
00102
00103
00104
00105 def plan_point_cluster_grasp_callback(self, req):
00106 rospy.loginfo("planning grasps for a point cluster")
00107
00108
00109 self.pcgp.init_cluster_grasper(req.target.cluster)
00110
00111
00112 (pregrasp_poses, grasp_poses, gripper_openings, qualities) = self.pcgp.plan_point_cluster_grasps()
00113
00114
00115 arm_name = "right_arm"
00116 if req.arm_name:
00117 arm_name = req.arm_name
00118 else:
00119 rospy.logerr("point cluster grasp planner: missing arm_name in request! Using right_arm")
00120 hand_joints = rospy.get_param('/hand_description/'+arm_name+'/hand_joints')
00121 rospy.loginfo("hand_joints:"+str(hand_joints))
00122
00123
00124 resp = GraspPlanningResponse()
00125 resp.error_code.value = resp.error_code.SUCCESS
00126 grasp_list = []
00127 if pregrasp_poses == None:
00128 resp.error_code.value = resp.error_code.OTHER_ERROR
00129
00130 else:
00131 for (grasp_pose, quality) in zip(grasp_poses, qualities):
00132 pre_grasp_joint_state = self.create_joint_state(hand_joints, 10.)
00133 grasp_joint_state = self.create_joint_state(hand_joints, 0.)
00134
00135
00136
00137 if req.target.cluster.header.frame_id == req.target.reference_frame_id:
00138 transformed_grasp_pose = grasp_pose
00139 else:
00140 transformed_grasp_pose = change_pose_stamped_frame(self.pcgp.tf_listener,
00141 stamp_pose(grasp_pose, req.target.cluster.header.frame_id),
00142 req.target.reference_frame_id).pose
00143 grasp_list.append(Grasp(pre_grasp_posture=pre_grasp_joint_state, grasp_posture=grasp_joint_state,
00144 grasp_pose=transformed_grasp_pose, success_probability=quality))
00145
00146
00147 if self.randomize_grasps:
00148 first_grasps = grasp_list[:30]
00149 random.shuffle(first_grasps)
00150 shuffled_grasp_list = first_grasps + grasp_list[30:]
00151 resp.grasps = shuffled_grasp_list
00152 else:
00153 resp.grasps = grasp_list
00154
00155 return resp
00156
00157
00158 if __name__ == '__main__':
00159 rospy.init_node('point_cluster_grasp_planner', anonymous=True)
00160
00161 pcgps = PointClusterGraspPlannerServer()
00162
00163 rospy.loginfo("point cluster grasp planner is ready for queries")
00164 rospy.spin()