mock_sr_ur_robot_hw.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 #
3 # Copyright 2021 Shadow Robot Company Ltd.
4 #
5 # This program is free software: you can redistribute it and/or modify it
6 # under the terms of the GNU General Public License as published by the Free
7 # Software Foundation version 2 of the License.
8 #
9 # This program is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 # more details.
13 #
14 # You should have received a copy of the GNU General Public License along
15 # with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 import rospy
18 import actionlib
19 import actionlib_tutorials.msg
20 import control_msgs
21 from control_msgs.msg import FollowJointTrajectoryAction, FollowJointTrajectoryResult
22 from std_msgs.msg import Bool
23 from ur_dashboard_msgs.srv import (GetSafetyMode, GetSafetyModeResponse, GetProgramState,
24  GetRobotMode, Load, IsProgramRunning, GetProgramStateResponse,
25  GetRobotModeResponse, LoadResponse, IsProgramRunningResponse)
26 from ur_dashboard_msgs.msg import SafetyMode, ProgramState, RobotMode
27 from std_srvs.srv import Trigger, TriggerResponse
28 
29 
30 class IllegalArgumentError(ValueError):
31  pass
32 
33 
34 class ArmState(object):
35  def __init__(self, arm_prefix):
36  self._arm_prefix = arm_prefix
37  self._safety_mode_publisher = rospy.Publisher('/' + arm_prefix + '_sr_ur_robot_hw/safety_mode',
38  SafetyMode, queue_size=1)
39  self._robot_mode = GetRobotModeResponse()
40  self._safety_mode = GetSafetyModeResponse()
41  self._program_state = GetProgramStateResponse()
42  self._program_state.program_name = "<unnamed>"
43  self._program_state.success = True
44  self._reboot_required = False
45  self._e_stop_active = False
46  self._program_running = IsProgramRunningResponse()
47  self.power_off()
48 
49  def _publish_safety_mode(self, e_stop_pressed):
50  if e_stop_pressed:
51  self._safety_mode_publisher.publish(SafetyMode.ROBOT_EMERGENCY_STOP)
52  else:
53  self._safety_mode_publisher.publish(SafetyMode.NORMAL)
54 
55  def _set_safety_mode(self, mode):
56  self._safety_mode.success = True
57  if mode == "NORMAL":
58  self._safety_mode.safety_mode.mode = SafetyMode.NORMAL
59  self._safety_mode.answer = "Safetymode: NORMAL"
60  elif mode == "PROTECTIVE_STOP":
61  self._safety_mode.safety_mode.mode = SafetyMode.PROTECTIVE_STOP
62  self._safety_mode.answer = "Safetymode: PROTECTIVE_STOP"
63  elif mode == "ROBOT_EMERGENCY_STOP":
64  self._safety_mode.safety_mode.mode = SafetyMode.ROBOT_EMERGENCY_STOP
65  self._safety_mode.answer = "Safetymode: ROBOT_EMERGENCY_STOP"
66  elif mode == "FAULT":
67  self._safety_mode.safety_mode.mode = SafetyMode.FAULT
68  self._safety_mode.answer = "Safetymode: FAULT"
69  else:
70  self._safety_mode.success = False
71 
72  def _set_robot_mode(self, mode):
73  self._robot_mode.success = True
74  if mode == "IDLE":
75  self._robot_mode.robot_mode.mode = RobotMode.IDLE
76  self._robot_mode.answer = "Robotmode: IDLE"
77  elif mode == "POWER_OFF" or mode == "STOPPED":
78  self._robot_mode.robot_mode.mode = RobotMode.POWER_OFF
79  self._robot_mode.answer = "Robotmode: POWER_OFF"
80  elif mode == "RUNNING":
81  self._robot_mode.robot_mode.mode = RobotMode.RUNNING
82  self._robot_mode.answer = "Robotmode: RUNNING"
83  else:
84  self._robot_mode.success = False
85 
86  def _set_program_running(self, running):
87  self._program_running.success = True
88  if running:
89  self._program_running.program_running = True
90  self._program_running.answer = "RUNNING"
91  else:
92  self._program_running.program_running = False
93  self._program_running.answer = "STOPPED"
94 
95  def get_robot_mode(self):
96  return self._robot_mode
97 
98  def get_safety_mode(self):
99  return self._safety_mode
100 
102  return self._program_running
103 
104  def get_program_state(self):
105  return self._program_state
106 
107  def restart_safety(self):
108  self._set_safety_mode('NORMAL')
109  self._set_robot_mode('POWER_OFF')
110  self._set_program_running(False)
111  self._reboot_required = False
112 
113  def power_on(self):
114  if self._e_stop_active:
115  self.emergency_stop()
116  return
117  self._set_safety_mode('NORMAL')
118  self._set_robot_mode('IDLE')
119  self._set_program_running(False)
120 
121  def brake_release(self):
122  if self._e_stop_active:
123  self.emergency_stop()
124  return
125  if not self._reboot_required:
126  self._set_safety_mode('NORMAL')
127  self._set_robot_mode('RUNNING')
128  self._set_program_running(False)
129  else:
130  self.fault()
131 
133  self._set_safety_mode('NORMAL')
134  self._set_robot_mode('RUNNING')
135  self._set_program_running(False)
136 
137  def power_off(self):
138  self._set_safety_mode('NORMAL')
139  self._set_robot_mode('POWER_OFF')
140  self._set_program_running(False)
141  self._reboot_required = False
142 
143  def protective_stop(self):
144  self._set_safety_mode('PROTECTIVE_STOP')
145  self._set_robot_mode('RUNNING')
146  self._set_program_running(False)
147 
148  def check_e_stop(self):
149  return self._e_stop_active
150 
151  def emergency_stop(self, latch=True):
152  self._e_stop_active = latch
153  if latch:
154  self._set_safety_mode('ROBOT_EMERGENCY_STOP')
155  self._set_robot_mode('IDLE')
156  self._set_program_running(False)
157  self._reboot_required = True
158  self._publish_safety_mode(True)
159  else:
160  self._set_safety_mode('NORMAL')
161  self._set_robot_mode('IDLE')
162  self._set_program_running(False)
163  self._reboot_required = True
164  self._publish_safety_mode(False)
165 
167  if self._e_stop_active:
168  self.emergency_stop()
169  return
170  if (self.get_safety_mode().safety_mode.mode == SafetyMode.NORMAL and
171  self.get_robot_mode().robot_mode.mode == RobotMode.RUNNING):
172  self._set_program_running(True)
173  else:
174  self._set_program_running(False)
175 
176  def fault(self):
177  self._set_safety_mode('FAULT')
178  self._set_robot_mode('STOPPED')
179  self._set_program_running(False)
180 
181 
182 class MockUrRobotHW(object):
183  def __init__(self, side='right'):
184  if 'left' not in side and 'right' not in side:
185  rospy.logerr("side: %s not valid. Valid sides are: 'left, 'right'", side)
186  raise IllegalArgumentError
187  self._arm_prefix = side[0] + 'a'
189  get_safety_mode_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/get_safety_mode',
190  GetSafetyMode, self.handle_get_safety_mode)
191  get_robot_mode_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/get_robot_mode',
192  GetRobotMode, self.handle_get_robot_mode)
193  is_program_running = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/program_running',
194  IsProgramRunning, self.handle_is_program_running)
195  load_program_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/load',
196  Load, self.handle_load_program)
197  program_state_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/program_state',
198  GetProgramState, self.handle_get_program_state)
199  power_on_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/power_on',
200  Trigger, self.handle_power_on)
201  power_off_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/power_off',
202  Trigger, self.handle_power_off)
203  brake_release_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/brake_release',
204  Trigger, self.handle_brake_release)
205  restart_safety_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/restart_safety',
206  Trigger, self.handle_restart_safety)
207  close_safety_popup_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/close_safety_popup',
208  Trigger, self.handle_close_safety_popup)
209  close_popup_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/dashboard/close_popup',
210  Trigger, self.handle_close_popup)
211  unlock_protective_stop_service = rospy.Service(self._arm_prefix +
212  '_sr_ur_robot_hw/dashboard/unlock_protective_stop',
213  Trigger, self.handle_unlock_protective_stop)
214  resend_robot_program_service = rospy.Service(self._arm_prefix + '_sr_ur_robot_hw/resend_robot_program',
215  Trigger, self.handle_resend_robot_program)
216 
217  def reinitialize(self):
218  self.robot_state = ArmState(self._arm_prefix)
219 
220  def handle_get_safety_mode(self, request):
221  return self.robot_state.get_safety_mode()
222 
223  def handle_get_program_state(self, request):
224  return self.robot_state.get_program_state()
225 
226  def handle_get_robot_mode(self, request):
227  return self.robot_state.get_robot_mode()
228 
229  def handle_load_program(self, request):
230  response = LoadResponse()
231  rospy.loginfo("Loading: %s", request.filename)
232  response.answer = request.filename
233  response.success = True
234  return response
235 
236  def handle_is_program_running(self, request):
237  return self.robot_state.get_program_running()
238 
239  def handle_close_popup(self, request):
240  return self.trigger_response()
241 
242  def handle_close_safety_popup(self, request):
243  return self.trigger_response()
244 
245  def trigger_response(self):
246  response = TriggerResponse()
247  response.success = True
248  response.message = "Testing"
249  return response
250 
251  def handle_power_on(self, request):
252  self.robot_state.power_on()
253  return self.trigger_response()
254 
255  def handle_power_off(self, request):
256  self.robot_state.power_off()
257  return self.trigger_response()
258 
259  def handle_brake_release(self, request):
260  self.robot_state.brake_release()
261  return self.trigger_response()
262 
263  def handle_restart_safety(self, request):
264  self.robot_state.restart_safety()
265  return self.trigger_response()
266 
267  def handle_unlock_protective_stop(self, request):
268  self.robot_state.unlock_protective_stop()
269  return self.trigger_response()
270 
271  def handle_resend_robot_program(self, request):
272  self.robot_state.resend_robot_program()
273  return self.trigger_response()
274 
275  def set_fault(self):
276  self.robot_state.fault()
277  return self.trigger_response()


sr_robot_launch
Author(s): Kirsty Ellis
autogenerated on Mon Feb 28 2022 23:52:26