hrl_pr2.py
Go to the documentation of this file.
00001 
00002 import numpy as np, math
00003 from threading import RLock
00004 
00005 import roslib; roslib.load_manifest('hrl_pr2_kinematics_tutorials')
00006 import rospy
00007 
00008 import actionlib
00009 
00010 from kinematics_msgs.srv import GetPositionFK, GetPositionFKRequest, GetPositionFKResponse
00011 from kinematics_msgs.srv import GetPositionIK, GetPositionIKRequest, GetPositionIKResponse
00012 from pr2_controllers_msgs.msg import JointTrajectoryAction, JointTrajectoryGoal, JointTrajectoryControllerState
00013 from pr2_controllers_msgs.msg import Pr2GripperCommandGoal, Pr2GripperCommandAction, Pr2GripperCommand
00014 from trajectory_msgs.msg import JointTrajectoryPoint
00015 from geometry_msgs.msg import PoseStamped
00016 
00017 from std_msgs.msg import Float64
00018 from sensor_msgs.msg import JointState
00019 
00020 import hrl_lib.transforms as tr
00021 import time
00022 
00023 class HRL_PR2():
00024     def __init__(self):
00025         self.joint_names_list = ['r_shoulder_pan_joint',
00026                            'r_shoulder_lift_joint', 'r_upper_arm_roll_joint',
00027                            'r_elbow_flex_joint', 'r_forearm_roll_joint',
00028                            'r_wrist_flex_joint', 'r_wrist_roll_joint']
00029 
00030         rospy.wait_for_service('pr2_right_arm_kinematics/get_fk');
00031         rospy.wait_for_service('pr2_right_arm_kinematics/get_ik');
00032 
00033         self.fk_srv = rospy.ServiceProxy('pr2_right_arm_kinematics/get_fk', GetPositionFK)
00034         self.ik_srv = rospy.ServiceProxy('pr2_right_arm_kinematics/get_ik', GetPositionIK)
00035 
00036         self.joint_action_client = actionlib.SimpleActionClient('r_arm_controller/joint_trajectory_action', JointTrajectoryAction)
00037         self.gripper_action_client = actionlib.SimpleActionClient('r_gripper_controller/gripper_action', Pr2GripperCommandAction)
00038         self.joint_action_client.wait_for_server()
00039         self.gripper_action_client.wait_for_server()
00040 
00041         self.arm_state_lock = RLock()
00042         #rospy.Subscriber('/r_arm_controller/state', JointTrajectoryControllerState, self.r_arm_state_cb)
00043         rospy.Subscriber('/joint_states', JointState, self.joint_states_cb)
00044         self.r_arm_cart_pub = rospy.Publisher('/r_cart/command_pose', PoseStamped)
00045 
00046         self.r_arm_pub_l = []
00047         self.joint_nm_list = ['shoulder_pan', 'shoulder_lift', 'upper_arm_roll',
00048                               'elbow_flex', 'forearm_roll', 'wrist_flex',
00049                               'wrist_roll']
00050 
00051         self.r_arm_angles = None
00052         self.r_arm_efforts = None
00053 
00054         for nm in self.joint_nm_list:
00055             self.r_arm_pub_l.append(rospy.Publisher('r_'+nm+'_controller/command', Float64))
00056 
00057         rospy.sleep(1.)
00058 
00059     def joint_states_cb(self, data):
00060         r_arm_angles = []
00061         r_arm_efforts = []
00062         r_jt_idx_list = [17, 18, 16, 20, 19, 21, 22]
00063         for i,nm in enumerate(self.joint_nm_list):
00064             idx = r_jt_idx_list[i]
00065             if data.name[idx] != 'r_'+nm+'_joint':
00066                 raise RuntimeError('joint angle name does not match. Expected: %s, Actual: %s i: %d'%('r_'+nm+'_joint', data.name[idx], i))
00067             r_arm_angles.append(data.position[idx])
00068             r_arm_efforts.append(data.effort[idx])
00069 
00070         self.arm_state_lock.acquire()
00071         self.r_arm_angles = r_arm_angles
00072         self.r_arm_efforts = r_arm_efforts
00073         self.arm_state_lock.release()
00074 
00075     ## go to a joint configuration.
00076     # @param q - list of 7 joint angles in RADIANS.
00077     # @param duration - how long (SECONDS) before reaching the joint angles.
00078     def set_jointangles(self, arm, q, duration=0.15):
00079         rospy.logwarn('Currently ignoring the arm parameter.')
00080 #        for i,p in enumerate(self.r_arm_pub_l):
00081 #            p.publish(q[i])
00082         jtg = JointTrajectoryGoal()
00083         jtg.trajectory.joint_names = self.joint_names_list
00084         jtp = JointTrajectoryPoint()
00085         jtp.positions = q
00086         jtp.velocities = [0 for i in range(len(q))]
00087         jtp.accelerations = [0 for i in range(len(q))]
00088         jtp.time_from_start = rospy.Duration(duration)
00089         jtg.trajectory.points.append(jtp)
00090         self.joint_action_client.send_goal(jtg)
00091 
00092     def FK(self, arm, q):
00093         rospy.logwarn('Currently ignoring the arm parameter.')
00094         fk_req = GetPositionFKRequest()
00095         fk_req.header.frame_id = 'torso_lift_link'
00096         fk_req.fk_link_names.append('r_wrist_roll_link')
00097         fk_req.robot_state.joint_state.name = self.joint_names_list
00098         fk_req.robot_state.joint_state.position = q
00099 
00100         fk_resp = GetPositionFKResponse()
00101         fk_resp = self.fk_srv.call(fk_req)
00102         if fk_resp.error_code.val == fk_resp.error_code.SUCCESS:
00103             x = fk_resp.pose_stamped[0].pose.position.x
00104             y = fk_resp.pose_stamped[0].pose.position.y
00105             z = fk_resp.pose_stamped[0].pose.position.z
00106             ret = np.matrix([x,y,z]).T
00107         else:
00108             rospy.logerr('Forward kinematics failed')
00109             ret = None
00110 
00111         return ret
00112     
00113     def IK(self, arm, p, rot, q_guess):
00114         rospy.logwarn('Currently ignoring the arm parameter.')
00115         ik_req = GetPositionIKRequest()
00116         ik_req.timeout = rospy.Duration(5.)
00117         ik_req.ik_request.ik_link_name = 'r_wrist_roll_link'
00118         ik_req.ik_request.pose_stamped.header.frame_id = 'torso_lift_link'
00119 
00120         ik_req.ik_request.pose_stamped.pose.position.x = p[0,0]
00121         ik_req.ik_request.pose_stamped.pose.position.y = p[1,0]
00122         ik_req.ik_request.pose_stamped.pose.position.z = p[2,0]
00123 
00124         quat = tr.matrix_to_quaternion(rot)
00125         ik_req.ik_request.pose_stamped.pose.orientation.x = quat[0]
00126         ik_req.ik_request.pose_stamped.pose.orientation.y = quat[1]
00127         ik_req.ik_request.pose_stamped.pose.orientation.z = quat[2]
00128         ik_req.ik_request.pose_stamped.pose.orientation.w = quat[3]
00129 
00130         ik_req.ik_request.ik_seed_state.joint_state.position = q_guess
00131         ik_req.ik_request.ik_seed_state.joint_state.name = self.joint_names_list
00132 
00133         ik_resp = self.ik_srv.call(ik_req)
00134         if ik_resp.error_code.val == ik_resp.error_code.SUCCESS:
00135             ret = ik_resp.solution.joint_state.position
00136         else:
00137             rospy.logerr('Inverse kinematics failed')
00138             ret = None
00139 
00140         return ret
00141 
00142     # for compatibility with Meka arms on Cody. Need to figure out a
00143     # good way to have a common interface to different arms.
00144     def step(self):
00145         return
00146     
00147     def end_effector_pos(self, arm):
00148         q = self.get_joint_angles(arm)
00149         return self.FK(arm, q)
00150 
00151     def get_joint_angles(self, arm):
00152         rospy.logwarn('Currently ignoring the arm parameter.')
00153         self.arm_state_lock.acquire()
00154         q = self.r_arm_angles
00155         self.arm_state_lock.release()
00156         return q
00157 
00158     # need for search and hook
00159     def go_cartesian(self, arm):
00160         rospy.logerr('Need to implement this function.')
00161         raise RuntimeError('Unimplemented function')
00162 
00163     def get_wrist_force(self, arm, bias = True, base_frame = False):
00164         rospy.logerr('Need to implement this function.')
00165         raise RuntimeError('Unimplemented function')
00166 
00167     def set_cartesian(self, arm, p, rot):
00168         rospy.logwarn('Currently ignoring the arm parameter.')
00169         ps = PoseStamped()
00170         ps.header.stamp = rospy.rostime.get_rostime()
00171         ps.header.frame_id = 'torso_lift_link'
00172 
00173         ps.pose.position.x = p[0,0]
00174         ps.pose.position.y = p[1,0]
00175         ps.pose.position.z = p[2,0]
00176 
00177         quat = tr.matrix_to_quaternion(rot)
00178         ps.pose.orientation.x = quat[0]
00179         ps.pose.orientation.y = quat[1]
00180         ps.pose.orientation.z = quat[2]
00181         ps.pose.orientation.w = quat[3]
00182         self.r_arm_cart_pub.publish(ps)
00183 
00184     def open_gripper(self, arm):
00185         self.gripper_action_client.send_goal(Pr2GripperCommandGoal(Pr2GripperCommand(position=0.08, max_effort = -1)))
00186 
00187     ## close the gripper
00188     # @param effort - supposed to be in Newtons. (-ve number => max effort)
00189     def close_gripper(self, arm, effort = 15):
00190         self.gripper_action_client.send_goal(Pr2GripperCommandGoal(Pr2GripperCommand(position=0.0, max_effort = effort)))
00191 
00192     def get_wrist_force(self, arm):
00193         pass
00194 
00195 
00196 if __name__ == '__main__':
00197     rospy.init_node('hrl_pr2', anonymous = True)
00198     rospy.logout('hrl_pr2: ready')
00199 
00200     hrl_pr2 = HRL_PR2()
00201 
00202     if False:
00203         q = [0, 0, 0, 0, 0, 0, 0]
00204         hrl_pr2.set_jointangles('right_arm', q)
00205         ee_pos = hrl_pr2.FK('right_arm', q)
00206         print 'FK result:', ee_pos.A1
00207 
00208         ee_pos[0,0] -= 0.1
00209         q_ik = hrl_pr2.IK('right_arm', ee_pos, tr.Rx(0.), q)
00210         print 'q_ik:', [math.degrees(a) for a in q_ik]
00211 
00212         rospy.spin()
00213 
00214     if False:
00215         p = np.matrix([0.9, -0.3, -0.15]).T
00216         #rot = tr.Rx(0.)
00217         rot = tr.Rx(math.radians(90.))
00218         hrl_pr2.set_cartesian('right_arm', p, rot)
00219 
00220     hrl_pr2.open_gripper('right_arm')
00221     raw_input('Hit ENTER to close')
00222     hrl_pr2.close_gripper('right_arm', effort = 15)
00223 
00224 
00225 


hrl_pr2_kinematics_tutorials
Author(s): Advait Jain (Healthcare Robotics Lab)
autogenerated on Wed Nov 27 2013 12:09:35