20 from enum
import IntEnum
23 from std_msgs.msg
import Empty
24 from sensor_msgs.msg
import JointState
25 from diagnostic_msgs.msg
import DiagnosticStatus, DiagnosticArray
28 from cob_light.msg
import LightMode, LightModes, SetLightModeGoal, SetLightModeAction
29 from cob_light.srv
import StopLightMode, StopLightModeRequest
31 from simple_script_server
import *
55 if not rospy.has_param(
"~light_components"):
56 rospy.logwarn(
"parameter light_components does not exist on ROS Parameter Server, aborting...")
62 self.
color_warn = rospy.get_param(
"~color_warn",
"yellow")
63 self.
color_ok = rospy.get_param(
"~color_ok",
"green")
64 self.
color_off = rospy.get_param(
"~color_off",
"black")
67 if not rospy.has_param(
"~sound_components"):
68 rospy.logwarn(
"parameter sound_components does not exist on ROS Parameter Server, aborting...")
90 rospy.Subscriber(
"/diagnostics_toplevel_state", DiagnosticStatus, self.
diagnostics_callback, queue_size=1)
106 diagnostics_errors = []
107 diagnostics_errors_detail = []
110 for status
in msg.status:
111 if "Safety" in status.name:
112 if status.level > DiagnosticStatus.WARN:
113 diagnostics_errors.append(status)
116 for i, status
in enumerate(diagnostics_errors):
117 tmp = diagnostics_errors[:i]+diagnostics_errors[i+1:]
118 if not next((
True for status2
in tmp
if status2.name.startswith(status.name)),
False):
119 diagnostics_errors_detail.append(status)
121 if not diagnostics_errors_detail:
124 if self.
em_state == EMState.EM_BUTTON:
127 elif self.
em_state == EMState.EM_BRAKE:
130 elif self.
em_state == EMState.EM_LASER:
133 elif self.
em_state == EMState.EM_WIRELESS:
136 elif self.
em_state == EMState.EM_FALL:
139 elif self.
em_state == EMState.EM_INTERNAL:
146 em_state = EMState.EM_UNKNOWN
147 for status
in diagnostics_errors_detail:
148 if "Safety" in status.name:
149 for value
in status.values:
150 if (value.key ==
"button_stop_ok"):
151 if (value.value ==
"False"):
152 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_BUTTON:
154 em_state = EMState.EM_BUTTON
155 if (value.key ==
"brake_stop_ok"):
156 if (value.value ==
"False"):
157 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_BRAKE:
159 em_state = EMState.EM_BRAKE
160 if (value.key ==
"laser_stop_ok"):
161 if (value.value ==
"False"):
162 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_LASER:
164 em_state = EMState.EM_LASER
165 if (value.key ==
"wireless_stop_ok"):
166 if (value.value ==
"False"):
167 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_WIRELESS:
169 em_state = EMState.EM_WIRELESS
170 if (value.key ==
"fall_sensor_front_ok"):
171 if (value.value ==
"False"):
172 if em_state <= EMState.EM_FREE
or self.
em_state > EMState.EM_FALL:
174 em_state = EMState.EM_FALL
175 if (value.key ==
"fall_sensor_left_ok"):
176 if (value.value ==
"False"):
177 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_FALL:
179 em_state = EMState.EM_FALL
180 if (value.key ==
"fall_sensor_right_ok"):
181 if (value.value ==
"False"):
182 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_FALL:
184 em_state = EMState.EM_FALL
185 if (value.key ==
"fall_sensors_released"):
186 if (value.value ==
"False"):
187 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_FALL:
189 em_state = EMState.EM_FALL
190 if (value.key ==
"efi_bus_front_io_error"):
191 if (value.value ==
"True"):
192 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_INTERNAL:
194 em_state = EMState.EM_INTERNAL
195 if (value.key ==
"efi_bus_left_io_error"):
196 if (value.value ==
"True"):
197 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_INTERNAL:
199 em_state = EMState.EM_INTERNAL
200 if (value.key ==
"efi_bus_right_io_error"):
201 if (value.value ==
"True"):
202 if em_state <= EMState.EM_FREE
or em_state > EMState.EM_INTERNAL:
204 em_state = EMState.EM_INTERNAL
206 rospy.logdebug(
"self.em_state: %d, em_state: %d"%(self.
em_state, em_state))
207 if self.
em_state != em_state
and em_state > EMState.EM_FREE:
210 self.
say(sound_output)
212 rospy.logdebug(
"self.em_state: %d"%(self.
em_state))
222 rospy.loginfo(
"Diagnostics change to "+ str(self.
diag_status))
224 if msg.level == DiagnosticStatus.OK:
241 for v
in msg.velocity:
242 if abs(v) > threshold:
260 error_code, color_rgba = sss.compose_color(component, color)
262 action_server_name = component +
"/set_light" 265 rospy.logdebug(
"waiting for %s action server to start",action_server_name)
266 if not client.wait_for_server(rospy.Duration(5)):
268 rospy.logerr(
"%s action server not ready within timeout, aborting...", action_server_name)
270 rospy.logdebug(
"%s action server ready",action_server_name)
276 mode.colors.append(color_rgba)
278 mode.mode = LightModes.FLASH
281 mode.mode = LightModes.GLOW
282 mode.frequency = 10.0
284 goal = SetLightModeGoal()
286 client.send_goal(goal)
287 client.wait_for_result()
288 result = client.get_result()
296 srv_server_name = component +
"/stop_mode" 298 rospy.wait_for_service(srv_server_name, timeout=2)
299 srv_proxy = rospy.ServiceProxy(srv_server_name, StopLightMode)
300 req = StopLightModeRequest()
303 except Exception
as e:
304 rospy.logerr(
"%s service failed: %s",srv_server_name, e)
309 sss.say(component, [text])
311 if __name__ ==
"__main__":
312 rospy.init_node(
"emergency_stop_monitor")
def diagnostics_agg_callback(self, msg)
sound_em_internal_released
def diagnostics_callback(self, msg)
Diagnostics monitoring.
sound_em_wireless_released
def jointstate_callback(self, msg)
Motion Monitoring.
def set_light(self, color, flashing=False)
set light