ar_manipulation.py
Go to the documentation of this file.
00001 #!/usr/bin/python
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         #       rospy.init_node('move_the_head', anonymous=True)
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         #               self.pos.position = 0.01
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 #               rospy.Subscriber("/ar_pose_markers", ARMarkers, self.read_markers_cb)
00119 #               rospy.Subscriber("/ar_object_name", String, self.marker_lookup_cb)
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 #               Load JTcontroller
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         #               Load Joint space controller
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                 #                       "$(find hrl_pr2_arms)/params/j_transpose_params_low.yaml")
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 #               self.r_ep =np.array([-1.397, 0.375, -1.740, -2.122, -1.966, -1.680, .651])
00218 #               self.l_ep =np.array([1.397, 0.375, 1.740, -2.122, 1.966, -1.680, -.784])
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)        #gripper facing -z direction
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 #                self.tool_ep[1] = np.mat(tf_trans.euler_matrix(0, np.pi/2, 0))[:3,:3]
00263 
00264         # Kinect on Monty has not been calibrated!
00265         #Offset due to Kinect error
00266         self.tool_ep[0][0]-= .02
00267 #               self.tool_ep[0][1]+= .02
00268         self.tool_ep[0][2]+= .025
00269 #               self.tool_ep[0][2]-= .05
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 #       arm.get_angles()
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 


ar_manipulation
Author(s): Aaron King
autogenerated on Wed Nov 27 2013 12:23:24