00001
00002
00003 import roslib
00004 roslib.load_manifest('pr2_plugs_actions')
00005
00006 import rospy
00007
00008 import os,sys,time
00009 from math import *
00010 import copy
00011 import tf
00012 import PyKDL
00013
00014 from std_srvs.srv import *
00015
00016 from actionlib_msgs.msg import *
00017 from pr2_plugs_msgs.msg import *
00018 from pr2_common_action_msgs.msg import *
00019 from pr2_controllers_msgs.msg import *
00020 from trajectory_msgs.msg import *
00021
00022 from pr2_arm_move_ik.tools import *
00023 from tf_conversions.posemath import fromMsg, toMsg
00024 from geometry_msgs.msg import *
00025 from joint_trajectory_action_tools.tools import get_action_goal as get_generator_goal
00026
00027
00028 from pr2_plugs_actions.tf_util import TFUtil
00029 import smach
00030 from smach import *
00031 from smach_ros import *
00032
00033 import actionlib
00034
00035 __all__ = ['construct_sm']
00036
00037
00038 def construct_sm():
00039 TFUtil()
00040
00041
00042
00043 open_gripper_goal = Pr2GripperCommandGoal()
00044 open_gripper_goal.command.position = 0.07
00045 open_gripper_goal.command.max_effort = 99999
00046
00047
00048 close_gripper_goal = Pr2GripperCommandGoal()
00049 close_gripper_goal.command.position = 0.0
00050 close_gripper_goal.command.max_effort = 99999
00051
00052
00053 sm = StateMachine(
00054 ['succeeded','aborted','preempted'],
00055 output_keys = ['plug_on_base_pose', 'gripper_plug_grasp_pose'])
00056
00057
00058 sm.userdata.gripper_plug_grasp_pose_approach = toMsg(PyKDL.Frame(PyKDL.Vector(0, 0.05, 0)).Inverse())
00059 sm.userdata.gripper_plug_grasp_pose = toMsg(PyKDL.Frame(PyKDL.Rotation.RPY(pi/2, 0.0, -pi/9), PyKDL.Vector(-0.03, 0.0, 0.005)).Inverse())
00060
00061
00062 with sm:
00063 StateMachine.add('RAISE_SPINE',
00064 SimpleActionState('torso_controller/position_joint_action',
00065 SingleJointPositionAction,
00066 goal = SingleJointPositionGoal(position=0.16)),
00067 {'succeeded':'MOVE_ARM_BASE_DETECT_POSE'})
00068
00069
00070 StateMachine.add('MOVE_ARM_BASE_DETECT_POSE',
00071 SimpleActionState('r_arm_controller/joint_trajectory_generator',
00072 JointTrajectoryAction, goal = get_generator_goal('pr2_plugs_configuration/detect_plug_on_base')),
00073 {'succeeded':'DETECT_PLUG_ON_BASE'})
00074
00075
00076 @smach.cb_interface(output_keys=['plug_on_base_pose'])
00077 def store_detect_plug_result(ud, result_state, result):
00078 if result_state == actionlib.GoalStatus.SUCCEEDED:
00079 ud.plug_on_base_pose = TFUtil.wait_and_transform('base_link', result.plug_pose).pose
00080
00081 StateMachine.add('DETECT_PLUG_ON_BASE',
00082 SimpleActionState('detect_plug_on_base',DetectPlugOnBaseAction,
00083 goal = DetectPlugOnBaseGoal(),
00084 result_cb = store_detect_plug_result),
00085 {'succeeded':'MOVE_ARM_BASE_GRASP_POSE',
00086 'aborted':'MOVE_ARM_BASE_DETECT_POSE'})
00087
00088
00089 StateMachine.add('MOVE_ARM_BASE_GRASP_POSE',
00090 SimpleActionState('r_arm_controller/joint_trajectory_generator',JointTrajectoryAction, goal = get_generator_goal('pr2_plugs_configuration/grasp_plug')),
00091 {'succeeded':'OPEN_GRIPPER',
00092 'aborted':'RECOVER_GRASP_TO_DETECT_POSE'})
00093
00094 StateMachine.add('OPEN_GRIPPER',
00095 SimpleActionState('r_gripper_controller/gripper_action',
00096 Pr2GripperCommandAction,
00097 goal = open_gripper_goal),
00098 {'succeeded':'APPROACH_PLUG'})
00099
00100 @smach.cb_interface(input_keys = ['plug_on_base_pose',
00101 'gripper_plug_grasp_pose_approach',
00102 'gripper_plug_grasp_pose'])
00103 def get_approach_plug_goal(ud, goal):
00104 """Get the ik goal for approaching the plug to grasp it """
00105 pose_gripper_wrist = fromMsg(TFUtil.wait_and_lookup('r_gripper_tool_frame', 'r_wrist_roll_link').pose)
00106 goal = ArmMoveIKGoal()
00107 goal.pose.pose = toMsg(fromMsg(ud.plug_on_base_pose)
00108 * fromMsg(ud.gripper_plug_grasp_pose_approach).Inverse()
00109 * fromMsg(ud.gripper_plug_grasp_pose).Inverse()
00110 * pose_gripper_wrist)
00111
00112 goal.pose.header.stamp = rospy.Time.now()
00113 goal.pose.header.frame_id = 'base_link'
00114 goal.ik_seed = get_action_seed('pr2_plugs_configuration/grasp_plug_seed')
00115 goal.move_duration = rospy.Duration(3.0)
00116
00117 return goal
00118
00119 StateMachine.add('APPROACH_PLUG',
00120 SimpleActionState('r_arm_ik', ArmMoveIKAction, goal_cb = get_approach_plug_goal),
00121 {'succeeded':'GRASP_PLUG',
00122 'aborted':'DETECT_PLUG_ON_BASE'})
00123
00124 @smach.cb_interface(input_keys = ['plug_on_base_pose', 'gripper_plug_grasp_pose'])
00125 def get_grasp_plug_goal(ud, goal):
00126 """Get the ik goal for grasping the plug."""
00127 pose_gripper_wrist = fromMsg(TFUtil.wait_and_lookup('r_gripper_tool_frame', 'r_wrist_roll_link').pose)
00128
00129 goal = ArmMoveIKGoal()
00130 goal.pose.pose = toMsg(fromMsg(ud.plug_on_base_pose)
00131 * fromMsg(ud.gripper_plug_grasp_pose).Inverse()
00132 * pose_gripper_wrist)
00133
00134 goal.pose.header.stamp = rospy.Time.now()
00135 goal.pose.header.frame_id = 'base_link'
00136 goal.ik_seed = get_action_seed('pr2_plugs_configuration/grasp_plug_seed')
00137 goal.move_duration = rospy.Duration(3.0)
00138
00139 return goal
00140
00141 StateMachine.add('GRASP_PLUG',
00142 SimpleActionState('r_arm_ik', ArmMoveIKAction, goal_cb = get_grasp_plug_goal),
00143 {'succeeded':'CLOSE_GRIPPER',
00144 'aborted':'DETECT_PLUG_ON_BASE'})
00145
00146 StateMachine.add('CLOSE_GRIPPER',
00147 SimpleActionState('r_gripper_controller/gripper_action',
00148 Pr2GripperCommandAction,
00149 goal = close_gripper_goal),
00150 { 'succeeded':'DETECT_PLUG_ON_BASE',
00151 'aborted':'REMOVE_PLUG'})
00152
00153 StateMachine.add('REMOVE_PLUG',
00154 SimpleActionState('r_arm_controller/joint_trajectory_generator',JointTrajectoryAction, goal = get_generator_goal('pr2_plugs_configuration/remove_plug')),
00155 {'succeeded':'LOWER_SPINE'})
00156
00157 StateMachine.add('LOWER_SPINE',
00158 SimpleActionState('torso_controller/position_joint_action',
00159 SingleJointPositionAction,
00160 goal = SingleJointPositionGoal(position=0.01)),
00161 {'succeeded':'succeeded'})
00162
00163
00164 StateMachine.add('RECOVER_GRASP_TO_DETECT_POSE',
00165 SimpleActionState('r_arm_controller/joint_trajectory_generator',JointTrajectoryAction, goal = get_generator_goal('pr2_plugs_configuration/recover_grasp_to_detect')),
00166 { 'succeeded':'DETECT_PLUG_ON_BASE',
00167 'aborted':'RECOVER_GRASP_TO_DETECT_POSE'})
00168 return sm
00169
00170 if __name__ == "__main__":
00171 rospy.init_node("fetch_plug")
00172 TFUtil()
00173
00174 sm_fetch_plug = construct_sm()
00175
00176
00177 intro_server = IntrospectionServer('fetch_plug',sm_fetch_plug,'/RECHARGE/FETCH_PLUG')
00178 intro_server.start()
00179
00180
00181 asw = ActionServerWrapper(
00182 'fetch_plug', FetchPlugAction, sm_fetch_plug,
00183 succeeded_outcomes = ['succeeded'],
00184 aborted_outcomes = ['aborted'],
00185 preempted_outcomes = ['preempted'],
00186 pack_result_slots = True)
00187 asw.run_server()
00188
00189 rospy.spin()
00190
00191 intro_server.stop()