00001
00002 import roslib
00003 roslib.load_manifest("hrl_pr2_arms")
00004 roslib.load_manifest("hrl_generic_arms")
00005 roslib.load_manifest("hrl_lib")
00006 roslib.load_manifest("hrl_msgs")
00007 roslib.load_manifest("ar_pose")
00008
00009 import math, time, copy
00010 import numpy as np
00011 import tf, rospy, actionlib
00012 import hrl_lib.transforms as hrl_tr
00013 import tf.transformations as tf_trans
00014 import hrl_pr2_arms.pr2_controller_switcher as pr2cs
00015 import hrl_pr2_arms.pr2_arm as pr2arm
00016 import hrl_generic_arms.ep_trajectory_controller as eptc
00017
00018 from actionlib_msgs.msg import *
00019 from pr2_controllers_msgs.msg import *
00020 from ar_pose.msg import ARMarkers
00021 from std_msgs.msg import String, Bool
00022 from hrl_msgs.msg import StringArray
00023
00024
00025 class head():
00026 def __init__(self):
00027
00028 self.client = actionlib.SimpleActionClient('/head_traj_controller/point_head_action',
00029 PointHeadAction)
00030 self.client.wait_for_server()
00031 self.goal = PointHeadGoal()
00032
00033 def set_pose(self, pos):
00034 self.goal.target.header.frame_id = 'torso_lift_link'
00035 self.goal.target.point.x = pos[0]
00036 self.goal.target.point.y = pos[1]
00037 self.goal.target.point.z = pos[2]
00038 self.goal.min_duration = rospy.Duration(3.)
00039 rospy.logout('Sending Head Goal')
00040 self.client.send_goal(self.goal)
00041 self.client.wait_for_result()
00042
00043 if self.client.get_state() == GoalStatus.SUCCEEDED:
00044 print "Succeeded"
00045 else:
00046 print "Failed"
00047
00048
00049 class torso():
00050 def __init__(self):
00051 self.client = actionlib.SimpleActionClient('/torso_controller/position_joint_action',
00052 SingleJointPositionAction)
00053 self.client.wait_for_server()
00054 self.pos = SingleJointPositionGoal()
00055
00056 def down(self):
00057
00058 self.pos.position = 0.15
00059 self.pos.min_duration = rospy.Duration(2.)
00060 self.pos.max_velocity = 1.
00061 rospy.logout('Sending torso down')
00062 self.client.send_goal(self.pos)
00063 self.client.wait_for_result()
00064
00065 if self.client.get_state() == GoalStatus.SUCCEEDED:
00066 print "Succeeded"
00067 else:
00068 print "Failed"
00069
00070
00071 class gripper():
00072 def __init__(self):
00073 self.r_client = actionlib.SimpleActionClient('r_gripper_controller/gripper_action',
00074 Pr2GripperCommandAction)
00075 self.r_client.wait_for_server()
00076 self.l_client = actionlib.SimpleActionClient('l_gripper_controller/gripper_action',
00077 Pr2GripperCommandAction)
00078 self.r_client.wait_for_server()
00079 self.state = Pr2GripperCommandGoal()
00080
00081 def Open(self, arm='left_arm'):
00082 if arm == 'left_arm':
00083 client = self.l_client
00084 elif arm == 'right_arm':
00085 client = self.r_client
00086
00087 self.state.command.position = .07
00088 self.state.command.max_effort = -1.
00089 rospy.logout('Open the gripper')
00090 client.send_goal(self.state)
00091 client.wait_for_result()
00092 if client.get_state() == GoalStatus.SUCCEEDED:
00093 print "Succeeded"
00094 else:
00095 print "Failed"
00096
00097
00098 def Close(self, arm='left_arm'):
00099 if arm == 'left_arm':
00100 client = self.l_client
00101 elif arm == 'right_arm':
00102 client = self.r_client
00103
00104 self.state.command.position = 0.
00105 self.state.command.max_effort = 50.
00106 rospy.logout('Close the gripper')
00107 client.send_goal(self.state)
00108 client.wait_for_result()
00109 if client.get_state() == GoalStatus.SUCCEEDED:
00110 print "Succeeded"
00111 else:
00112 print "Failed"
00113
00114
00115 class ar_manipulation():
00116 def __init__(self):
00117 rospy.init_node("ar_manipulation")
00118
00119
00120 rospy.Subscriber("/ar_object_name", StringArray, self.marker_lookup_cb)
00121 rospy.Subscriber("/put_back_tool", String, self.put_back_tool_cb)
00122
00123 self.pub_rate = rospy.Rate(10)
00124 self.torso = torso()
00125 self.head = head()
00126 self.gripper = gripper()
00127 self.tf_listener = tf.TransformListener()
00128 self.cs = pr2cs.ControllerSwitcher()
00129 self.pr2_init = False
00130 self.search_tag = False
00131 self.found_tag = False
00132 self.grasp_object = False
00133
00134
00135 self.r_arm_cart = pr2arm.create_pr2_arm('r', pr2arm.PR2ArmJTranspose,
00136 controller_name="%s_cart", timeout=0)
00137 self.l_arm_cart = pr2arm.create_pr2_arm('l', pr2arm.PR2ArmJTranspose,
00138 controller_name="%s_cart", timeout=0)
00139
00140 self.r_arm = pr2arm.create_pr2_arm('r', pr2arm.PR2ArmJointTrajectory,
00141 controller_name="%s_arm_controller",
00142 timeout=0)
00143 self.l_arm = pr2arm.create_pr2_arm('l', pr2arm.PR2ArmJointTrajectory,
00144 controller_name="%s_arm_controller",
00145 timeout=0)
00146
00147 self.epc = eptc.EPC('linear_move')
00148 self.time_step = 1/20.
00149
00150
00151 def marker_lookup_cb(self,msg):
00152 self.tool = msg.data[0]
00153 if self.tool == 'shaver' or self.tool == 'scratcher':
00154 rospy.logout('Receive request to find tag for '+self.tool)
00155 self.marker_frame = '/ar_'+self.tool
00156 self.arm = msg.data[1]
00157 self.search_tag = True
00158 else:
00159 print 'no valid marker found'
00160
00161
00162 def put_back_tool_cb(self,msg):
00163 duration=10.
00164 self.arm = msg.data
00165 self.switch_arm()
00166 self.arm_controller.wait_for_ep()
00167
00168 if self.grasp_object:
00169 rospy.logout("Putting back the object")
00170 ep_cur = self.arm_controller.get_ep()
00171 ep1 = copy.deepcopy(self.tool_ep)
00172 ep1[0][2] +=.2
00173 self.epc_move_arm(self.arm_controller, ep_cur, ep1, duration)
00174 self.epc_move_arm(self.arm_controller, ep1, self.tool_ep, duration)
00175 self.gripper.Open(self.arm)
00176 time.sleep(2.)
00177 self.epc_move_arm(self.arm_controller, self.tool_ep, ep1, duration)
00178 self.grasp_object = False
00179
00180
00181 def switch_arm(self):
00182 if self.arm == 'left_arm':
00183 side = 'l'
00184 self.arm_controller = self.l_arm_cart
00185 elif self.arm == 'right_arm':
00186 side = 'r'
00187 self.arm_controller = self.r_arm_cart
00188 with self.arm_controller.lock:
00189 self.arm_controller.ep = None
00190
00191 self.cs.carefree_switch(side, '%s_cart',
00192
00193 "$(find hrl_pr2_arms)/params/j_transpose_params_high.yaml")
00194
00195
00196 def get_angles(self):
00197 self.r_angle = self.r_arm.get_joint_angles()
00198 self.l_angle = self.l_arm.get_joint_angles()
00199
00200
00201 def epc_move_arm(self, arm, ep1, ep2, duration=10.):
00202 self.t_vals = eptc.min_jerk_traj(duration/self.time_step)
00203 traj = arm.interpolate_ep(ep1, ep2, self.t_vals)
00204 tc = eptc.EPTrajectoryControl(arm, traj)
00205 self.epc.epc_motion(tc, self.time_step)
00206
00207
00208 def setup_pr2_init_pose(self):
00209 rospy.logout('Initializing the Robot..'+self.tool)
00210 self.head.set_pose([0.15,0.,0.])
00211 self.torso.down()
00212 self.get_angles()
00213 duration=5.
00214 self.t_vals = eptc.min_jerk_traj(duration/self.time_step)
00215 self.r_ep =np.array([-1.397, 0.375, -1.740, -2.122, -1.966, -1.680, -2.491])
00216 self.l_ep =np.array([1.397, 0.375, 1.740, -2.122, 1.966, -1.680, -3.926])
00217
00218
00219
00220 self.cs.carefree_switch('r', '%s_arm_controller')
00221 self.cs.carefree_switch('l', '%s_arm_controller')
00222 self.r_arm.wait_for_ep()
00223 self.l_arm.wait_for_ep()
00224 self.epc_move_arm(self.r_arm, self.r_angle, self.r_ep, duration)
00225 self.epc_move_arm(self.l_arm, self.l_angle, self.l_ep, duration)
00226 self.pr2_init = True
00227
00228
00229 def detect_artag(self):
00230 try:
00231 rospy.logout("Finding the AR tag..")
00232 self.pub_rate.sleep()
00233 (self.ar_pos, rot) = self.tf_listener.lookupTransform("/torso_lift_link",
00234 self.marker_frame, rospy.Time(0))
00235 self.pub_rate.sleep()
00236 gripper_rot = hrl_tr.rotY(math.pi/2)
00237 self.ar_rot = hrl_tr.quaternion_to_matrix(rot)*gripper_rot
00238
00239 rospy.logout("Found AR tag!\nPosition: "+pplist(self.ar_pos)+"\nQuaterion: "+pplist(rot))
00240 self.ar_ep = []
00241 self.ar_ep.append(np.matrix(self.ar_pos).T)
00242 self.ar_ep.append(self.ar_rot)
00243 self.found_tag = True
00244 except:
00245 rospy.logout('AARtagDetect: Transform failed for '+self.tool)
00246 return False
00247
00248
00249 def fetch_tool(self, duration=5.):
00250 rospy.logout("Moving the "+self.arm+" to fetch the object")
00251 self.switch_arm()
00252 self.arm_controller.wait_for_ep()
00253 ep_cur = self.arm_controller.get_ep()
00254 ep1 = copy.deepcopy(self.ar_ep)
00255 ep1[0][2]=ep_cur[0][2]+.1
00256
00257 self.epc_move_arm(self.arm_controller, ep_cur, ep1, 10)
00258 self.gripper.Open(self.arm)
00259 time.sleep(2.)
00260
00261 self.tool_ep = copy.deepcopy(self.ar_ep)
00262
00263
00264
00265
00266 self.tool_ep[0][0]-= .02
00267
00268 self.tool_ep[0][2]+= .025
00269
00270
00271 self.epc_move_arm(self.arm_controller, ep1, self.tool_ep, 15)
00272 self.gripper.Close(self.arm)
00273 time.sleep(2.)
00274 self.epc_move_arm(self.arm_controller, self.tool_ep, ep1, 15)
00275
00276 self.found_tag = False
00277 self.search_tag = False
00278 self.pr2_init = False
00279 self.grasp_object = True
00280
00281
00282 def pplist(list):
00283 return ' '.join(['%2.3f'%x for x in list])
00284
00285
00286 if __name__ == "__main__":
00287 arm = ar_manipulation()
00288
00289 while not rospy.is_shutdown():
00290 if arm.search_tag:
00291 if not arm.pr2_init:
00292 arm.setup_pr2_init_pose()
00293 arm.detect_artag()
00294 if arm.found_tag:
00295 arm.fetch_tool()
00296
00297
00298
00299