From 3fc1f48737b22cbbb5731c4d87d280dbbd587969 Mon Sep 17 00:00:00 2001 From: Eitan Marder-Eppstein Date: Mon, 24 Jan 2022 11:33:41 -0800 Subject: [PATCH 1/3] Wait for both terminal status and result before marking a goal as finished --- src/roslibpy/actionlib.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/roslibpy/actionlib.py b/src/roslibpy/actionlib.py index a18ffc7..5f5dbb9 100644 --- a/src/roslibpy/actionlib.py +++ b/src/roslibpy/actionlib.py @@ -150,14 +150,22 @@ def _trigger_timeout(self): def _set_status(self, status): self.status = status + if self.is_finished: + self.wait_result.set() def _set_result(self, result): self.result = result - self.wait_result.set() + if self.is_finished: + self.wait_result.set() def _set_feedback(self, feedback): self.feedback = feedback + @property + def is_active(self): + return (self.status['status'] == GoalStatus.ACTIVE or + self.status['status'] == GoalStatus.PENDING) + @property def is_finished(self): """Indicate if the goal is finished or not. @@ -165,7 +173,7 @@ def is_finished(self): Returns: bool: True if finished, False otherwise. """ - return self.result is not None + return self.result is not None and not self.is_active class ActionClient(EventEmitterMixin): From ea06b3297b137ecfef0009dc31bf340c11a2411d Mon Sep 17 00:00:00 2001 From: Eitan Marder-Eppstein Date: Mon, 24 Jan 2022 11:57:18 -0800 Subject: [PATCH 2/3] One source of truth for status --- src/roslibpy/actionlib.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/roslibpy/actionlib.py b/src/roslibpy/actionlib.py index 5f5dbb9..76517b8 100644 --- a/src/roslibpy/actionlib.py +++ b/src/roslibpy/actionlib.py @@ -120,6 +120,8 @@ def send(self, result_callback=None, timeout=None): if result_callback: self.on('result', result_callback) + self.status = {'status': GoalStatus.PENDING} + self.action_client.goal_topic.publish(self.goal_message) if timeout: self.action_client.ros.call_later(timeout, self._trigger_timeout) @@ -163,6 +165,8 @@ def _set_feedback(self, feedback): @property def is_active(self): + if self.status is None: + return False return (self.status['status'] == GoalStatus.ACTIVE or self.status['status'] == GoalStatus.PENDING) @@ -244,7 +248,6 @@ def _on_feedback_message(self, message): goal = self.goals.get(goal_id, None) if goal: - goal.emit('status', message['status']) goal.emit('feedback', message['feedback']) def _on_result_message(self, message): @@ -252,7 +255,6 @@ def _on_result_message(self, message): goal = self.goals.get(goal_id, None) if goal: - goal.emit('status', message['status']) goal.emit('result', message['result']) def add_goal(self, goal): From 4c9e5991cea3dbeb99c3d5a7ff54c1c125136ebc Mon Sep 17 00:00:00 2001 From: Eitan Marder-Eppstein Date: Mon, 24 Jan 2022 11:57:26 -0800 Subject: [PATCH 3/3] Update changelog --- CHANGELOG.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4dd5d22..490b357 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -18,6 +18,9 @@ Unreleased **Fixed** +* Fixed #87 where a goal could be marked as terminal on result alone rather + than both result and status. + **Deprecated** **Removed**