actionlib.SimpleActionClient.cancel_all_goals 会阻塞直到完成吗?
Will actionlib.SimpleActionClient.cancel_all_goals block until completion?
假设我有以下内容:
action_client.cancel_all_goals()
print(action_client.get_status() != 'ACTIVE')
以上是否保证每次都打印True
?
换句话说,SimpleActionClient.cancel_all_goals()
是在返回前取消所有目标,还是只是发送指令到
不等目标真正取消就取消目标?
action_client.cancel_all_goals()
直接发送取消目标指令,无需等待.
由于该方法的文档不是很有帮助,您需要查看 action_client.h or action_client.py 以了解发生了什么。
代码显示要取消所有目标,只发布一条简单消息(self.pub_cancel.publish(cancel_msg)
或 self.pub_cancel.publish(cancel_msg)
)。这意味着调用是异步的,不会阻塞。
这意味着您的代码
action_client.cancel_all_goals()
print(action_client.get_status() != 'ACTIVE')
通常会打印 False
,但这 不能保证 因为:
- 客户可能已经
PREEMPTED
、ABORTED
、... 之前
- ROS 不是确定性的,这意味着理论上客户端 可以 由于线程切换而在
cancel_all_goals
和 get_status
的调用之间被取消。
假设我有以下内容:
action_client.cancel_all_goals()
print(action_client.get_status() != 'ACTIVE')
以上是否保证每次都打印True
?
换句话说,SimpleActionClient.cancel_all_goals()
是在返回前取消所有目标,还是只是发送指令到
不等目标真正取消就取消目标?
action_client.cancel_all_goals()
直接发送取消目标指令,无需等待.
由于该方法的文档不是很有帮助,您需要查看 action_client.h or action_client.py 以了解发生了什么。
代码显示要取消所有目标,只发布一条简单消息(self.pub_cancel.publish(cancel_msg)
或 self.pub_cancel.publish(cancel_msg)
)。这意味着调用是异步的,不会阻塞。
这意味着您的代码
action_client.cancel_all_goals()
print(action_client.get_status() != 'ACTIVE')
通常会打印 False
,但这 不能保证 因为:
- 客户可能已经
PREEMPTED
、ABORTED
、... 之前 - ROS 不是确定性的,这意味着理论上客户端 可以 由于线程切换而在
cancel_all_goals
和get_status
的调用之间被取消。