00001 #! /usr/bin/env python 00002 # 00003 # Copyright (c) 2013, Miguel Sarabia 00004 # Imperial College London 00005 # All rights reserved. 00006 # 00007 # Redistribution and use in source and binary forms, with or without 00008 # modification, are permitted provided that the following conditions are met: 00009 # 00010 # * Redistributions of source code must retain the above copyright 00011 # notice, this list of conditions and the following disclaimer. 00012 # * Redistributions in binary form must reproduce the above copyright 00013 # notice, this list of conditions and the following disclaimer in the 00014 # documentation and/or other materials provided with the distribution. 00015 # * Neither the name of Imperial College London nor the names of its 00016 # contributors may be used to endorse or promote products derived from 00017 # this software without specific prior written permission. 00018 # 00019 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00020 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00021 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00022 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00023 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00024 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00025 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00026 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00027 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00028 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00029 # POSSIBILITY OF SUCH DAMAGE. 00030 # 00031 00032 00033 class Constants: 00034 node = "simple_action_server_deadlock_companion" 00035 topic = "deadlock" 00036 max_action_duration = 3 00037 00038 00039 import random 00040 00041 import actionlib 00042 from actionlib.msg import TestAction, TestGoal 00043 from actionlib_msgs.msg import GoalStatus 00044 import rospy 00045 00046 00047 class DeadlockCompanion: 00048 00049 def __init__(self): 00050 # Seed random with fully resolved name of node and current time 00051 random.seed(rospy.get_name() + str(rospy.Time.now().to_sec())) 00052 00053 # Create actionlib client 00054 self.action_client = actionlib.SimpleActionClient( 00055 Constants.topic, 00056 TestAction) 00057 00058 def run(self): 00059 while not rospy.is_shutdown(): 00060 # Send dummy goal 00061 self.action_client.send_goal(TestGoal()) 00062 00063 # Wait for a random amount of time 00064 action_duration = random.uniform(0, Constants.max_action_duration) 00065 self.action_client.wait_for_result(rospy.Duration(action_duration)) 00066 00067 state = self.action_client.get_state() 00068 if state == GoalStatus.ACTIVE or state == GoalStatus.PENDING: 00069 self.action_client.cancel_goal() 00070 00071 00072 if __name__ == '__main__': 00073 rospy.init_node(Constants.node) 00074 try: 00075 companion = DeadlockCompanion() 00076 companion.run() 00077 except (KeyboardInterrupt, SystemExit): 00078 raise 00079 except: 00080 pass