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 import random 00039 00040 import actionlib 00041 from actionlib.msg import TestAction, TestGoal 00042 from actionlib_msgs.msg import GoalStatus 00043 import rospy 00044 00045 00046 class DeadlockCompanion: 00047 00048 def __init__(self): 00049 # Seed random with fully resolved name of node and current time 00050 random.seed(rospy.get_name() + str(rospy.Time.now().to_sec())) 00051 00052 # Create actionlib client 00053 self.action_client = actionlib.SimpleActionClient( 00054 Constants.topic, 00055 TestAction) 00056 00057 def run(self): 00058 while not rospy.is_shutdown(): 00059 # Send dummy goal 00060 self.action_client.send_goal(TestGoal()) 00061 00062 # Wait for a random amount of time 00063 action_duration = random.uniform(0, Constants.max_action_duration) 00064 self.action_client.wait_for_result(rospy.Duration(action_duration)) 00065 00066 state = self.action_client.get_state() 00067 if state == GoalStatus.ACTIVE or state == GoalStatus.PENDING: 00068 self.action_client.cancel_goal() 00069 00070 00071 if __name__ == '__main__': 00072 rospy.init_node(Constants.node) 00073 try: 00074 companion = DeadlockCompanion() 00075 companion.run() 00076 except (KeyboardInterrupt, SystemExit): 00077 raise 00078 except: 00079 pass