1
2 import roslib; roslib.load_manifest('smach_ros')
3 import rospy
4
5 import threading
6 import traceback
7
8 import smach
9
10 __all__ = ['ConditionState']
11
13 """A state that will check a condition function a number of times.
14
15 If max_checks > 1, it will block while the condition is false and once it
16 has checked max_checks times, it will return false.
17 """
18 - def __init__(self,
19 cond_cb,
20 input_keys = [],
21 poll_rate = rospy.Duration(0.05),
22 timeout = None,
23 max_checks = 1):
24 smach.State.__init__(self,outcomes = ['true', 'false','preempted'], input_keys = input_keys)
25
26 self._cond_cb = cond_cb
27 if hasattr(cond_cb,'get_registered_input_keys') and hasattr(cond_cb,'get_registered_output_keys'):
28 self._cond_cb_input_keys = cond_cb.get_registered_input_keys()
29 self._cond_cb_output_keys = cond_cb.get_registered_output_keys()
30 self.register_input_keys(self._cond_cb_input_keys)
31 self.register_output_keys(self._cond_cb_output_keys)
32 self._poll_rate = poll_rate
33 self._timeout = timeout
34 self._max_checks = max_checks
35
37 start_time = rospy.Time.now()
38 n_checks = 0
39
40 while self._max_checks == -1 or n_checks <= self._max_checks:
41
42 if self._timeout and rospy.Time.now() - start_time > self._timeout:
43 break
44
45 if self.preempt_requested():
46 self.service_preempt()
47 return 'preempted'
48
49 try:
50 if self._cond_cb(ud):
51 return 'true'
52 except:
53 raise smach.InvalidUserCodeError("Error thrown while executing condition callback %s: " % str(self._cond_cb) +traceback.format_exc())
54 n_checks += 1
55 rospy.sleep(self._poll_rate)
56
57 return 'false'
58