17 from std_msgs.msg
import Bool
18 from ur_dashboard_msgs.srv
import GetSafetyMode, GetProgramState, GetRobotMode, Load, IsProgramRunning
19 from ur_dashboard_msgs.msg
import SafetyMode, ProgramState, RobotMode
20 from std_srvs.srv
import Trigger
25 topic_string =
'/' + name +
'_sr_ur_robot_hw/safety_mode' 38 if message.mode == SafetyMode.ROBOT_EMERGENCY_STOP:
46 if rospy.has_param(
'ra_sr_ur_robot_hw'):
47 self.
_arms.append(
'ra')
48 if rospy.has_param(
'la_sr_ur_robot_hw'):
49 self.
_arms.append(
'la')
50 if 0 == len(self.
_arms):
51 rospy.logerr(
"No arms detected, shutting down %s", rospy.get_name())
52 rospy.signal_shutdown(
"No arms detected")
58 for arm
in self.
_arms:
72 def call_arm_service(self, side, service_name, service_type, dashboard=True, service_data=""):
74 service_string =
"/" + side +
"_sr_ur_robot_hw/dashboard/" + service_name
76 service_string =
"/" + side +
"_sr_ur_robot_hw/" + service_name
78 service_call = rospy.ServiceProxy(service_string, service_type)
79 if "" == service_data:
80 response = service_call()
82 response = service_call(service_data)
84 except rospy.ServiceException
as e:
85 rospy.logerr(
"Service call to '%s' failed for arm %s. %s", service_name, side, e)
91 for arm
in self.
_arms:
94 for arm
in self.
_arms:
99 now = rospy.rostime.Time().now().secs
101 if rospy.rostime.Time().now().secs > now + timeout:
106 if mode_type ==
'robot':
108 GetRobotMode).robot_mode.mode
for arm
in self.
_arms]
109 elif mode_type ==
'safety':
111 GetSafetyMode).safety_mode.mode
for arm
in self.
_arms]
112 return all(arms_ready)
115 for arm
in self.
_arms:
118 if SafetyMode.ROBOT_EMERGENCY_STOP == safety_mode.safety_mode.mode:
119 while SafetyMode.ROBOT_EMERGENCY_STOP == \
120 self.
call_arm_service(arm,
"get_safety_mode", GetSafetyMode).safety_mode.mode:
121 rospy.logwarn(
"Emergency stop button is still pressed for arm %s, please release", arm)
123 rospy.loginfo(
"Past E-stop detected on arm %s, power-cycling that arm...", arm)
129 for arm
in self.
_arms:
131 if SafetyMode.PROTECTIVE_STOP == safety_mode.safety_mode.mode:
132 rospy.loginfo(
"Protective stop detected on: %s. Unlocking...", arm)
133 while SafetyMode.PROTECTIVE_STOP == \
134 self.
call_arm_service(arm,
"get_safety_mode", GetSafetyMode).safety_mode.mode:
140 for arm
in self.
_arms:
142 if (SafetyMode.FAULT == safety_mode.safety_mode.mode
or 143 SafetyMode.VIOLATION == safety_mode.safety_mode.mode):
145 if SafetyMode.FAULT == safety_mode.safety_mode.mode:
146 rospy.loginfo(
"Fault detected on: %s. This can be caused by using the external e-stop.\ 147 Have you released it?", arm)
152 for arm
in self.
_arms:
155 program_running = self.
call_arm_service(arm,
"program_running", IsProgramRunning)
156 if (RobotMode.IDLE == robot_mode.robot_mode.mode
or RobotMode.POWER_OFF == robot_mode.robot_mode.mode
or 157 SafetyMode.PROTECTIVE_STOP == safety_mode.safety_mode.mode
or 158 not program_running.program_running):
159 rospy.loginfo(
"Starting arm: %s", arm)
164 for arm
in self.
_arms:
166 for arm
in self.
_arms:
171 for arm
in self.
_arms:
173 headless_mode = rospy.get_param(
"/" + arm +
"_sr_ur_robot_hw/headless_mode")
175 headless_mode =
False 176 if not headless_mode:
178 if "null" == play_msg.program_name:
179 rospy.loginfo(
"Not in headless mode. Loading program: %s for arm: %s",
183 rospy.loginfo(
"%s", resp)
189 for arm
in self.
_arms:
191 headless_mode = rospy.get_param(
"/" + arm +
"_sr_ur_robot_hw/headless_mode")
193 headless_mode =
False 194 if not headless_mode:
196 if ProgramState.STOPPED == play_msg.state.state
or ProgramState.PAUSED == play_msg.state.state:
197 rospy.loginfo(
"Not in headless mode. Starting program: %s for arm: %s",
198 play_msg.program_name, arm)
202 rospy.loginfo(
"Headless mode active, resending robot program to arm: %s", arm)
203 self.
call_arm_service(arm,
"resend_robot_program", Trigger, dashboard=
False)
204 self.
call_arm_service(arm,
"resend_robot_program", Trigger, dashboard=
False)
210 rospy.loginfo(
"Unlock arm(s) signal received. Checking arms.")
211 rospy.loginfo(
"Checking e-stops ...")
213 rospy.loginfo(
"Checking protective stops ...")
215 rospy.loginfo(
"Checking for faults ...")
217 rospy.loginfo(
"Resetting robot safety, please wait approximately 15 seconds...")
219 rospy.loginfo(
"Checking protective stops again ...")
221 rospy.loginfo(
"Closing popups ...")
223 rospy.loginfo(
"Checking robot mode ...")
226 rospy.loginfo(
"Checking if program is loaded ...")
228 rospy.loginfo(
"Checking if program is running ...")
230 except rospy.ServiceException
as e:
231 for arm
in self.
_arms:
232 rospy.logerr(
"Arm checking/restarting failed for arm: %s. %s", arm, e)
235 rospy.loginfo(
"Brake arm signal received.")
236 for arm
in self.
_arms:
239 except rospy.ServiceException
as e:
240 rospy.logerr(
"Arm braking failed for arm: %s. %s", arm, e)
def unlock_arms_if_fault(self)
def _safety_mode_callback(self, message)
_external_control_program_name
def call_arm_service(self, side, service_name, service_type, dashboard=True, service_data="")
def start_arms_program_if_stopped(self)
def setup_robot_mode_subscribers(self)
def is_robot_in_mode(self, mode_type, mode)
def clear_arms_popups(self)
def load_arms_program_if_unloaded(self)
def release_or_brake_arm_cb(self, message)
def check_arms_e_stops(self)
def wait_for_mode(self, mode_type, mode, timeout=15)
def check_arms_needs_starting(self)
def unlock_arms_if_protective_stop(self)