Go to the documentation of this file.00001
00002 '''
00003 Test client for point_cluster_grasp_planner.
00004 Requires tabletop_node.launch to be running (in tabletop_object_detector).
00005 Add Markers of topic 'grasp_markers' to see the poses being tested.
00006 '''
00007
00008 from __future__ import division
00009 import roslib
00010 roslib.load_manifest('katana_tabletop_manipulation_launch')
00011 import rospy
00012 from object_manipulation_msgs.srv import FindClusterBoundingBox, FindClusterBoundingBoxRequest
00013 from tabletop_object_detector.srv import TabletopDetection, TabletopDetectionRequest
00014 from object_manipulation_msgs.srv import GraspPlanning, GraspPlanningRequest
00015 from visualization_msgs.msg import Marker
00016 import tf.transformations
00017 import numpy
00018 import scipy
00019 import time
00020 import katana_tabletop_manipulation_launch.draw_functions as draw_functions
00021 from katana_tabletop_manipulation_launch.convert_functions import *
00022
00023
00024
00025 def call_object_detector():
00026
00027 req = TabletopDetectionRequest()
00028 req.return_clusters = 1
00029 req.return_models = 0
00030 service_name = "/object_detection"
00031 rospy.loginfo("waiting for object_detection service")
00032 rospy.wait_for_service(service_name)
00033 serv = rospy.ServiceProxy(service_name, TabletopDetection)
00034 try:
00035 res = serv(req)
00036 except rospy.ServiceException, e:
00037 rospy.logerr("error when calling object_detection: %s"%e)
00038 return 0
00039 return (res.detection.table, res.detection.clusters)
00040
00041
00042
00043 def call_plan_point_cluster_grasp(cluster):
00044
00045 req = GraspPlanningRequest()
00046 req.target.cluster = cluster
00047 req.arm_name = "arm"
00048 req.collision_support_surface_name = "table"
00049 service_name = "openrave_grasp_planner"
00050 rospy.loginfo("waiting for /openrave_grasp_planner service")
00051 rospy.wait_for_service(service_name)
00052 rospy.loginfo("service found")
00053 serv = rospy.ServiceProxy(service_name, GraspPlanning)
00054 try:
00055 res = serv(req)
00056 except rospy.ServiceException, e:
00057 rospy.logerr("error when calling plan_point_cluster_grasp: %s"%e)
00058 return 0
00059 if res.error_code.value != 0:
00060 return []
00061
00062 grasp_poses = [grasp.grasp_pose for grasp in res.grasps]
00063 return grasp_poses
00064
00065
00066
00067 def call_find_cluster_bounding_box(cluster):
00068
00069 req = FindClusterBoundingBoxRequest()
00070 req.cluster = cluster
00071 service_name = "find_cluster_bounding_box"
00072 rospy.loginfo("waiting for find_cluster_bounding_box service")
00073 rospy.wait_for_service(service_name)
00074 rospy.loginfo("service found")
00075 serv = rospy.ServiceProxy(service_name, FindClusterBoundingBox)
00076 try:
00077 res = serv(req)
00078 except rospy.ServiceException, e:
00079 rospy.logerr("error when calling find_cluster_bounding_box: %s"%e)
00080 return 0
00081 if not res.error_code:
00082 return (res.pose, res.box_dims)
00083 else:
00084 return (None, None)
00085
00086
00087 if __name__ == "__main__":
00088
00089
00090 rospy.init_node('test_point_cluster_grasp_planner', anonymous=True)
00091 tf_broadcaster = tf.TransformBroadcaster()
00092 tf_listener = tf.TransformListener()
00093 draw_functions = draw_functions.DrawFunctions('grasp_markers')
00094
00095
00096 (table, clusters) = call_object_detector()
00097 print "table:\n", table
00098
00099
00100 while(not rospy.is_shutdown()):
00101
00102
00103 for cluster in clusters:
00104 draw_functions.clear_grasps(num=1000)
00105
00106
00107 (box_pose, box_dims) = call_find_cluster_bounding_box(cluster)
00108 if box_pose == None:
00109 continue
00110 box_mat = pose_to_mat(box_pose.pose)
00111 box_ranges = [[-box_dims.x/2, -box_dims.y/2, -box_dims.z/2],
00112 [box_dims.x/2, box_dims.y/2, box_dims.z/2]]
00113 draw_functions.draw_rviz_box(box_mat, box_ranges, 'katana_base_link', \
00114 ns = 'bounding box', \
00115 color = [0,0,1], opaque = 0.25, duration = 60)
00116
00117 print "Run the blue cluster? Enter y to run, enter to go to the next, q to exit"
00118 c = raw_input()
00119
00120 if c == 'y':
00121 draw_functions.clear_rviz_points('grasp_markers')
00122
00123
00124 grasps = call_plan_point_cluster_grasp(cluster)
00125
00126
00127 print "number of grasps returned:", len(grasps)
00128 print "drawing grasps: press p to pause after each one in turn, enter to show all grasps at once"
00129 c = raw_input()
00130 if c == 'p':
00131 draw_functions.draw_grasps(grasps, cluster.header.frame_id, pause = 1)
00132 else:
00133 draw_functions.draw_grasps(grasps, cluster.header.frame_id, pause = 0)
00134 print "done drawing grasps, press enter to continue"
00135 raw_input()
00136
00137
00138 draw_functions.clear_grasps(num = 1000)
00139
00140 elif c == 'q':
00141 break
00142 else:
00143 continue
00144 break