Skip to content

Commit 76debda

Browse files
committed
Wait for service and improve cancellation logic
1 parent 8dd96ea commit 76debda

File tree

3 files changed

+8
-13
lines changed

3 files changed

+8
-13
lines changed

rosbridge_library/src/rosbridge_library/capabilities/send_action_goal.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,6 @@ def cancel_action_goal(self, message):
143143
if client_handler.send_goal_helper is not None:
144144
client_handler.send_goal_helper.cancel_goal()
145145

146-
outgoing_message = {
147-
"op": "action_result",
148-
"action": action,
149-
"result": False,
150-
}
151-
if cid is not None:
152-
outgoing_message["id"] = cid
153-
# TODO: fragmentation, compression
154-
self.protocol.send(outgoing_message)
155-
156146
def _success(self, cid, action, fragment_size, compression, message):
157147
outgoing_message = {
158148
"op": "action_result",

rosbridge_library/src/rosbridge_library/internal/actions.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,11 @@ def args_to_action_goal_instance(action, inst, args):
128128
class SendGoal:
129129
"""Helper class to send action goals."""
130130

131-
def __init__(self, sleep_time=0.001):
131+
def __init__(self, server_timeout_time=1.0, sleep_time=0.001):
132+
self.server_timeout_time = server_timeout_time
132133
self.sleep_time = sleep_time
133134
self.goal_handle = None
135+
self.goal_canceled = False
134136

135137
def get_result_cb(self, future):
136138
self.result = future.result()
@@ -153,10 +155,11 @@ def send_goal(self, node_handle, action, action_type, args=None, feedback_cb=Non
153155

154156
self.result = None
155157
client = ActionClient(node_handle, action_class, action_name)
158+
client.wait_for_server(timeout_sec=self.server_timeout_time)
156159
send_goal_future = client.send_goal_async(inst, feedback_callback=feedback_cb)
157160
send_goal_future.add_done_callback(self.goal_response_cb)
158161

159-
while self.result is None:
162+
while self.result is None and not self.goal_canceled:
160163
time.sleep(self.sleep_time)
161164

162165
client.destroy()
@@ -175,3 +178,4 @@ def cancel_goal(self):
175178
cancel_goal_future = self.goal_handle.cancel_goal_async()
176179
while not cancel_goal_future.done():
177180
time.sleep(self.sleep_time)
181+
self.goal_canceled = True

rosbridge_library/src/rosbridge_library/internal/services.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def args_to_service_request_instance(service, inst, args):
101101
populate_instance(msg, inst)
102102

103103

104-
def call_service(node_handle, service, args=None, sleep_time=0.001):
104+
def call_service(node_handle, service, args=None, server_timeout_time=1.0, sleep_time=0.001):
105105
# Given the service name, fetch the type and class of the service,
106106
# and a request instance
107107
service = expand_topic_name(service, node_handle.get_name(), node_handle.get_namespace())
@@ -124,6 +124,7 @@ def call_service(node_handle, service, args=None, sleep_time=0.001):
124124
client = node_handle.create_client(
125125
service_class, service, callback_group=ReentrantCallbackGroup()
126126
)
127+
client.wait_for_service(server_timeout_time)
127128

128129
future = client.call_async(inst)
129130
while rclpy.ok() and not future.done():

0 commit comments

Comments
 (0)