ROS订阅节点接收到指定消息时如何终止rospy.spin()循环?
问题解答
rospy.spin() 本质是阻塞等待ROS回调触发的死循环,默认仅在节点收到关闭信号时才会退出。要根据接收的消息主动跳出循环,有两种常用的简单实现方案:
方案1:直接调用rospy.signal_shutdown()终止节点
这是最简实现,触发后会直接终止rospy.spin(),执行后续代码:
import rospy # 此处消息类型可根据实际场景替换,示例用std_msgs/String from std_msgs.msg import String def callback(msg): # 收到符合终止条件的消息时,调用shutdown方法 if msg.data == "FINISH": # 括号内为关闭原因的自定义说明 rospy.signal_shutdown("收到终止指令,退出spin循环") rospy.init_node('the_node', anonymous=True) sub = rospy.Subscriber('message', String, callback) rospy.spin() print("spin was broken")
注意:该方法会直接停止整个节点的所有ROS功能(订阅、发布等),如果退出循环后还需要调用ROS相关接口,不要用这个方案。
方案2:自定义循环替代rospy.spin(),配合标志位控制
如果不需要终止节点,退出后还要继续执行ROS相关操作,用这个方案:
import rospy from std_msgs.msg import String # 定义全局退出标志 exit_flag = False def callback(msg): global exit_flag # 满足终止条件时修改标志位 if msg.data == "FINISH": exit_flag = True rospy.loginfo("收到终止指令,准备退出循环") rospy.init_node('the_node', anonymous=True) sub = rospy.Subscriber('message', String, callback) # 自定义循环等价于rospy.spin(),新增标志位判断 while not rospy.is_shutdown() and not exit_flag: rospy.sleep(0.1) # 休眠避免占满CPU,间隔可按需调整 print("spin was broken") # 此处可继续执行其他逻辑,包括ROS发布、参数读取等操作
如果使用Image类型消息,只需要把msg.data == "FINISH"的判断逻辑替换为你自己的图像内容判断规则即可。
内容的提问来源于stack exchange,提问作者KansaiRobot
相关产品推荐
相关产品推荐

