Skip to content

Commit 78e9b6f

Browse files
committed
Wait for IO controller before checking IOs
1 parent 19b4787 commit 78e9b6f

File tree

1 file changed

+34
-20
lines changed

1 file changed

+34
-20
lines changed

ur_robot_driver/test/urscript_interface.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
Load,
5656
)
5757
from ur_msgs.msg import IOStates
58+
from controller_manager_msgs.srv import ListControllers
5859

5960

6061
ROBOT_IP = "192.168.56.101"
@@ -156,27 +157,28 @@ def init_robot(self):
156157

157158
# Connect to all other expected services
158159
dashboard_interfaces = {
159-
"power_off": Trigger,
160-
"brake_release": Trigger,
161-
"unlock_protective_stop": Trigger,
162-
"restart_safety": Trigger,
163-
"get_robot_mode": GetRobotMode,
164-
"load_installation": Load,
165-
"load_program": Load,
166-
"close_popup": Trigger,
167-
"get_loaded_program": GetLoadedProgram,
168-
"program_state": GetProgramState,
169-
"program_running": IsProgramRunning,
170-
"play": Trigger,
171-
"stop": Trigger,
160+
"/dashboard_client/power_off": Trigger,
161+
"/dashboard_client/brake_release": Trigger,
162+
"/dashboard_client/unlock_protective_stop": Trigger,
163+
"/dashboard_client/restart_safety": Trigger,
164+
"/dashboard_client/get_robot_mode": GetRobotMode,
165+
"/dashboard_client/load_installation": Load,
166+
"/dashboard_client/load_program": Load,
167+
"/dashboard_client/close_popup": Trigger,
168+
"/dashboard_client/get_loaded_program": GetLoadedProgram,
169+
"/dashboard_client/program_state": GetProgramState,
170+
"/dashboard_client/program_running": IsProgramRunning,
171+
"/dashboard_client/play": Trigger,
172+
"/dashboard_client/stop": Trigger,
173+
"/controller_manager/list_controllers": ListControllers,
172174
}
173-
self.dashboard_clients = {
174-
srv_name: waitForService(self.node, f"/dashboard_client/{srv_name}", srv_type)
175+
self.service_clients = {
176+
srv_name: waitForService(self.node, f"{srv_name}", srv_type)
175177
for (srv_name, srv_type) in dashboard_interfaces.items()
176178
}
177179

178180
# Add first client to dict
179-
self.dashboard_clients["power_on"] = power_on_client
181+
self.service_clients["/dashboard_client/power_on"] = power_on_client
180182

181183
self.urscript_pub = self.node.create_publisher(
182184
StringMsg, "/urscript_interface/script_command", 1
@@ -185,8 +187,19 @@ def init_robot(self):
185187
def setUp(self):
186188
# Start robot
187189
empty_req = Trigger.Request()
188-
self.dashboard_call("power_on", empty_req)
189-
self.dashboard_call("brake_release", empty_req)
190+
self.call_service("/dashboard_client/power_on", empty_req)
191+
self.call_service("/dashboard_client/brake_release", empty_req)
192+
193+
io_controller_running = False
194+
195+
while not io_controller_running:
196+
time.sleep(1)
197+
response = self.call_service(
198+
"/controller_manager/list_controllers", ListControllers.Request()
199+
)
200+
for controller in response.controller:
201+
if controller.name == "io_and_status_controller":
202+
io_controller_running = controller.state == "active"
190203

191204
def test_set_io(self):
192205
"""Test setting an IO using a direct program call."""
@@ -242,11 +255,12 @@ def check_pin_states(self, pins, states):
242255
if self.io_msg is not None:
243256
for i, pin_id in enumerate(pins):
244257
pin_states[i] = self.io_msg.digital_out_states[pin_id].state
258+
self.assertIsNotNone(self.io_msg, "Did not receive an IO state in requested time.")
245259
self.assertEqual(pin_states, states)
246260

247-
def dashboard_call(self, srv_name, request):
261+
def call_service(self, srv_name, request):
248262
self.node.get_logger().info(f"Calling service '{srv_name}' with request {request}")
249-
future = self.dashboard_clients[srv_name].call_async(request)
263+
future = self.service_clients[srv_name].call_async(request)
250264
rclpy.spin_until_future_complete(self.node, future)
251265
if future.result() is not None:
252266
self.node.get_logger().info(f"Received result {future.result()}")

0 commit comments

Comments
 (0)