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,但这 不能保证 因为:

  • 客户可能已经 PREEMPTEDABORTED、... 之前
  • ROS 不是确定性的,这意味着理论上客户端 可以 由于线程切换而在 cancel_all_goalsget_status 的调用之间被取消。