Go to the documentation of this file.00001
00002
00003 import roslib; roslib.load_manifest('fake_action_clients')
00004 import rospy
00005 import smach
00006 import smach_ros
00007 import iri_door_detector.msg
00008 from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
00009 from arm_navigation_msgs.msg import *
00010 from smach_ros import SimpleActionState
00011
00012 def main():
00013 rospy.init_node('smach_example_state_machine')
00014
00015 sm = smach.StateMachine(outcomes=['succeeded','aborted','preempted'])
00016 with sm:
00017
00018
00019
00020 def find_a_door_goal_cb(userdata, goal):
00021 find_a_door_goal = iri_door_detector.msg.FindADoorGoal()
00022 find_a_door_goal.start = 1
00023 return find_a_door_goal
00024
00025 @smach.cb_interface(
00026 outcomes=['succeeded_closed','succeeded_open','aborted','preempted'])
00027
00028 def find_a_door_base_result_cb(userdata, status, result):
00029
00030 rospy.loginfo("status code %d" % status)
00031 rospy.loginfo("\n door state: %s" % result.state + "\n base poses: \n %s" % result.base_poses)
00032 if status == 3 and result.state == "fully_open":
00033 return 'succeeded_open'
00034 elif status == 3 and result.state == "open_left":
00035 return 'succeeded_open'
00036 elif status == 3 and result.state == "open_right":
00037 return 'succeeded_open'
00038 elif status == 3 and result.state == "closed_right":
00039 return 'succeeded_closed'
00040 elif status == 3 and result.state == "closed_left":
00041 return 'succeeded_closed'
00042 else:
00043 return 'aborted'
00044
00045
00046
00047
00048
00049 smach.StateMachine.add('FIND_A_DOOR_BASE',
00050 SimpleActionState('/iri_door_detector/door_detector_actions/find_a_door',
00051 iri_door_detector.msg.FindADoorAction,
00052 goal_cb=find_a_door_goal_cb,
00053 result_slots=['base_poses',
00054 'state']),
00055 transitions={'succeeded':'BASE_POSES',
00056 'aborted':'FIND_A_DOOR_BASE'},
00057 remapping={'base_poses':'user_data_base_poses',
00058 'state':'user_data_state'})
00059
00060
00061 smach.StateMachine.add('BASE_POSES',
00062 SimpleActionState('/iri_door_detector/door_detector_actions/find_a_door',
00063 iri_door_detector.msg.FindADoorAction,
00064 result_cb=find_a_door_base_result_cb),
00065 transitions={'succeeded_open':'MOVE_BASE_OPEN',
00066 'succeeded_closed':'FIND_A_DOOR_BASE',
00067 'aborted':'FIND_A_DOOR_BASE'})
00068
00069
00070 smach.StateMachine.add('MOVE_BASE_OPEN',
00071 SimpleActionState('move_base',
00072 MoveBaseAction,
00073 goal_slots=['target_pose']),
00074 transitions={'succeeded':'succeeded',
00075 'aborted':'FIND_A_DOOR_BASE'},
00076 remapping={'target_pose':'user_data_base_poses'})
00077
00078
00079
00080 outcome = sm.execute()
00081
00082 if __name__ == '__main__':
00083 main()