1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 import errno
29
30 import rospy
31
32 from baxter_core_msgs.msg import (
33 RobustControllerStatus,
34 )
35
36
38 (STATE_IDLE,
39 STATE_STARTING,
40 STATE_RUNNING,
41 STATE_STOPPING) = range(4)
42
43 - def __init__(self, namespace, enable_msg, disable_msg, timeout=60):
44 """
45 Wrapper around controlling a RobustController
46
47 @param namespace: namespace containing the enable and status topics
48 @param enable_msg: message to send to enable the RC
49 @param disable_msg: message to send to disable the RC
50 @param timeout: seconds to wait for the RC to finish [60]
51 """
52 self._command_pub = rospy.Publisher(
53 namespace + '/enable',
54 type(enable_msg))
55 self._status_sub = rospy.Subscriber(
56 namespace + '/status',
57 RobustControllerStatus,
58 self._callback)
59
60 self._enable_msg = enable_msg
61 self._disable_msg = disable_msg
62 self._timeout = timeout
63 self._state = self.STATE_IDLE
64 self._return = 0
65
66 rospy.on_shutdown(self._on_shutdown)
67
69 if self._state == self.STATE_RUNNING:
70 if msg.complete == RobustControllerStatus.COMPLETE_W_SUCCESS:
71 self._state = self.STATE_STOPPING
72 self._return = 0
73
74 elif msg.complete == RobustControllerStatus.COMPLETE_W_FAILURE:
75 self._state = self.STATE_STOPPING
76 self._return = errno.EIO
77
78 elif not msg.isEnabled:
79 self._state = self.STATE_IDLE
80 self._return = errno.ENOMSG
81
82 elif self._state == self.STATE_STOPPING and not msg.isEnabled:
83
84
85 self._state = self.STATE_IDLE
86
87 elif self._state == self.STATE_STARTING and msg.isEnabled:
88 self._state = self.STATE_RUNNING
89
91
92
93 rate = rospy.Rate(2)
94 start = rospy.Time.now()
95
96 while not rospy.is_shutdown():
97 if (self._state == self.STATE_RUNNING and
98 (rospy.Time.now() - start).to_sec() > self._timeout):
99 self._state = self.STATE_STOPPING
100 self._command_pub.publish(self._disable_msg)
101 self._return = errno.ETIMEDOUT
102
103 elif self._state in (self.STATE_STARTING, self.STATE_RUNNING):
104 self._command_pub.publish(self._enable_msg)
105
106 elif self._state == self.STATE_STOPPING:
107 self._command_pub.publish(self._disable_msg)
108
109 elif self._state == self.STATE_IDLE:
110 break
111
112 rate.sleep()
113
115 rate = rospy.Rate(2)
116
117 while not self._state == self.STATE_IDLE:
118 self._command_pub.publish(self._disable_msg)
119 rate.sleep()
120
121 self._return = errno.ECONNABORTED
122
124 """
125 Enable the RobustController and run until completion or error.
126 """
127 self._state = self.STATE_STARTING
128 self._command_pub.publish(self._enable_msg)
129 self._run_loop()
130 if self._return != 0:
131 msgs = {
132 errno.EIO: "Robust controller failed",
133 errno.ENOMSG: "Robust controller failed to enable",
134 errno.ETIMEDOUT: "Robust controller timed out",
135 errno.ECONNABORTED: "Robust controller interrupted by user",
136 }
137
138 msg = msgs.get(self._return, None)
139 if msg:
140 raise IOError(self._return, msg)
141 raise IOError(self._return)
142