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
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
00076
00077
00078 def set_jointangles(self, arm, q, duration=0.15):
00079 rospy.logwarn('Currently ignoring the arm parameter.')
00080
00081
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
00143
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
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
00188
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
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