You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:30:00